socket编程 recv()问题

Iceboll 2013-04-22 07:22:48
用recv()接收数据时,总是出现如果后一次接收的数据小于前一次的,便出现前面是新的数据,然后新的数据后面却还接这前一次的数据,比如前一次接收的是“这是第一次的数据”,第二次接收的本应该是“第二次”,但是现实出来的却是“第二次一次的数据”,调试过发送过来的数据没问题,接收的是一个线程,代码如下:
DWORD WINAPI CChatClientDlg::recvThread(LPVOID lpparameter){
SOCKET srvSocket=((RECVPARAM *)lpparameter)->socket;
HWND hwnd=((RECVPARAM *)lpparameter)->hwnd;
delete lpparameter;
int ret=0;
char recvBuf[MAX_PATH];

//Receive message from server
while(true){
ret=recv(srvSocket,recvBuf,MAX_PATH,0);
if(ret == 0 || ret == SOCKET_ERROR){
break;
}
::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf);
}
return 0;
}
...全文
118 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-04-23
  • 打赏
  • 举报
回复
postmessage是异步的, 还没有来得及处理,又被接收线程覆盖了。 解决办法: 拷贝。
Iceboll 2013-04-22
  • 打赏
  • 举报
回复
楼上说的太对了,thank you very much !
keyboard330 2013-04-22
  • 打赏
  • 举报
回复
MSDN帮助文档上 If no error occurs, recv returns the number of bytes received. 所以,在函数recv返回后,LZ所定义的变量ret就表明这次接受的数据长度, //recvBuf[ret] = '\0'; ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)recvBuf); 加上注释的这句话就行了。
大尾巴猫 2013-04-22
  • 打赏
  • 举报
回复
send一次发送100个字节的内容,recv的时候,一次不能保证接受到100个字节的内容,可能需要2次或者多次。 同样,send 100个字节,然后再send 100个字节,也许recv一次就收到200个字节。 send()和recv()要事先约定好一条完整的信息是如何界定的。 1、每次发送定长的信息。 2、不定长的信息用特定结束符。 3、每次发送添加一个包裹头部,指定这次发送的信息是多长。接受的时候先接受1个包裹头,然后再接受完整的信息。
Iceboll 2013-04-22
  • 打赏
  • 举报
回复
我试过用memset()清空,但是这样一来接收的数据就显示不了了,貌似还没将消息发送到主窗体,就直接清空了
Joseph_ 2013-04-22
  • 打赏
  • 举报
回复
你没清空缓存吧

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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