在C语言中,我明白如果我们关闭一个套接字,这意味着套接字将被销毁,以后可以重新使用。
关闭怎么样?描述说它会关闭到该套接字的双工连接的一半。但是这个套接字会像关闭系统调用一样被销毁吗?
在C语言中,我明白如果我们关闭一个套接字,这意味着套接字将被销毁,以后可以重新使用。
关闭怎么样?描述说它会关闭到该套接字的双工连接的一半。但是这个套接字会像关闭系统调用一样被销毁吗?
当前回答
关闭
当你用完了一个套接字,你可以简单地用close关闭它的文件描述符;如果仍有数据等待通过连接传输,通常close会尝试完成此传输。您可以使用SO_LINGER套接字选项来指定超时时间来控制这种行为;参见套接字选项。
关闭
您也可以通过调用shutdown命令仅关闭连接上的接收或传输。
shutdown函数用来关闭套接字的连接。它的参数how指定执行什么动作: 0 停止接收此套接字的数据。如果进一步的数据到达,拒绝它。 1 停止尝试从这个套接字传输数据。丢弃任何等待发送的数据。停止寻找已发送数据的确认;如果它丢失了,不要重新发送。 2 停止接收和传输。
成功时返回0,失败时返回-1。
其他回答
我还成功地在linux下使用shutdown()从一个pthread强制另一个pthread当前阻塞在connect()提前中止。
在其他操作系统(至少是OSX)下,我发现调用close()足以让connect()失败。
这在Beej的网络指南中有解释。关闭是一种在一个或两个方向上阻止通信的灵活方式。当第二个参数是SHUT_RDWR时,它将同时阻塞发送和接收(如close)。然而,close实际上是销毁套接字的方法。
在关闭状态下,您仍然能够接收到对等端已经发送的待处理数据(感谢Joey Adams注意到这一点)。
在我的测试中。
当socket未与其他进程共享时,Close将立即发送fin数据包并销毁fd
关闭SHUT_RD,进程仍然可以从套接字recv数据,但如果TCP缓冲区为空,recv将返回0。当对等体发送更多数据后,recv将再次返回数据。
shutdown SHUT_WR将发送fin报文,表示不允许进一步发送。对等体可以recv数据,但如果它的TCP缓冲区是空的,它将recv 0
shutdown SHUT_RDWR(等于同时使用SHUT_RD和SHUT_WR)如果对端发送更多的数据将发送rst包。
Linux: shutdown()导致侦听器线程select()唤醒并产生错误。关闭();close ();会导致无尽的等待。
Winsock:反之亦然- shutdown()没有作用,而close()被成功捕获。
关闭
当你用完了一个套接字,你可以简单地用close关闭它的文件描述符;如果仍有数据等待通过连接传输,通常close会尝试完成此传输。您可以使用SO_LINGER套接字选项来指定超时时间来控制这种行为;参见套接字选项。
关闭
您也可以通过调用shutdown命令仅关闭连接上的接收或传输。
shutdown函数用来关闭套接字的连接。它的参数how指定执行什么动作: 0 停止接收此套接字的数据。如果进一步的数据到达,拒绝它。 1 停止尝试从这个套接字传输数据。丢弃任何等待发送的数据。停止寻找已发送数据的确认;如果它丢失了,不要重新发送。 2 停止接收和传输。
成功时返回0,失败时返回-1。