функция send возвращает некорректный код
От: vlegkov  
Дата: 01.06.11 06:09
Оценка:
Подскажите пожалуйста, может быть кто-нибудь встречался со следующей особенностью socket API (операционная система Linux RHEL-4.8):
при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку.
Если какая-нибудь возможность получить правильный код возврата для первого вызова send().
Re: функция send возвращает некорректный код
От: Michael Chelnokov Украина  
Дата: 01.06.11 07:15
Оценка:
Здравствуйте, vlegkov, Вы писали:

V>при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку.


Все правильно. У тебя нет возможности определить, были ли получены отправленные данные. Если есть необходимость в этом — реализуй в прикладном протоколе.
Re: функция send возвращает некорректный код
От: ilnar Россия  
Дата: 01.06.11 07:27
Оценка:
Здравствуйте, vlegkov, Вы писали:

V>Подскажите пожалуйста, может быть кто-нибудь встречался со следующей особенностью socket API (операционная система Linux RHEL-4.8):

V>при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку.
V>Если какая-нибудь возможность получить правильный код возврата для первого вызова send().

а просто опробовать на чтение и прочитать 0 байт не катит? пере вызовом send
Re: функция send возвращает некорректный код
От: Vamp Россия  
Дата: 01.06.11 12:50
Оценка:
V>Если какая-нибудь возможность получить правильный код возврата для первого вызова send().
Нету. Это особенность архитектуры сокетов.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: функция send возвращает некорректный код
От: sand7e Россия  
Дата: 01.06.11 13:11
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, vlegkov, Вы писали:


V>>при первом вызове функции send(..)(TCP), ....


А shutdown(...) до close() вызывали?
Re: функция send возвращает некорректный код
От: vlegkov  
Дата: 01.06.11 13:51
Оценка:
Здравствуйте, vlegkov, Вы писали:

V>Подскажите пожалуйста, может быть кто-нибудь встречался со следующей особенностью socket API (операционная система Linux RHEL-4.8):

V>при первом вызове функции send(..)(TCP), после того, как удаленный сокет был закрыт, возвращается количество отправленных байт (т.е вызов считается успешным, несмотря на то, что соединение закрыто) и только второй вызов send(...) вызывает отправку сигнала SIGPIPE приложению и возвращает соответствующую ошибку.
V>Если какая-нибудь возможность получить правильный код возврата для первого вызова send().

Спасибо большое всем, кто ответил. Только несколько ответов:
1. Michael Chelnokov: На самом деле если приложение не получает ответ, оно повторяет отправку сообщения и после срабатывания таймера останавливает отправку, но конечно хотелось бы получить ошибку при первой отправке. Ну нет так нет.
2. ilnar: Мне кажется , что этот способ не подходит, поскольку существует возможность закрытия удаленного сокета сразу после успешного чтения 0 байт и перед отправкой сообщения.
3. sand7e: Попробовал вызвать shutdown перед закрытием сокета, но это не помогло.

Еще раз большое спасибо всем за разъяснение ситуации.

С уваженим,
Владимир.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.