读书人

求救关于socket侦听解决方案

发布时间: 2012-01-30 21:15:58 作者: rapoo

求救,关于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记录什么的
[解决办法]
如果监听程序放在局域网的机器上,并通过代理上网,怎样才能穿越代理监听公网信息

读书人网 >C#

热点推荐