TCP close() гарантирует, что все данные доставлены получателю

Я реализую простое прокси-приложение, в котором я всегда получаю данные с одного конца и отправляю на другой конец.

В таком случае, если я уверен, что я получил все данные от входящего участка, могу ли я позвонить напрямую? close( ) без звонка shutdown( )? Если я сделаю это, close( ) гарантировать, что все данные доставлены в пункт назначения на исходящем участке и получены приложением в пункте назначения?

Или в таком случае обязательно ли инициировать отключение перед началом закрытия?

1 ответ

могу ли я позвонить напрямую 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.
Другие вопросы по тегам