C# SOCKET 远程主机强制关闭现有的连接

小么呀小儿郎 2014-12-12 10:13:29
各位大神,我用SOCKET异步的方式,服务端的软件。结果运行的时候老是出现“远程主机强制关闭一个现有的连接”的问题。

代码如下:
protected virtual void AcceptConn(IAsyncResult iar)//服务端与客户端的连接函数
{
//如果服务器停止了服务,就不能再接收新的客户端
if (!_isRun)
{
return;
}

try
{
//接受一个客户端的连接请求
Socket oldserver = (Socket)iar.AsyncState;
Socket client = oldserver.EndAccept(iar);
StatusChange();

System.Timers.Timer timer3 = new System.Timers.Timer(240000);//实例化Timer类,设置时间间隔为4min
timer3.Elapsed += new System.Timers.ElapsedEventHandler(delegate { if (client.Connected) { CloseClient(client, Session.ExitType.NormalExit); }});//到达时间的时候执行
//timer3.Elapsed += new System.Timers.ElapsedEventHandler(delegate { StatusChange(); });//到达时间的时候执行
timer3.AutoReset = false;//设置是执行一次(false)还是一直执行(true)
timer3.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件


//客户端引用计数+1
_clientCount++;

int tempuserid = 0;
for (int hsn = 0; hsn <= checklistboxTable.Count; hsn++)
{
tempuserid++;//在1-30中任取一个随机数
if (!checklistboxTable.ContainsKey(tempuserid))
{
_userid = tempuserid;
break;
}
}

Session newSession = new Session(client);//新建一个客户端会话
// newSession.UserName = _userid;

_sessionTable.Add(newSession.ID, newSession);//存入hash表
checklistboxTable.Add(_userid, newSession.ID);




//开始接受来自该客户端的数据

client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), client);

//新的客户段连接,发出通知
if (ClientConn != null)//ClientConn为连接事件
{
ClientConn(this, new NetEventArgs(newSession));
}

//继续接受客户端

_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock);
}
catch (Exception exp)
{
MessageBox.Show("AcceptConn函数有误" + exp.Message);
_svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock);//这句不知道加上去对不对?
}


}
...全文
3945 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
全体起立 2014-12-14
  • 打赏
  • 举报
回复
帖子无法编辑。如果你确认不是网络问题,那么检查,服务端和第一个客户端建立连接后,是不是第二个客户端与服务端建立连接时,发生的这个错误。如果是,就检查服务端连接对象是否丢失。
全体起立 2014-12-14
  • 打赏
  • 举报
回复
刚才回复说跑题了。客户端总是收到服务端连接关闭的消息,有可能是服务器网络状况不稳定,经常会断开连接,一般来讲只要服务端和客户端建立监听,如果不是网络问题,是不会断的。
全体起立 2014-12-14
  • 打赏
  • 举报
回复
客户端如果异常断开,服务端如果这个时候向客户端发送数据,就会抛异常,这时候需要捕获异常并清理掉内存中列表保存的该客户端项,防止再次发送数据。 正常情况下,客户端如果没有向服务端发送数据,服务端要主动发送握手数据,监测客户端是否活跃,如果抛异常,就处理。 总之客户端的异常关闭,肯定要在服务端处理异常的,就是如何处理的问题了。
luhr 2014-12-14
  • 打赏
  • 举报
回复
引用 3 楼 PiggyZhu1024 的回复:
[quote=引用 1 楼 q3310017 的回复:] 断开连接的时候你应该去重新连接,你发的这个try的代码,断开连接在catch里面应该这样: try//楼主发的try代码 { } catch() { try { //递归调用 client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), client); } catch (Exception ex2)//连接不上,重新连接 { while (!ccdsocket.ccdSocket.Connected) { //重新连接并接收数据 ReConnect(); } } }
可能是客户端自己断开了连接。如果服务端发现客户端关闭了连接后,则忽略这个客户端,继续接受其他客户端的连接,这个该怎么弄?[/quote] 客户端主动断开和异常断开。。。怎么区分。。。我占个位置,我也想知道话说 我想起之前有人谈socket优雅的关闭连接方式,正常关闭是3次握手,那非正常就是进catch咯,这应该是个思路, @版主和各路大神
小么呀小儿郎 2014-12-13
  • 打赏
  • 举报
回复
引用 1 楼 q3310017 的回复:
断开连接的时候你应该去重新连接,你发的这个try的代码,断开连接在catch里面应该这样: try//楼主发的try代码 { } catch() { try { //递归调用 client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), client); } catch (Exception ex2)//连接不上,重新连接 { while (!ccdsocket.ccdSocket.Connected) { //重新连接并接收数据 ReConnect(); } } }
可能是客户端自己断开了连接。如果服务端发现客户端关闭了连接后,则忽略这个客户端,继续接受其他客户端的连接,这个该怎么弄?
  • 打赏
  • 举报
回复
贴出调试截屏画面,调试器应该直接终端在抛出异常的语句上。
luhr 2014-12-13
  • 打赏
  • 举报
回复
断开连接的时候你应该去重新连接,你发的这个try的代码,断开连接在catch里面应该这样: try//楼主发的try代码 { } catch() { try { //递归调用 client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveData), client); } catch (Exception ex2)//连接不上,重新连接 { while (!ccdsocket.ccdSocket.Connected) { //重新连接并接收数据 ReConnect(); } } }
luhr 2014-12-13
  • 打赏
  • 举报
回复
引用 4 楼 PiggyZhu1024 的回复:
引用 2 楼 sp1234 的回复:
贴出调试截屏画面,调试器应该直接终端在抛出异常的语句上。
就是一个弹窗,上面显示:AcceptConn函数有误远程主机前值关闭现有连接
楼主还没搞定啊,要么你就解决这个异常断开问题(我觉得2L要你贴截屏也是这个原因,你要给大家看代码和错误原因,还不是错误现象),但是异常断开你难道不做重新连接处理么?
小么呀小儿郎 2014-12-13
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
贴出调试截屏画面,调试器应该直接终端在抛出异常的语句上。
就是一个弹窗,上面显示:AcceptConn函数有误远程主机前值关闭现有连接

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧