首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求救,关于socket侦听解决方案

2012-01-30 
求救,关于socket侦听写了个服务器端的Listen,但是当客户端异常关闭的时候(线程被强行终止等),服务器的下次

求救,关于socket侦听
写了个服务器端的Listen,但是当客户端异常关闭的时候(线程被强行终止等),服务器的下次侦听就会产生异常An   existing   connection   was   forcibly   closed   by   the   remote   host。

System.Net.Sockets.SocketException:   An   existing   connection   was   forcibly   closed   by   the   remote   host
      at   System.Net.Sockets.Socket.ReceiveFrom(Byte[]   buffer,   Int32   offset,   Int32   size,   SocketFlags   socketFlags,   EndPoint&   remoteEP)
      at   System.Net.Sockets.Socket.ReceiveFrom(Byte[]   buffer,   EndPoint&   remoteEP)

代码如下
         
 
  private   void   Listen()
                {
                        try
                        {
                                while   (flag)
                                {
                                        int   recv   =   0;
                                        byte[]   data   =   new   byte[1024];
                                        IPEndPoint   sender   =   new   IPEndPoint(IPAddress.Any,   0);
                                        EndPoint   tempRemoteEP   =   sender   as   EndPoint;
                                        recv   =   ServerSocket.ReceiveFrom(data,   ref   tempRemoteEP);
                                        string   msgHead   =   Encoding.Unicode.GetString(data,   0,   4);
}
}
}

请问如何处理这个问题。如果在客户端异常关闭以后让服务器端正常运行。

谢谢各位大大。

[解决办法]
sender使用完后要关闭。不关闭资源未释放。
[解决办法]
int recv = 0;
byte[] data = new byte[1024];
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = sender as EndPoint;
recv = ServerSocket.ReceiveFrom(data, ref tempRemoteEP); // 估计这句是出错的地方
string msgHead = Encoding.Unicode.GetString(data, 0, 4);

分析一下,发现你没有看看客户端是否可以读数据(比如那时候客户端被终止),就直接开始读取数据,当然会有Exception,只要捕捉SocketException,然后相应处理,就可以了。
[解决办法]
记的关闭SOCKET端口
[解决办法]
Socket.Close();
Socket.Dispose();
[解决办法]
粗犷一点,就直接在
recv = ServerSocket.ReceiveFrom(data, ref tempRemoteEP);


这里加TRY CATCH,然后不处理就行了。...

细一点就先看下是否可接收,如果连接已断,则视为客户段已断线,然后关闭SOCKET,删SOCKET记录什么的
[解决办法]
如果监听程序放在局域网的机器上,并通过代理上网,怎样才能穿越代理监听公网信息

热点排行