读书人

socket send recv不同步有关问题

发布时间: 2012-08-28 12:37:01 作者: rapoo

socket send recv不同步问题
我的客户端发送循环程序:
for(list<int>::iterator iter = Index.begin();iter != Index.end();++iter)
{
_itoa_s(*iter,chKey,10);
if(send(m_socket,chKey,strlen(chKey)+1,0) == SOCKET_ERROR)
MessageBox(_T("发送失败"));
//Sleep(500);
}
服务器端循环接受程序:
list<int> query;
for(int i=0;i!=num;++i) //num是list<int>的元素个数
{
if(recv(m_Thread,bufRecv,100,0) == SOCKET_ERROR)
{
printf("接受发生错误");
return;
}
query.pushback(atoi(bufRecv));
}

单步调试程序没有问题。然后我在这两个循环的下面的语句上设置断点,F5,直接运行。服务器端一直是dos界面,说明recv等待接收数据,而客户端已经执行到断点处,说明send都执行完了。这应该是recv和send不同步。但不知道如何解决,请各位大神相助~~~~

[解决办法]
这个问题应该不是send和recv是否同步的问题。客户端程序的确是发送了num次,一次发送链表中的一个元素,但是服务器端的recv函数则是在满足两种条件之下的情况下返回:缓冲区满或者发生错误。对于你的例子,recv(m_Thread,bufRecv,100,0)应该在接收到100个字节后返回,但是这100个字节应该包含客户端多次调用send发送的数据,即服务器段循环一次,相当于客户端循环多次。这样做的后果就是客户端已经将所有元素发送完毕,但是服务器端仅仅循环了若干次后就将全部数据接收完毕,而这是的循环次数小于num,导致recv等待数据而数据又不到达的情况。
正确的做法一般是为服务器端和客户端之间的数据交互定义结构帧,如:
2字节元素个数|元素1|元素2|元素3|...|元素n
客户端按照该格式发送帧,服务器端则先读取2个字节,获取元素个数,然后继续读取相应长度的数据将元素解析出来,重复如此。
希望对你有所帮助。

读书人网 >C++

热点推荐