免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: kuaizaifeng
打印 上一主题 下一主题

问一个socket里面shutdown和close的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-07-26 09:28 |只看该作者
原帖由 scutan 于 2007-7-25 17:56 发表
shutdown当然会激发FIN等关闭序列但是之后那个描述字仍然在那个地方放着.


谢谢scutan
测试了下,果然shutdown可以调用好几次
而且调用shutdown之后,描述字并没有被释放,只有调用close之后才被释放

这可以解释为什么我的程序里单单调用shutdown会导致fd溢出
但是为啥我调用shutdown後再次调用close就会出错呢?
而且出的错是EBADF
很让人不解

论坛徽章:
0
22 [报告]
发表于 2007-07-26 10:02 |只看该作者
原帖由 deepinthesea 于 2007-7-25 22:45 发表


UDP协议开始时没有三次握手过程啊. 后面结束时也不需要这个吧, 而且它都不能够确认包是否真正到达!


说的对
我试了下,shutdown不能对udp的socket调用
原因是ENOTCONN
              The specified socket is not connected.

终于明白了
谢谢各位

但是还是有点儿不明白为啥那个产品的代码里面shutdown後调用close会失败
真是不爽

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
23 [报告]
发表于 2007-07-26 11:16 |只看该作者
这么简单的问题居然有人说装虚拟机来解决, 函数功能都不了解也不去查,居然还可以写出来。

论坛徽章:
0
24 [报告]
发表于 2007-07-26 12:53 |只看该作者
原帖由 醉卧水云间 于 2007-7-26 11:16 发表
这么简单的问题居然有人说装虚拟机来解决, 函数功能都不了解也不去查,居然还可以写出来。


大牛啊
给说说什么情况下shutdown 後 在close会出现EBADF的错误?
如果情况很多,给举个例子

论坛徽章:
0
25 [报告]
发表于 2007-07-27 08:28 |只看该作者

论坛徽章:
0
26 [报告]
发表于 2007-07-27 15:24 |只看该作者
原帖由 kuaizaifeng 于 2007-7-25 17:05 发表
连接是tcp的
程序跑的时候server端在服务结束后,在子线程里面调用shutdown(connfd, SHUT_RDWR)关闭accept产生的socket。
但是最终发现这些socket没有被释放,导致fd溢出。

我改用close关闭socket後,sock ...


shudown不释放连接,只是关闭数据的收发,shudown有参数,这个参数有3个值,分别表示关闭接收数据,关闭发送数据,既关闭发送也关闭接收.close是断开连接.

论坛徽章:
0
27 [报告]
发表于 2009-05-06 23:28 |只看该作者
为了使用tcp的半关闭特性,编程接口必须为应用程序提供一种方式来说明“我已完成数据传送,因此发送一个文件结束(FIN)给另一端,但我还想接收另一端发来的数据,直接它给我发来文件结束(FIN)”。
   如果应用程序不调用close而调用shutdownm,且第2个参数值为1,则插口的API支持半关闭.然而,大多数的应用程序通过调用close终止两个方向的连接。

shutdown(终止socket通信)  
相关函数  socket,connect

表头文件  #include<sys/socket.h>

定义函数  int shutdown(int s,int how);

函数说明  shutdown()用来终止参数s所指定的socket连线。参数s是连线中的socket处理代码,参数how有下列几种情况:
how=0 终止读取操作。
how=1 终止传送操作
how=2 终止读取及传送操作

返回值  成功则返回0,失败返回-1,错误原因存于errno。

错误代码  EBADF 参数s不是有效的socket处理代码
ENOTSOCK 参数s为一文件描述词,非socket
ENOTCONN 参数s指定的socket并未连线
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP