免费注册 查看新帖 |

Chinaunix

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

socket关闭的问题,shutdown 和close区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-07-11 16:41 |只看该作者 |倒序浏览
我在SCO UNIX下写了一个TCP/IP服务程序,客户端是delphi写的,服务端发送数据报后关闭socket(shutdown(handle,5);close(handle)
客户端接收不到数据,但是在发送完数据后使用sleep(50);然后再关闭socket
就可以收到,请高手解决帮帮了,谢谢
(服务端使用阻塞方式,客户端使用非阻塞方式)

论坛徽章:
0
2 [报告]
发表于 2003-07-11 17:07 |只看该作者

socket关闭的问题,shutdown 和close区别

不用shutdown

论坛徽章:
0
3 [报告]
发表于 2003-07-11 17:19 |只看该作者

socket关闭的问题,shutdown 和close区别

[quote]原帖由 "boylitao"]不用shutdown[/quote 发表:
     
那怎么能行呢,我用的是多进程的

论坛徽章:
0
4 [报告]
发表于 2003-07-11 17:24 |只看该作者

socket关闭的问题,shutdown 和close区别

多进程和shutdown没关系。

论坛徽章:
0
5 [报告]
发表于 2003-07-11 17:28 |只看该作者

socket关闭的问题,shutdown 和close区别

close()和shutdown()函数
  你已经整天都在发送 (send()) 和接收 (recv()) 数据了,现在你准备关 闭你的套接字描述符了。这很简单,你可以使用一般的 Unix 文件描述符 的 close() 函数:
  close(sockfd);
它将防止套接字上更多的数据的读写。任何在另一端读写套接字的企 图都将返回错误信息。
如果你想在如何关闭套接字上有多一点的控制,你可以使用函数 shutdown()。它允许你将一定方向上的通讯或者双向的通讯(就象close()一 样)关闭,你可以使用:
int shutdown(int sockfd, int how);
sockfd 是你想要关闭的套接字文件描述复。how 的值是下面的其中之 一:
  0 – 不允许接受
  1 – 不允许发送
  2 – 不允许发送和接受(和 close() 一样)
shutdown() 成功时返回 0,失败时返回 -1(同时设置 errno。) 如果在无连接的数据报套接字中使用shutdown(),那么只不过是让 send() 和 recv() 不能使用(记住你在数据报套接字中使用了 connect 后 是可以使用它们的)。

论坛徽章:
0
6 [报告]
发表于 2003-07-11 17:32 |只看该作者

socket关闭的问题,shutdown 和close区别

请问boylitao 老兄 只要shutdown就不再需要close了吗?

论坛徽章:
0
7 [报告]
发表于 2003-07-11 17:34 |只看该作者

socket关闭的问题,shutdown 和close区别

可以不需要!

论坛徽章:
0
8 [报告]
发表于 2003-07-11 17:41 |只看该作者

socket关闭的问题,shutdown 和close区别

boylitao  老兄能不能给小弟一些比较好的学习资料
yingjunw_78@163.com
谢谢

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2003-07-11 18:20 |只看该作者

socket关闭的问题,shutdown 和close区别

boylitao同志对于shutdown的描述是正确的。但是在应用中使用shutdown二不用close的另外一个重要的原因是。shutdown是强制关闭的,这种关闭不像close一样,和描述字访问计数无关。


大马虎同志在帖子中写道:
"客户端接收不到数据,但是在发送完数据后使用sleep(50);然后再关闭socket
就可以收到,请高手解决帮帮了,谢谢
(服务端使用阻塞方式,客户端使用非阻塞方式)"

如果果真实际情况如你所描述的一样,那么答案就在其中。因为你客户端使用非阻塞方式接受数据。然而数据从delphi经过网络传输的速度远远的比不少你的系统调用read或recvmsg的速度。


大马虎同志又写道:
“服务端发送数据报后关闭socket(shutdown(handle,5);close(handle) “

此处的描述可能不准确。

论坛徽章:
0
10 [报告]
发表于 2013-12-24 22:25 |只看该作者
shutdown和close其实是对四次握手不同粒度的控制。首先tcp是全双工的,对于任何一端都是有读和写两条通道的。shutdown是关闭其中的一条通道。而close是关闭两条(可以先简单的这样理解)。不同的内核可能实现会有差异。shutdown如果关闭发送通道的话会发送一个fin信号给对端,对端回一个ack这时socket的状态是fin_wait_2状态。可以读不可以写。对端可以写但不可以读,理由很显然。这样就可以实现读写两个通道更加细致的控制了。而close首先在应用层来讲就全关了,不管发什么信号用户都不能再read或write了。
内核 做的事情,不同的内核略有不同。linux是先给fd的引用计数器减1,如果减到0就执行关闭,有可能是发fin也有可能发rst。具体发什么信号网上搜一下吧。记不清了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP