免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6236 | 回复: 10
打印 上一主题 下一主题

[函数] recv()函数接受多个数据包问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-22 00:24 |只看该作者 |倒序浏览
接收第一个正常,接收第二个包就把程序阻塞在那里了,这是啥子问题呢?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2006-12-22 00:36 |只看该作者
阻塞等待数据啊

求职 : 数据库管理员
论坛徽章:
0
3 [报告]
发表于 2006-12-22 07:58 |只看该作者
用select檢測一下再recv

论坛徽章:
0
4 [报告]
发表于 2006-12-22 08:32 |只看该作者
打开的时候设置为非阻赛模式,
或者设置个超时

论坛徽章:
0
5 [报告]
发表于 2006-12-22 08:56 |只看该作者
其实非阻塞模式并不是什么时候都很可以用的。量体裁衣吧!!

论坛徽章:
0
6 [报告]
发表于 2006-12-24 15:37 |只看该作者
while(1)
{
                NEDataInd databuf;
                memset(&databuf,0,sizeof(NEDataInd));
                // Read one data package
                int nLeng = sizeof(NEDataInd);
                int nRet;
                int idx = 0;
                char *pbuf = (char*)&databuf;
               
                //while(nLeng > 0)
                //{
                //        printf("will receiv\r\n");
                //        nRet = recv(sock,pbuf+idx,nLeng,0);
                //        printf("recvlen=%d\r\n",nRet);
                //        if(nRet == 0 )
                //        {
                //                WriteLogA("Socket端口连接已经被关闭!\r\n");
                //                return 0;
                //        }
                //        if(nRet == SOCKET_ERROR)
                //        {
                //                if(errno != 10060)//not time out
                //                {
                //                        return 0;
                //                }
                //                WriteLogA("Receive command response failed,socket error\r\n");
                //                continue;
                //        }
                //        idx += nRet;
                //        nLeng -= nRet;
                //}
                nRet = recv(sock,pbuf,nLeng,0);
}   
我接收数据的代码就是那段注释代码。第一个数据包正常,第二个就一直在那里等待,是不是数据包的大小没有达到NEDataInd的大小就没有返回,一直在那里死等?

论坛徽章:
0
7 [报告]
发表于 2006-12-24 18:11 |只看该作者
我可能出现过相同原因的问题,尽管表现出来的形式不一样:

多个数据包,被一次性接受了。

就是说第一次recv接收了client发过来的两个包。
造成第二次recv除需等待


请检查第一次recv的返回值

论坛徽章:
0
8 [报告]
发表于 2007-12-13 11:04 |只看该作者
现在我也遇到了同样的问题!!

论坛徽章:
0
9 [报告]
发表于 2007-12-13 16:26 |只看该作者
阻塞的原因一般是没有包到达, 而不太会是包的数量没有达到你要读取的那么多.
我建议你检查一下你发送的包与你接收的包的大小, 比较一下.

论坛徽章:
0
10 [报告]
发表于 2007-12-13 16:54 |只看该作者
用recv 或read SOCKET

1)用非阻塞的
2)用阻塞的,但要设置timeout. (用select可以实现readtimeout)

否则,可能永远阻塞在那里是进程死在那里.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP