Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > send + SIGPIPE + QNX


Автор: proc_maker 15.5.2008, 22:03
Здравствуйте уважаемые эксперты,

вот такой вопрос: в POSIXе есть MSG_NOSIGNAL опция для функции send чтобы не поймать SIGPIPE если коннект разорван, однако в QNX этой опции нет (socket.h).

signal(SIGPIPE, SIG_IGN) перехватит SIGPIPE для всего процесса что крайне нежелательно.

Какой выход из ситуации для QNX?

Огромное спасибо,
Дмитрий

Автор: MAKCim 16.5.2008, 00:04
proc_maker, 
Цитата(proc_maker @  15.5.2008,  22:03 Найти цитируемый пост)
Какой выход из ситуации для QNX?

перед send() определить, получен ли сегмент RST

Автор: proc_maker 16.5.2008, 08:37
MAKCim, не подскажите как это сделать?

Спасибо,
Дмитрий

Автор: MAKCim 16.5.2008, 09:29
Цитата(proc_maker @  16.5.2008,  08:37 Найти цитируемый пост)
MAKCim, не подскажите как это сделать?

проверить состояние клиента перед send()
если оно CLOSE_WAIT, то send() вызовет либо SIGPIPE, либо получение клиентским TCP сегмента RST
в Linux проверяется так
Код

struct tcp_info info;
socklen_t len = sizeof(info);
getsockopt(sock_fd, IPPROTO_TCP, TCP_INFO, &info, &len);
if (info.tcpi_state == TCP_CLOSE_WAIT) {
/* bla-bla-bla */
}

в QNX нечто подобное должно быть

Автор: proc_maker 20.5.2008, 07:27
Спасибо всем, проблема решилась обновлением версии QNX в которой присутствует MSG_NOSIGNAL.

С уважением,
Дмитрий

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)