Специфичный для AIX запрос программирования сокетов - PullRequest
0 голосов
/ 12 мая 2010

Вопрос 1

Из справочных страниц SUSE я получаю следующие сведения о параметрах подключения к сокету

Если исходный сокет находится в режиме соединения, то connect () должен попытаться установить соединение с адресом, указанным в аргументе address. Если соединение не может быть установлено немедленно и O_NONBLOCK не установлен для файлового дескриптора для сокета, connect () должен блокировать до неопределенного интервала времени ожидания, пока соединение не будет установлено. Если интервал тайм-аута истекает до установления соединения, connect () завершится неудачно и попытка соединения будет прервана. Если connect () прерывается сигналом, который перехватывается во время блокировки, ожидающего установления соединения, connect () должен завершиться с ошибкой и установить errno на [EINTR], но запрос на соединение не должен быть прерван, и соединение должно быть установлено асинхронно.

Вопрос: Действительно ли указанное выше содержание действительно для ОС AIX (особенно время ожидания соединения, время ожидания и т. Д.)? Потому что я не вижу его в справочных страницах AIX (5.1 и 5.3)

Вопрос 2

У меня есть клиентский сокет, атрибуты которого
а. SO_RCVTIMEO, SO_SNDTIMEO установлены на 5 секунд.
б. AF_INET и SOCK_STREAM.
с. SO_LINGER с задержкой и временем 5 секунд.
д. SO_REUSEADDR установлен.
Обратите внимание, что клиентский сокет не O_NONBLOCK.

Вопрос: теперь, поскольку O_NONBLOCK не установлен, а SO_RCVTIMEO и SO_SNDTIMEO установлены на 5 секунд, это означает

а. подключиться в NON Blocking или Blocking?
б. Если блокировка, это временная блокировка или «бесконечная» временная блокировка?
с. Если оно бесконечно, как мне установить системный вызов «connect», который является O_BLOCKING с таймаутом до t сек.

Извините, если вопросы очень наивные.
Заранее спасибо за ваш вклад.

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

All
Смог наконец найти ответы на мои вопросы после сквозного поиска и сканирования.
Я публикую его, чтобы он помог другим, кто может столкнуться с той же проблемой.

Вопрос: действительно ли указанное выше содержание действительно для ОС AIX (особенно время ожидания соединения, время ожидания и т. Д.)? Потому что я не вижу его на страницах руководства AIX (5.1 и 5.3)

Ответ

Из большого количества поиска и некоторой помощи инженера службы поддержки AIX выяснилось, что справочные страницы соответствуют стандарту POSIX и должны быть действительны как для AIX, так и для SUSE OS.

Таким образом, это доказывает, что системный API подключения (O_BLOCK) может блокироваться в случае редких сценариев для неопределенного интервала времени ожидания

Вопрос: теперь, поскольку O_NONBLOCK не установлен, а SO_RCVTIMEO и SO_SNDTIMEO установлены на 5 секунд, это означает

а. подключиться в NON Blocking или Blocking?
б. Если блокировка, это временная блокировка или «бесконечная» временная блокировка?
с. Если оно бесконечно, как мне установить системный вызов «connect», который является O_BLOCKING с таймаутом до t сек.

Ответ

a.Если O_NONBLOCK задан для SO_RCVTIMEO и / или SO_SNDTIMEO, то он применим только для этих API, т.е. recv и send API соответственно.

б. Если для блокировки вызова используется API подключения, то да, подключение может блокировать на неопределенный интервал времени.

Ниже ссылка оказалась отличным руководством для понимания внутренних возможностей программирования сокетов.

"http://www.ibm.com/developerworks/aix/library/au-tcpsystemcalls/index.html"

Спасибо всем за то, что ответили на мой вопрос.

0 голосов
/ 15 мая 2010

Вопрос 1: Все, что я там вижу, похоже на AIX. Причина, по которой тайм-аут не указан, заключается в том, что он зависит от протокола. Найдите «connect» в документации IBM (ссылка ниже). Вторым хитом является общее обсуждение, которое может представлять интерес.

Обычно AIX использует модель BSD. Я не уверен, что Linux использует. Я считаю, что это очень близко к традиционной модели BSD, но я также знаю, что она отличается некоторыми тонкостями.

Вопрос 2: Я бы пошел к Документации IBM 5.3 , чтобы выполнить некоторые поиски. Например, он говорит, что SO_RCVTIMEO не используется. Чтобы быть уверенным и уверенным, мне нужно будет сделать несколько экспериментов, но я ожидаю, что соединение с блоком. Я не вижу ничего, что могло бы помешать этому. Это заблокирует навсегда. Часть 2в Я бы сделал один из двух способов. Самый простой способ - установить таймер, и, когда он появится, системный вызов вернется с EINTR. Другой вариант - установить для него значение O_NONBLOCK, а затем использовать select с аргументом timer, чтобы подождать, пока он не подключится или не подключится. Опять же, мне придется экспериментировать и отлаживать код, чтобы быть точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...