Perl关闭一个socket。

10

是否有区别?

shutdown($socket, 0) if $socket;
shutdown($socket, 2) if $socket;
close($socket) if $socket;
并且
shutdown($socket, 2) if $socket;
close($socket) if $socket;

还有,在这两者之间有什么区别吗?

shutdown($socket, 1) if $socket;
shutdown($socket, 2) if $socket;
close($socket) if $socket;

并且

shutdown($socket, 2) if $socket;
close($socket) if $socket;

最后,close 到底是否必要?

1个回答

14

shutdown函数会导致TCP连接的一方停止读取(0)、写入(1)或两者都停止(2)。因此前两个代码片段产生相同的效果,后两个也是如此。

shutdown函数不会释放文件描述符,因此仍需使用close函数。

单独使用close和在其之前使用shutdown(fd, 2)有所不同,后者TCP不会尝试向远程端口传递未完成的数据(参见SO_LINGER)。


我遇到了意料之外的错误。$rc = shutdown($socket, 1); 返回预期的 1(没有错误)。但如果紧接着执行 $rc = shutdown($socket, 0);,它会返回 0 并且 %!Transport endpoint is not connected,这不是我预期的结果。如果再接着执行 close,它似乎会抛出异常并过早退出脚本。所以这对我来说很奇怪。 - Linas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接