免费注册 查看新帖 |

Chinaunix

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

*******网络编程基础( 讨论版V1 )******* [复制链接]

论坛徽章:
0
21 [报告]
发表于 2003-04-03 18:03 |只看该作者

*******网络编程基础( 讨论版V1 )*******

如果是经常进行TCP/IP编程的话
研究深层理论还是很不错的
这样可以了解和使用socket的高级功能
如setsockopt等

如果调用shutdown的话,那么被shutdown端的的端口内数据会全部丢弃
端口关闭

这点和ckose不同
close是直到把端口内数据全部发送完后才关闭端口的

不知是不是这样

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

*******网络编程基础( 讨论版V1 )*******

shutdown有几种模式,但是与close最主要的区别在于它是半关闭.

SHUT_RD: 这个时候系统会关闭读通道.但是可以继续往接字描述符写
SHUT_WR:关闭写通道,和上面相反,着时候就只可以读了.
SHUT_RDWR: 关闭读写通道,和close一样 但是在多进程程序里面,如果有几个子进程共享一个套接字时,如果我们使用shutdown, 那么所有的子进程都不能够操作了,这个时候我们只能够使用close来关闭子进程的套接字描述符.  

这种半关闭模式,在rsh里面有应用
考虑rsh remote_host sort <data

在datafile输入完成后,执行这个tcp连接写的半关闭.但是可以继续接受对方发过来的结果

http://www.fanqiang.com/a4/b7/20010508/112209.html

论坛徽章:
0
23 [报告]
发表于 2003-04-03 18:36 |只看该作者

*******网络编程基础( 讨论版V1 )*******

shutdown全关闭好像中直接清空缓冲区,和close不同
这点在UNIX网络编程上有比较


close只是减少引用数
等到引用数为0时才真正关闭

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
24 [报告]
发表于 2003-04-03 19:02 |只看该作者

*******网络编程基础( 讨论版V1 )*******

原帖由 "gadfly" 发表:


SHUT_RDWR: 关闭读写通道,和close一样 但是在多进程程序里面,如果有几个子进程共享一个套接字时,如果我们使用shutdown, 那么所有的子进程都不能够操作了,这个时候我们只能够使用close来关闭子进程的套接字描述符.

原帖由 "无双" 发表:

shutdown全关闭好像中直接清空缓冲区,和close不同
这点在UNIX网络编程上有比较


close只是减少引用数
等到引用数为0时才真正关闭


和我上面列举的并不矛盾.是可以相互解释的

可以这样理解, 多进程来共享socket连接时,
shutdown清空缓冲区(共享的),同时将socket关闭.

正因为close是通过引用计数来关闭,所以多进程共享的情况下,用close来关闭比较安全.

论坛徽章:
0
25 [报告]
发表于 2003-04-03 19:12 |只看该作者

*******网络编程基础( 讨论版V1 )*******

我说的主要区别是使用shutdown时缓冲区会清空

但是close时不会清空,只有缓冲区内数据全部发送后才关闭

论坛徽章:
0
26 [报告]
发表于 2003-04-03 19:14 |只看该作者

*******网络编程基础( 讨论版V1 )*******

这点是很久以前在UNIX网络编程
上看到的,但应该是这样

使用shutdown的话,因为数据缓冲区被清空,所以没有发送的内容会丢掉
一般是很少用
而使用close更安全一点

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

*******网络编程基础( 讨论版V1 )*******

对于close来说,默认行为是努力将发送缓冲区的残留数据发送完。该行为可以通过选项SO_LINGER来改变,如果由兴趣的话,我们可以专门来讨论改选项。cloes调用一次,只是将描述字的访问次数-1,仅当且当该次数为0的时候才真正的关闭socket。从关闭的角度看close是同时关闭read和write,而shutdown可以根据需要关闭read或write或两者。

对于shutdown来说,它的行为是通过三个宏来确定的,对于SHUT_RD来说,接受缓冲区的数据是要被清空的。而宏SHUT_WR一旦设置,sockets拒绝任何write操作,但是不清空发送缓冲区的内容,这点,gadfly的描述是不正确的。对于宏SHUT_RDWR来说,行为是接受缓冲区的数据被清空,发送缓冲区的内容不清空。

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

*******网络编程基础( 讨论版V1 )*******

我前一个说明shutdown只是针对全关闭(SHUT_RDWR)而言的.
而宏SHUT_WR一旦设置,sockets拒绝任何write操作,但是不清空发送缓冲区的内容,这点,gadfly的描述是不正确的。对于宏SHUT_RDWR来说,行为是接受缓冲区的数据被清空,发送缓冲区的内容不清空。


这个恐怕得依赖于kernel的实现,你可以看看这个url:
http://www.gnu.org/manual/glibc-2.2.5/html_node/Closing-a-Socket.html#Closing%20a%20Socket

int shutdown (int socket, int how)  Function
The shutdown function shuts down the connection of socket socket. The argument how specifies what action to perform:
0
Stop receiving data for this socket. If further data arrives, reject it.

1
Stop trying to transmit data from this socket. Discard any data waiting to be sent. Stop looking for acknowledgement of data already sent; don't retransmit it if it is lost.

2
Stop both reception and transmission.

从gnu的文档中,可以看到,是立即放弃缓存中的数据的.
但是有的也说linux kernel的实现是不清空,继续发送,并且不受so_linger影响

无论如何,和close的作用相比,我想,shutdown的最大作用是用于半关闭,而close是无法做到的,全关闭这种方式基本上用不到.

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

*******网络编程基础( 讨论版V1 )*******

http://www.softlab.ece.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.6

When should I use shutdown()?
From Michael Hunter ( mphunter@qnx.com):

shutdown() is useful for deliniating when you are done providing a request to a server using TCP. A typical use is to send a request to a server followed by a shutdown(). The server will read your request followed by an EOF (read of 0 on most unix implementations). This tells the server that it has your full request. You then go read blocked on the socket. The server will process your request and send the necessary data back to you followed by a close. When you have finished reading all of the response to your request you will read an EOF thus signifying that you have the whole response. It should be noted the TTCP (TCP for Transactions -- see R. Steven's home page) provides for a better method of tcp transaction management.

大概的意思是利用shutdown的半关闭特性,实现tcp的事务管理.

论坛徽章:
0
30 [报告]
发表于 2003-04-04 08:43 |只看该作者

*******网络编程基础( 讨论版V1 )*******

shutdown 函数
close有两个限制可由函数shutdown来避免:

close将描述字的访问计数减1,仅在此计数为0时才关闭套接口
shutdown可激发TCP的正常连接终止序列, 而不管访问计数。
这里的内容还是比较有用的,以前一直没有注意

close终止了数据传送的两个方向:读和写。
shutdown终止的数据传送的两个方向:读和写, 或其中任一方向:读或写

定义:
int shutdown( int sockfd, int howto) ;

howto选项:
SHUT_RD 关闭连接的读一半
SHUT_WR 关闭连接的写这一半
SHUT_RDWR 关闭连接读读和写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP