LINUX.ORG.RU

закрытие соединения tcp


0

0

Здравствуйте. Как правильно закрыть соединени ? Достаточно ли сделать просто: shutdown(sockfd, SHUT_RDWR); close(sockfd); ? Имеетя ввиду чтобы наобоих системах потом не висело это соединение с разными флагами и т.п.

anonymous

да просто close() ее и усе, в чем проблема то? .. ну по необходимости linger можешь отключать ..

смысл пользовать shutdown() есть только если ты частично хочешь прикрыть коннект ..

я так же слышал(но не проверял) что под виндой есть проблема close() без shutdown(), но разве тебя это должно заботить?

lg ★★
()

да, shutdown () - для TCP это означает посылку FIN потом close () - нормальное завершение

сразу close () неправильно - это экстренное завершение (RST), так что может потеряться хвостик данных

anonymous
()
Ответ на: комментарий от anonymous

> да, shutdown () - для TCP это означает посылку FIN потом close () - нормальное завершение

> сразу close () неправильно - это экстренное завершение (RST), так что может потеряться хвостик данных

это в винде так?

lg ★★
()
Ответ на: комментарий от anonymous

> сразу close () неправильно - это экстренное завершение (RST),
> так что может потеряться хвостик данных

ничего общего с дествительностью.

shutdown() закрывыет соединение, close() работает с файлом
(в данном случае сокет).

если этот сокет виден в разных процессах (fork, например),
shutdown аукнется для всех, close() только уменьшит количество
ссылок.

idle ★★★★★
()
Ответ на: комментарий от idle

>> сразу close () неправильно - это экстренное завершение (RST), >> так что может потеряться хвостик данных

> ничего общего с дествительностью.

почемуже, может в винде так и пашет как он пишет (я серьезно), надо будет проверить как нибудь. :)

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

lg ★★
()
Ответ на: комментарий от anonymous

> сразу close () неправильно - это экстренное завершение (RST), так что может потеряться хвостик данных

Это, извините, бред. Причем сформулированный таким образом, что свежий человек может и поверить.

Вот кусочек из GNU C Library manual.

== When you have finished using a socket, you can simply close its file descriptor with close; see Opening and Closing Files. If there is still data waiting to be transmitted over the connection, normally close tries to complete this transmission. You can control this behavior using the SO_LINGER socket option to specify a timeout period; see Socket Options.

You can also shut down only reception or transmission on a connection by calling shutdown, which is declared in sys/socket.h. ==

anonymous
()
Ответ на: комментарий от lg

мне тока линух нужекн :) спасибо, т.е. shutdown () не помешае, тогда его оставлю

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.