关于c#的Socket异步网络编程问题

小夏中国 2014-04-14 08:58:54
小弟正在做一个关于socket,tcp异步的网络系统,服务器上的编程是这样的IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 12343); Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); listener.Bind(localEndPoint); listener.Listen(1000);上面是基础,下面是个线程 while (true) { allDone.Reset(); listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); allDone.WaitOne(); }当个有个连接的时候我到AcceptCallback这个回调函数里去设置allDone.set;一般情况下没有问题,但遇到特殊情况的时候还是问题不少的,比如回调函数AcceptCallback里不去设置allDone.set,也就是listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);只启动一次,客户端那边也能异步连接上,不报错,但服务器这边除了第一个客户连接会触发回调函数后面的就不会触发了,说明后面的客户端对于服务器来讲没连接上,但客户端那边确显示连接了,现在我手动在服务器上allDone.set之后,对于服务器来讲后面的客户端都连接不上了,就是不能执行到回调函数了,请问现在服务器是卡在哪个地方了。我通过怎么样的方式可以解决这样的问题! 因为客户端有重连机制,如果二个客户端刚在重启,我服务器断开之后也刚重启,二个或三个客户端会被同一个listener.BeginAccept接收,这样服务器肯定会出问题了 无论我怎么样allDone.set,当客户端连接的时候 不会到达回调函数那了
...全文
247 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2014-04-15
  • 打赏
  • 举报
回复
回调函数AcceptCallback中取得客户端连接后,必须设置allDone.set,否则无法侦听下一个啊。 allDone 最好是 AutoResetEvent ,把 allDone.Reset(); 放到循环前面去。
tcmakebest 2014-04-15
  • 打赏
  • 举报
回复
看到 while (true) 我以为是阻塞模式,但看到 BeginAccept 又是异步模式,allDone 又是要同步,我凌乱了。
小夏中国 2014-04-15
  • 打赏
  • 举报
回复
恩 我现在改过来了 基本上没有问题了,以前用while(true)给接收客户端开线程,然后在回调函数中用allDone.set这种方法有漏洞,如果同时有10个客户端同一时间连接服务器 服务器就出现问题了!我在直接在回调里用BeginAccept就没有问题了

110,533

社区成员

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

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

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