ACE_SOCK_Dgram :: open () и errno - PullRequest
       33

ACE_SOCK_Dgram :: open () и errno

1 голос
/ 20 января 2011

Я попытался открыть уже открытый порт UDP, и ACE_SOCK_Dgram :: open () не удалось. Как и ожидалось, strace показывает, что bind () завершился ошибкой и для errno установлено значение EADDRINUSE.

Чтобы увидеть, какая ошибка произошла, я использовал ACE_OS :: last_error (), но она не обновляется.

Я бы хотел дать пользователю информационную ошибку о том, что порт уже используется, вместо какой-то общей ошибки.

Бонусный вопрос - когда можно использовать ACE_OS :: last_error ()?

Tnx

Ответы [ 3 ]

1 голос
/ 22 января 2011

Это помогло бы, если бы вы предоставили более подробную информацию.На какой платформе вы запускали приложение?Какую версию библиотеки ACE вы используете?Был ли это порт UDP в диапазоне 1-1024?Используете ли вы широковещательный сокет UDP?

Предположим, что поскольку вы проверяете «errno», а не GetLastError (), вы работаете в среде UNIX, такой как Linux.Глядя на OS_S_errno.inl, вы можете найти комментарии, которые описывают разницу в поведении между различными ОС.

Вы не спрашиваете, почему вы получаете EADDRINUSE для UDP-сокета.Вы используете опцию SO_REUSEADDR?Если вы это сделаете, вы должны знать, что только последний процесс, связанный с сокетом, будет уведомлен, и поведение может отличаться в разных ОС.

Возможно ли, что после bind () был выполнен другой вызов системной функции?В этом случае ошибка, возвращаемая bind (), может быть сброшена последующим системным вызовом.Как вы можете видеть из реализации last_error (), он просто устанавливает «errno = :: GetLastError ()» в окнах и возвращает errno прямо в UNIX.

1 голос
/ 24 января 2011

Я нашел проблему.Я использовал ACE_OS :: last_error () для макроса (да, макросы плохие), который расширился до нескольких ссылок.Одна из строк выполнила системный вызов, и поэтому значение errno изменилось

0 голосов
/ 22 января 2011

Вы пытались просто проверить errno самостоятельно после вызова, чтобы открыть? Мне кажется, что если errno == EADDRINUSE вы можете справиться с этим так, как вам нравится, без помощи АСЕ.

...