关于socket异步的一个怪异问题,遍历socket列表发送消息时必须sleep

niit_zc 2010-11-12 01:29:13
写了一个小的聊天软件,用哈希表clientSockets保存用户连接的socket,当有新用户登录时遍历clientSockets把用户列表发送到各个客户端。

foreach (DictionaryEntry de in clientSockets)
{
Socket workSocket = (Socket)de.Value;
System.Threading.Thread.Sleep(1);//????????????????????????
workSocket.Send(_mes, 0, _mes.Length, 0);
}

如上代码,必须加上System.Threading.Thread.Sleep(1);这句,否则只有第一个连接的客户端正常,其他客户端实际上也能连接到服务端,但接受不到任何信息,但发送的信息可以被服务端接收到。

服务端采用的是BeginAccept方法建立连接,如下
server.BeginAccept(new AsyncCallback(OnClientConnect), null);

public void OnClientConnect(IAsyncResult ar)
{
Socket _client = server.EndAccept(ar);
clientSockets.Add(_client.RemoteEndPoint.ToString(), _client);

byte[] mes = new byte[10000];
int rel = _client.Receive(mes);
ClientInfo tempClient = (ClientInfo)Serialize.Deserialize(mes, rel);
if (tempClient.Headers == "join")
{
clients.Add(_client.RemoteEndPoint.ToString(), tempClient);
DataStruct pocket = new DataStruct();
pocket.Headers = "join";
pocket.HostIP = tempClient.HostIP;
pocket.Message = clients;
byte[] _mes = Serialize.serialize(pocket);
foreach (DictionaryEntry de in clientSockets)
{
Socket workSocket = (Socket)de.Value;
System.Threading.Thread.Sleep(1);//????????????????????????
workSocket.Send(_mes, 0, _mes.Length, 0);
}
}
tempClient.Message = new byte[10000];
_client.BeginReceive(tempClient.Message, 0, tempClient.Message.Length, 0, new AsyncCallback(RecieveCallBack), _client);

server.BeginAccept(new AsyncCallback(OnClientConnect), null);
}


有谁能解释一下?
...全文
219 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
niit_zc 2011-04-01
  • 打赏
  • 举报
回复
也顶 ! 的所得税vdsvdsvds热歌如果热天个人股
三岁、就很帅 2010-11-12
  • 打赏
  • 举报
回复
帮顶 接分 - -

111,129

社区成员

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

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

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