Подскажите пожалуйста, может быть кто-нибудь встречался со следующей особенностью socket API (операционная система Linux RHEL-4.8):
при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку.
Если какая-нибудь возможность получить правильный код возврата для первого вызова send().
Здравствуйте, vlegkov, Вы писали:
V>при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку.
Все правильно. У тебя нет возможности определить, были ли получены отправленные данные. Если есть необходимость в этом — реализуй в прикладном протоколе.
Здравствуйте, vlegkov, Вы писали:
V>Подскажите пожалуйста, может быть кто-нибудь встречался со следующей особенностью socket API (операционная система Linux RHEL-4.8): V>при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку. V>Если какая-нибудь возможность получить правильный код возврата для первого вызова send().
а просто опробовать на чтение и прочитать 0 байт не катит? пере вызовом send
Здравствуйте, vlegkov, Вы писали:
V>Подскажите пожалуйста, может быть кто-нибудь встречался со следующей особенностью socket API (операционная система Linux RHEL-4.8): V>при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку. V>Если какая-нибудь возможность получить правильный код возврата для первого вызова send().
Спасибо большое всем, кто ответил. Только несколько ответов:
1. Michael Chelnokov: На самом деле если приложение не получает ответ, оно повторяет отправку сообщения и после срабатывания таймера останавливает отправку, но конечно хотелось бы получить ошибку при первой отправке. Ну нет так нет.
2. ilnar: Мне кажется , что этот способ не подходит, поскольку существует возможность закрытия удаленного сокета сразу после успешного чтения 0 байт и перед отправкой сообщения.
3. sand7e: Попробовал вызвать shutdown перед закрытием сокета, но это не помогло.
Еще раз большое спасибо всем за разъяснение ситуации.