今天碰到的TCP通信中的一个问题,求教
客户端的连续两个send时,第2个send可能会出问题,服务端接受不到正确的信息,必须调用Sleep()。有没有别的方法?就像文件操作有fflush()之类的?
这是服务器端的:
char buffer[1024];//接受缓冲区
SOCKET client=(SOCKET)pvParam;
recv(client,buffer,64,0);//接受文件长度
ULONGLONG fileLen=_atoi64(buffer);
char fileName[255];
recv(client,fileName,255,0);//接受文件名
这是客户端:
char fileLenBuf[64];
_i64toa(fileLen,fileLenBuf,10); //把文件长度转换为字符串
send(server,fileLenBuf,strlen(fileLenBuf)+1,0); //发送文件长度
CString str=fileDlg.GetFileName();
char *fileName=(char*)(LPCTSTR)str;
Sleep(50); //wait 必须要SLEEP吗?
send(server,fileName,strlen(fileName)+1,0);//发送文件名
Sleep(50); //wait
问题表现为:不加Sleep()时,服务器端接受不到正确的文件名。
加了Sleep()后一切正常。。。。
求教,求教。。
[解决办法]
不sleep,第一次recv就把两次send的都收到了。你跟踪看看,第一次收的结果。
正确的做法是不用sleep的,但收发双方要有协议。不能假定一次send对应一次recv。
[解决办法]
楼上的正解,双方可以采用固定包大小的方法或利用首字节代表本次包的大小,我就是这么做的