2016-06-07 4 views
2

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

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

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

+0

Проверить http://stackoverflow.com/questions/8874021/close-socket-directly-after-send-unsafe - закрыть должен сделать так, чтобы данные были доставлены без серьезной проблемы с сетью. – coyotte508

ответ

0

можно позвонить непосредственно близко(), не вызывая отключения()

Вы можете. shutdown необходим только в том случае, если вы хотите закрыть соединение (например, читать или писать).

будет близкий() обеспечить, чтобы все данные доставляются к месту назначения на исходящей ноге и получили от применения в пункте назначения

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. 
+1

Небольшое примечание о 'shutdown()'. Это повлияет на все копии сокета, например, созданные с помощью 'dup()', 'dup2()' или 'fork()'. Функция 'close()' влияет только на одну копию сокета. Если он не закрывает последнюю копию, остальные копии гнезда продолжают работать как обычно. –