服务器发送数据代码如下:(当连接第二个客户SOCKET时,客户端收到数据不正常) //从头开始遍历 ;list中存储了用accept动态接收的新客户SOCKET.
list<SOCKET>::iterator iter ; int i = 1 ;  if   (PerIoData->BytesRECV   >   PerIoData->BytesSEND)   
{   //   Post   another   WSASend()   request.   
//   Since   WSASend()   is   not   gauranteed   to   send   all   of   the   bytes   requested,   
//   continue   posting   WSASend()   calls   until   all   received   bytes   are   sent.   
ZeroMemory(&(PerIoData->Overlapped),   sizeof(OVERLAPPED));   
PerIoData->DataBuf.buf   =   PerIoData->Buffer   +   PerIoData->BytesSEND;   
PerIoData->DataBuf.len   =   PerIoData->BytesRECV   -   PerIoData->BytesSEND;   
//为什么用下面这个LIST循环发送数据到2个客户端时,客户端收到数据不正确,全为0。连接第3个客户端时,服务器直接当机,为啥?
//一个客户端时数据收发都没问题,和没用这循环效果一样。而且删除循环语句可以连接多个客户端,这时客户只能收到自己发给服务器的数据。
//所以不用循环达不到我想要的:客户端收到所有其他客户的数据。用循环有出错。那位大侠帮个忙解决下!
for( iter = accept_socket_number.begin() ; iter != accept_socket_number.end() ; ++iter )
{ //循环 list   ;
printf("\n  iter %d %d ...",i,iter);  i ++ ; Sleep(200) ;
if   (WSASend((SOCKET)*iter ,   &(PerIoData->DataBuf),   1,   &SendBytes,   0,   &(PerIoData->Overlapped),   NULL)   ==   SOCKET_ERROR)   
{ //发送 ;  
if   (WSAGetLastError()   !=   ERROR_IO_PENDING)   
{   
printf("WSASend()   failed   with   error   %d\n",   WSAGetLastError());   
return   0;   
}   
}   printf("\n  Send data success ... ");    
}   

解决方案 »

  1.   

    WSASend 会锁定所提交的内存,直到发送完毕才会解锁
    所以第二次锁定会失败,第三次干脆就死了你如果真的想发送同一段数据到几个客户端,那就copy 几份把
      

  2.   

    说的有道理,因为WSASend只是投递一个发送的消息就返回了,可能内部实现这个发送的过程还需要一段时间,而你连续投递这个消息,所以就会有同时操作一块内存的可能,所以会出现问题
      

  3.   

    已回答在:
    http://topic.csdn.net/u/20111024/11/9e5180b4-9590-4ee0-9312-778c48be81a0.html?seed=2035811007&r=76142424#r_76142424