TCP close()是否确保将所有数据传递给接收方

时间:2016-06-07 17:44:10

标签: tcp closesocket

我正在实现一个简单的代理应用程序,我总是从一端接收数据并发送到另一端。

在这种情况下,一旦我确定我已收到来自收听段的所有数据,我是否可以直接拨打close( )而无需拨打shutdown( )?如果我这样做,close( )是否会确保所有数据都传送到传出支路上的目的地并由目的地的应用程序接收?

或者在这种情况下,我必须在我开始关闭之前启动关机吗?

1 个答案:

答案 0 :(得分:0)

  

我可以直接调用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.