免费注册 查看新帖 |

Chinaunix

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

非阻塞套接字变成了阻塞的,怎么办 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-19 09:29 |只看该作者 |倒序浏览
服务器端是非阻塞SOCKET,客户端是阻塞SOCKET。
客户端发数据给服务器端,服务器端收到数据后,再把数据发回给客户端,客户端再发,就这样循环。。。
有时候这样循环了几次,有时候循环了几百次,当客户端把数据发给服务器端后,write返回1024,表示我要发送的1024个字节的数据已经发送出去,而服务器端却阻塞在read上面。这时候,如果我在客户端把连接关闭,服务器端的read就返回了,返回值为0。

为什么会这样,真是奇怪。

我是这样设置非足塞方式的。

  1.         val = fcntl(sfd, F_GETFL, 0);
  2.         if (val<0 || fcntl(sfd, F_SETFL, val | O_NONBLOCK)<0)
  3.         {
  4.                 close(sfd);  
  5.                 return -1;
  6.         }
复制代码


这样也试过:
  1.           flags = 1;
  2.         if (ioctl(sfd, FIONBIO, &flags) &&
  3.             ((flags = fcntl(sfd, F_GETFL, 0)) < 0 ||
  4.              fcntl(sfd, F_SETFL, flags | O_NONBLOCK) < 0)) {
  5.                 close(sfd);
  6.                 return -1;
  7.         }
复制代码
[/code]

论坛徽章:
0
2 [报告]
发表于 2004-11-19 12:45 |只看该作者

非阻塞套接字变成了阻塞的,怎么办

  1. write返回1024,表示我要发送的1024个字节的数据已经发送出去?
复制代码


只是表明成功写入待发送缓冲区,要确定对方已收到,需要双方定一个应用协议,例如对方收到后回一个响应,超时没收到响应应该考虑重发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP