首页新闻招聘找找看知识库

socket服务端程序问题

0
悬赏园豆:100 [已解决问题] 解决于 2018-05-18 11:19

socket服务端中。

某些socket连接进来的时候,发现远程地址是空的。

//接受socket

bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);

//获取远程地址

IPEndPoint remoteEnp = (IPEndPoint)e.AcceptSocket.RemoteEndPoint;

一个socket应该包含源地址、源端口、目的地址、目的端口,现在居然出现源地址、源端口缺失的情况,是什么问题导致的?

海之殇的主页 海之殇 | 菜鸟二级 | 园豆:351
提问于:2018-05-17 10:40
< >
分享
最佳答案
0

找到原因了,是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);
            } 
        }
海之殇 | 菜鸟二级 |园豆:351 | 2018-05-18 11:18
其他回答(2)
0

按道理无论是否连接等故障,一定不会缺失,起码都有默认值0,这是计算机基本原理和特性。除非你这里类型不对导致类型转换失败。

收获园豆:50
花飘水流兮 | 园豆:6088 (大侠五级) | 2018-05-17 12:32

本来想再测试一下,发现没有这种情况了,冏,唯一修改了的地方就设置了lingertime 为0;之前看日志确实有空的情况,EndPoint转IPEndPoint应该也没问题。

支持(0) 反对(0) 海之殇 | 园豆:351 (菜鸟二级) | 2018-05-17 13:44
0

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的返回值的情况,是否是调用的时机等方面的原因

收获园豆:50
2012 | 园豆:17527 (专家六级) | 2018-05-18 08:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册