我正在实现一个简单的代理应用程序,我总是从一端接收数据并发送到另一端。
在这种情况下,一旦我确定我已完成接收来自传入支路的所有数据,我可以直接close( )
调用而不调用shutdown( )
吗?如果我这样做,是否会close( )
确保所有数据都在传出段上传递到目的地并由目的地的应用程序接收?
或者在这种情况下,我是否必须在启动关闭之前启动关闭?
我正在实现一个简单的代理应用程序,我总是从一端接收数据并发送到另一端。
在这种情况下,一旦我确定我已完成接收来自传入支路的所有数据,我可以直接close( )
调用而不调用shutdown( )
吗?如果我这样做,是否会close( )
确保所有数据都在传出段上传递到目的地并由目的地的应用程序接收?
或者在这种情况下,我是否必须在启动关闭之前启动关闭?
我可以直接调用 close() 而不调用 shutdown()
你可以。shutdown
仅当您想半关闭连接(即读取或写入结束)时才需要。
close() 是否会确保所有数据都在传出分支上传递到目的地并由目的地的应用程序接收
close
在后台执行阻塞send
操作,不多也不少。但是,如果该背景send
失败,您将不会收到任何错误指示。
SO_LINGER
如果需要,您还可以调整套接字选项:
SO_LINGER Sets or gets the SO_LINGER option. The argument is a linger structure. struct linger { int l_onoff; /* linger active */ int l_linger; /* how many seconds to linger for */ }; When enabled, a close(2) or shutdown(2) will not return until all queued messages for the socket have been successfully sent or the linger timeout has been reached. Otherwise, the call returns immediately and the closing is done in the background. When the socket is closed as part of exit(2), it always lingers in the background.