当前位置:编程学习 > C#/ASP.NET >>

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,