服务器发送数据代码如下:(当连接第二个客户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 ... ");
}
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 ... ");
}
所以第二次锁定会失败,第三次干脆就死了你如果真的想发送同一段数据到几个客户端,那就copy 几份把
http://topic.csdn.net/u/20111024/11/9e5180b4-9590-4ee0-9312-778c48be81a0.html?seed=2035811007&r=76142424#r_76142424