socket服务端中。
某些socket连接进来的时候,发现远程地址是空的。
//接受socket
bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
//获取远程地址
IPEndPoint remoteEnp = (IPEndPoint)e.AcceptSocket.RemoteEndPoint;
一个socket应该包含源地址、源端口、目的地址、目的端口,现在居然出现源地址、源端口缺失的情况,是什么问题导致的?
找到原因了,是ConnectionReset异常。
由于客户端良莠不齐,所以在服务端给ip设置了阈值,超过阈值时服务端主动关闭连接,这时候客户端还继续发送数据,就出现了这种情况
在连接进来时判断socket异常就行了
void AcceptEventArg_Completed(object sender, SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { try { ProcessAccept(e); } catch (Exception ex) { OperationError(ex, e.RemoteEndPoint, e.LastOperation); } } else { m_maxNumberAcceptedClients.Release(); StartAccept(e); } }
按道理无论是否连接等故障,一定不会缺失,起码都有默认值0,这是计算机基本原理和特性。除非你这里类型不对导致类型转换失败。
本来想再测试一下,发现没有这种情况了,冏,唯一修改了的地方就设置了lingertime 为0;之前看日志确实有空的情况,EndPoint转IPEndPoint应该也没问题。
https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.remoteendpoint.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 api中没有定义null的返回值的情况,是否是调用的时机等方面的原因