WSAAsyncSelect中,怎么样保证接收数据完整?

kernellong 2008-12-10 02:51:27
WSAAsyncSelect中,怎么样保证接收数据完整?
代码是这样:

case FD_READ:
char szText[102400] = { 0 };
memset(szText,0,102400);
::recv(s, szText, 10240, 0);
我发的包有10000字左右,
但只能收到部分,我怎么做才能保证完整性呢
...全文
109 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2008-12-18
  • 打赏
  • 举报
回复
连续的接收,连续的放入足够大的内存,这和网络没大关系,主要是你的处理
caitian6 2008-12-16
  • 打赏
  • 举报
回复
int left = 0;
int rec = 0;
int total = 10240;
while(total!= 0)
{
rec = recv(s,szText+left,total,0 );
left += rec;
total -=rec;

}
DentistryDoctor 2008-12-15
  • 打赏
  • 举报
回复
数据包最好有定义好的格式。比如长度+内容, 这样可能很好的应付TCP的粘包。
jawiudi 2008-12-10
  • 打赏
  • 举报
回复
recv的返回值就是接收到的实际字节?
详见MSDN
If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Leo_red 2008-12-10
  • 打赏
  • 举报
回复
是TCP通讯吗?貌似系统发送缓冲区和接受缓冲区默认没有10000字节那么大阿(我机器默认4096),所以你的发送应该会被系统分两次发出去吧,虽然你只调用一次send。
那么接受自然一次就搞不定了,反复接受几次,如果是TCP的肯定能收齐。

经验如此,如有不对,欢迎指正!
blackcat242 2008-12-10
  • 打赏
  • 举报
回复
recv的返回值就是接收到的实际字节
cnzdgs 2008-12-10
  • 打赏
  • 举报
回复
recv之后,如果数据没有收全,还会触发FS_READ事件,继续接受就可以了。
jawiudi 2008-12-10
  • 打赏
  • 举报
回复
看一下recv返回的值,判断一下原因。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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