как узнать, закрыл ли удаленный конец сокет с помощью системного вызова send? - PullRequest
1 голос
/ 19 сентября 2011

системный вызов send () выполняется впервые, даже если удаленный конец закрыл соединение.Если я отправлю еще раз, то будет сгенерирован sigpipe.Я не хочу использовать системный вызов recv, чтобы узнать, закрыл ли удаленный конец соединение.

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

1 Ответ

1 голос
/ 19 сентября 2011

Первое, что вы должны сделать, это позвонить signal(SIGPIPE, SIG_IGN);, чтобы избежать получения SIGPIPE на send() или, в Linux, передать флаг MSG_NOSIGNAL на send().Сделав это, send() не будет генерировать сигнал SIGPIPE при отключении узла, а скорее вернет -1 с помощью errno == EPIPE.

Отправка SIGPIPE является историческим поведением функции write().http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html

EPIPE Предпринята попытка записи в канал или FIFO, который не открыт для чтения каким-либо процессом, или который имеет только один открытый конец.Сигнал SIGPIPE также должен быть отправлен в поток.

Первоначально он был создан для труб оболочки (например, cmd | other_cmd).Когда ctrl-c нажата во время выполнения оболочки, только последний процесс в канале получает SIGINT и завершается.Для завершения других процессов в канале SIGPIPE отправляется процессу, пытающемуся write() в STDOUT, чей считыватель уже завершен.

...