写了个服务器端的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);
}
}
}请问如何处理这个问题。如果在客户端异常关闭以后让服务器端正常运行。谢谢各位大大。
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);
}
}
}请问如何处理这个问题。如果在客户端异常关闭以后让服务器端正常运行。谢谢各位大大。
解决方案 »
- 一个奇怪的问题
- 基本概念问题
- 未将对象引用设置到对象的实例的错误
- 关于违约金的
- 如果将.net framework 2.0 与安装程序一起打包
- VS2005 Pro里面找不到可以对office开发的工程,咋回事??
- C#里怎么实现“只读引用”啊?
- C# 在线等待TeeChart曲线 图,鼠标单击获取 坐标,急
- 怎样实现呢?vs2003中怎样实现一个用户只能一天只能申领一次??
- 如果remoting的服务端和客房端不在一台机器上,而都需要访问一个dll。那该dll应放在什么地方?
- 我在vs2003中制作一个显示条形统计图的控件,想把它做成具有数据绑定功能的,请问应该怎样做呢?
- 关于socket监听的问题
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.Dispose();
recv = ServerSocket.ReceiveFrom(data, ref tempRemoteEP);
这里加TRY CATCH,然后不处理就行了。...细一点就先看下是否可接收,如果连接已断,则视为客户段已断线,然后关闭SOCKET,删SOCKET记录什么的