Как установить тайм-аут при подключении / отправке? (as400 iseries v5r4, rpg)

Из этого руководства по сокету rpg мы создали клиент сокета в rpg, который вызывает java серверный сокет

Проблема в том, что операции connect () / send () блокируются, и у нас есть требование, согласно которому, если подключение / отправка не может быть выполнено в считанные секунды, мы должны просто зарегистрировать его и завершить.

Если я установлю сокет в неблокирующий режим (я думаю, с помощью fnctl), мы не полностью понимаем, как действовать, и не можем найти никакой полезной документации с примерами для него.

Я думаю, что если я подключаюсь к неблокирующему сокету, мне нужно сделать select (..., timeout), который сообщает нам, успешно ли соединение и / мы можем отправить (байты). Но, если мы отправим (байты) впоследствии, поскольку теперь это неблокирующий сокет (который немедленно вернется после вызова), как я узнаю, что send () действительно отправил байты на сервер перед закрытием разъем ?

Я могу вернуться к тому, чтобы клиентский сокет в AS400 был процедурой Java или C, но я действительно хочу сохранить его в простой программе RPG.

Кто-нибудь поможет мне понять, как это сделать, пожалуйста? Спасибо !


person David Hofmann    schedule 19.08.2010    source источник


Ответы (1)


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

...
Следовательно, мы обычно вызываем API send () следующим образом:

D miscdata        S             25A
D rc              S             10I 0

C                   eval      miscdata = 'The data to send goes here'
C                   eval      rc = send(s: %addr(miscdata): 25: 0)
c                   if        rc < 25
C*  for some reason we weren't able to send all 25 bytes!
C                   endif

...

Если вы прочитаете документацию send(), вы увидите, что возвращаемое значение не указывает на ошибку, если оно больше -1, но в приведенном выше коде кажется, что произошла ошибка. Фактически, сумма возвращаемых значений должна равняться размеру буфера, предполагая, что вы продолжаете перемещать указатель в буфер, чтобы отразить то, что было отправлено. Посмотрите здесь в Руководство Beej по сетевому программированию. Вы также можете посмотреть книгу Ричарда Стивенса Сетевое программирование UNIX, том 1 для действительно подробные объяснения.

Что касается проблемы определения, была ли последняя отправка перед close() фактической отправкой ... ну, в параграфе выше объясняется, как определить, какая часть данных была отправлена. Однако при вызове close() будет предпринята попытка отправить все неотправленные данные, если не установлено SO_LINGER.

fnctl() используется для управления блокировкой, а setsockopt() используется для установки SO_LINGER.

Используемая абстракция сетевых коммуникаций - это сокеты BSD. Существуют небольшие различия в реализациях в разных ОС, но в целом они довольно однородны. Это означает, что для широкого обзора обычно можно использовать документацию, написанную для других ОС. В большинстве случаев.

person Allen    schedule 28.08.2010