C# socket中的IPPacketInformation
写程序,使用 ReceiveMessageFrom 方法,想得到收到的数据是来自哪个网卡的。msdn的文档中,View ColorizedCopy to Clipboard
public int ReceiveMessageFrom(
byte[] buffer,
int offset,
int size,
ref SocketFlags socketFlags,
ref EndPoint remoteEP,
out IPPacketInformation ipPacketInformation
)
IPPacketInformation中的信息,包含了数据包的一系列信息。
IPPacketInformation中,有个interface的属性,是一个整数,是网络适配器的索引。(可以这样得到所有的网络适配器 NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces())
现在的问题是,IPPacketInformation.interface = 12, 但是adapters数组的长度 是3,这样肯定不能访问,是数组越界。什么原因造成的这种情况?是C#的接口有bug吗,重启电脑也是不行。
--------------------编程问答-------------------- 第一个数据包可能会出错(因为那时候PacketInformation还没有开启),MSDN建议你在创建Socket后马上开启PacketInformation。(详见http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.receivemessagefrom.aspx)
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.GetSocketOption(SocketOptionLevel.IP, SocketOptionName.PacketInformation);
另,个人认为微软的这个设计很不专业(即某个调用得到一个整数,然后整数对应另外一个调用的具体位置)。两个操作并不是原子操作,理论上存在着结果对应不起来的悲惨结局。还不如直接用interface的GUID。
补充:.NET技术 , C#