免费注册 查看新帖 |

Chinaunix

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

非堵塞socket下的send函数堵塞 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-22 10:24 |只看该作者 |倒序浏览
各位,我在设置非堵塞socket下使用send函数存在极小的几率被堵塞,下面是代码:
  1. static int32_t SendDataPacket4Schedule(const uint8_t *data, const int32_t len)
  2. {
  3.         fd_set fdsWrite;
  4.         struct timeval stTimeoutVal;
  5.         int nRet, nSndBytes;

  6.         FD_ZERO(&fdsWrite);
  7.         FD_SET(GetDataInOutSocket(), &fdsWrite);
  8.         stTimeoutVal.tv_sec = TIMEOUT_SOCKET_SEND;
  9.         stTimeoutVal.tv_usec = 0;

  10.         //TODO:这里的处理貌似是有问题的,参见下面的“不管”注释部分
  11.         nRet = select(GetDataInOutSocket() + 1, NULL, &fdsWrite, NULL, &stTimeoutVal);
  12.         if(nRet > 0)
  13.         {
  14.                 if(FD_ISSET(GetDataInOutSocket(), &fdsWrite))
  15.                 {
  16.                         //* 如果相等,表明发送成功,立即发送下一个报文
  17.                         debug("[send prepare]SendDataPacket:[0x%x] length:%d.\r\n",
  18.                                         GetDataInOutSocket(), len);
  19.                         nSndBytes = send(GetDataInOutSocket(), data, len, MSG_NOSIGNAL);
  20.                         if(len != nSndBytes)
  21.                         {
  22.                                 PERROR("tcp_output() send error");
  23.                                 debuginfo("[send]SendDataPacket() send [0x%x]:%d, error:%s\r\n",
  24.                                                 GetDataInOutSocket(), nSndBytes, strerror(errno));
  25.                         }else{
  26. #if 1
  27.                                 debug("[send]SendDataPacket:[0x%x] length:%d.\r\n",
  28.                                                 GetDataInOutSocket(), len);
  29.                                 showhex((uint8_t *)data, len);
  30.                                 alert("[send]SendDataPacket OK.");
  31. #endif
  32.                         }
  33.                 }else{
  34.                         nSndBytes = 0;
  35.                 }
  36.         }
  37.         else if(nRet == 0)
  38.         {
  39.                 debuginfo("send Schedule Data Time Out: [0x%x]!\r\n", GetDataInOutSocket());
  40.                 nSndBytes = -2;
  41.         }
  42.         else
  43.         {
  44.                 PERROR("tcp_output() select error");
  45.                 debuginfo("tcp_output() select error [0x%x] :%s\r\n", GetDataInOutSocket(), strerror(errno));
  46.                 nSndBytes = -1;
  47.         }

  48.         return nSndBytes;
  49. }
复制代码
上面的send部分会被堵塞,我的日志输出显示:
debug("[send prepare]SendDataPacket:[0x%x] length:%d.\r\n",
                                        GetDataInOutSocket(), len);
成功执行之后被挂起,各位觉得有这种可能么?

论坛徽章:
0
2 [报告]
发表于 2012-02-22 11:11 |只看该作者
是靠这句话 len != nSndBytes  看出来它阻塞了吗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-02-22 13:12 |只看该作者
不是的,send成功与否,后续我都有打日志,但是后续的日志没有出来

论坛徽章:
1
15-16赛季CBA联赛之四川
日期:2016-02-15 17:12:32
4 [报告]
发表于 2012-02-22 15:30 |只看该作者
send 返回发送成功的字节数,当返回的字节数不等于你要发送的字节时应当继续发送。并非堵塞了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2012-07-24 09:57 |只看该作者
应该是我发送线程异常退出导致,别的没有合理的解释了,但是此处线程是不应该退出的。。。

论坛徽章:
0
6 [报告]
发表于 2012-07-24 10:02 |只看该作者
回复 1# notsureit


    有使用 fcntl O_NONBLOCK 吗?

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
7 [报告]
发表于 2012-07-24 10:07 |只看该作者
你所说的阻塞是指:执行线程被短时间挂起?还是网络拥塞?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2012-07-24 10:08 |只看该作者
回复 6# giantchen


    有的,这个问题应该是误问,最初的发送线程完全没有保护,应该是发送线程自身退出了,造成send堵塞的假象,但是在send之处确实不应该产生异常的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2012-07-24 10:08 |只看该作者
回复 7# cdtits


    send函数不返回,堵塞在函数内
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP