非阻塞模式丢包

扬帆886 2009-04-22 06:24:51
请教下:socket非阻塞模式
服务器端:send包1,send包2。连续发送2包
客户机:

while(true)
{
FD_ZERO(&readfds);
FD_SET(m_hSocket,&readfds);
switch (select(m_hSocket+1,&readfds,NULL,NULL,&m_timeout) )
{
case -1:
break;
case 0:
break;
default:
if(FD_ISSET(m_hSocket,&readfds))
{


int nRecv = recv(m_hSocket, m_szBuff, MAX_PACKET_SIZE, 0);
if(INVALID_SOCKET == nRecv)
{
return WSAGetLastError();
}
}
}


客户机只能接收到包1。如果设置断点调试,先发包1,客户端接收,再发包2客户机再接收则程序正确。
select,FD_ISSET不是实现了有数据就读么,为什么2包会丢掉?
...全文
98 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2009-04-23
  • 打赏
  • 举报
回复
tcp?udp?
你不会不知道tcp会拼包发送吧。
扬帆886 2009-04-23
  • 打赏
  • 举报
回复
Sleep了也一样,会不会是 FD_ZERO(&readfds);FD_SET(m_hSocket,&readfds);设置问题?
arong1234 2009-04-23
  • 打赏
  • 举报
回复
发送和接收的包的数量不是一一对应的,不是说你发送端发送了10包,接收端也接收10包
只要所有的字节都发过来,就正确
所以第一你要检查每次发送到底发送了多少字节(只有send的返回值才准确),第二要看recv的返回值,看总共收到多少字节
发送的字节数总和等于接收的,就对
扬帆886 2009-04-23
  • 打赏
  • 举报
回复
解决了,用

if(select)
{
if(FD_ISSET())
{}
}

就可以。。纳闷
老邓 2009-04-22
  • 打赏
  • 举报
回复
while(true)
{
Sleep(10); // 试试
}

64,654

社区成员

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

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