我们已经开发了一个小程序来分析使用System.Net.Sockets.Socket的flash应用程序的notwork包,它在大多数情况下工作正常,但我的一个客户端突然报告该应用程序不起作用。经过调查,发现她的工作站没有收到数据包。
我们程序的设计从Dns.GetHostEntry(Dns.GetHostName())。AddressList获取本地IP列表,然后监视每个ipAddress的流量,如下所示,
Socket monitor_Socket;
IPEndPoint ipe = new IPEndPoint(ipAddress, 0);
monitor_Socket = new Socket(ipe.AddressFamily, SocketType.Raw, System.Net.Sockets.ProtocolType.IP);
monitor_Socket.Bind(ipe);
monitor_Socket.IOControl(IOControlCode.ReceiveAll, BitConverter.GetBytes((int)1), null);
monitor_Socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(this.OnReceive), null);
数据包将在回调函数OnReceive中处理。
我们在办公室的几乎所有计算机上都进行了测试,它运行良好,我们无法猜测客户机器发生了什么。我们使用FiddlerCore创建一个小程序来捕获她工作站中的http数据包以验证闪存应用程序,它可以按预期捕获数据,这意味着通信正常。但是,它不能使用我们的应用程序捕获数据包,如上所述。她是一名电脑外行,她无法告诉我们她工作站的任何特殊设置。
在研究了msdn文件之后,似乎我们忽略了IOControl中的一些东西,而且我们不知道这是否是问题的原因。
根据msdn(https://msdn.microsoft.com/en-us/library/system.net.sockets.iocontrolcode.aspx)中的信息,ReceiveAll表示"启用接收网络上的所有IPv4数据包",是否意味着它不会接收IPv6数据包?
不幸的是,我们无法找到任何用于IPv6的IOControlCode。我们猜想如果她使用IPv6可能会出现问题。但是我们现在无法验证,在我们找到任何可能的解决方案之前,我们并不想打扰她。
我们想确认上面代码中的BeginReceive是否可以与IPv6一起使用。如果没有,我们如何使用Socket捕获IPv6数据包?如果这不是问题的原因,是否还有其他情况Socket无法捕获http数据包?
我们知道在这种情况下可以使用FildderCore,我们的第一个版本是使用FiddlerCore开发的。但不幸的是,由于FiddlerCore作为系统代理运行,如果应用程序崩溃将导致问题。无法恢复代理设置,并且所有网络通信都将失败。在这种情况下,很难让我们的客户记住如何恢复网络,他们无法通过网络获得我们的支持。因此,为了避免这种情况,我们决定在这种情况下不使用系统代理进行捕获。我们也希望我们的应用程序可以在没有第三方库的情况下完成。