Socket服务器,第二个客户端发送信息,但服务端只会接收第一条信息,再发就不接收了

mtcbhsw 2018-08-13 10:44:19
我写的异步Socket服务器的问题,只能按收第一个客户端发送过来的数据(第一个客户端收发正常),
第二个客户端发送信息,但服务端只会接收第一条信息,再发就不接收了,其它都正常。后面加入的客户也跟第二个一样

private void StartSocketListen()//开始监听连接,为了大神看代码少辛苦点,省了一些。
{
while (true)//开始监听连接,为了大神看代码少辛苦点,省了一些。
{

//开始准备接入新的连接,一旦有新连接尝试则调用回调函数AcceptCallback
server.BeginAccept(new AsyncCallback(AcceptCallback), server);
// Wait until a connection is made before continuing.
connectDone.WaitOne();

}
}

private void AcceptCallback(IAsyncResult iar)
{
string str = string.Empty;
// Get the socket that handles the client request.
//还原传入的原始套接字
Socket server = (Socket)iar.AsyncState;
//在原始套接字上调用EndAccept方法,返回新的套接字
Socket handler = server.EndAccept(iar);
StateObject state = new StateObject();
state.WorkSocket = handler;
IPEndPoint clientip = (IPEndPoint)handler.RemoteEndPoint;
socketClientFlag = true;
//一个客户端连接完成,释放connectDone阻塞,以便于服务器接受下一个接入请求
connectDone.Set();
while (true)
{
//我的问题就在这里
//下面这段接收数据,如果用递归调用就没问题(在ReceiveCallback最后一行BeginReceive)
//我这里是用一个循环,以为本接收数据指令发出,循环被阻塞(receiveDone.waiteOne),直到有数据发送过来,
// 阻塞打开(receiveDone.set),执行下一个循环接收新的数据。
//好象理论上行得通,而且第一个接进来的客户端与服务器通讯也正常,
//但第二个客户端发信息,服务器就只能接收到第一个,以后的就不接收。后面接进来的客户也跟第二个客户一样
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
receiveDone.WaitOne();
}
}
...全文
503 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2018-08-16
  • 打赏
  • 举报
回复
楼上大神都说过了,
问题就出在:
异步回调里面不能用while这一类
同步处理的方式

  • 打赏
  • 举报
回复
只要你脑子里没有阻塞的思路,一切(真正该怎样设计算法流程)就都迎刃而解。
xuzuning 2018-08-16
  • 打赏
  • 举报
回复
异步操作不需要 while 循环,同步操作才需要
stherix 2018-08-15
  • 打赏
  • 举报
回复
server.BeginAccept,handler.BeginReceive前后的while(true)和WaitOne都是不需要的
一个异步接收,为何还要用循环和Wait?

110,537

社区成员

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

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

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