Мне нужно разработать TCP-сервер, способный принимать периодические срочные данные за границей. Я использую библиотеки POCO C ++ для достижения этой цели. В (недостаточной) документации StreamSocket класс, я вижу, что это должно быть очень простой задачей: это нужно сделать, установив флаг SO_OOBINLINE при использовании метода receiveBytes () следующим образом:
n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE );
Чтобы проверить это, я создал очень простой TCP-клиент (также использующий библиотеки POCO), который использует метод sendUrgent () для отправки данных OOB (один байт):
ss1.sendUrgent( 0xFF );
Когда я отправляю данные OOB, ничего не происходит. Сервер, похоже, не замечает этого.
С другой стороны, когда я отправляю «нормальные» данные, используя метод sendBytes (), если на StreamSocket установлен флаг SO_OOBINLINE, я получаю бесконечное количество одних и тех же отправленных данных (он продолжает читать одни и те же данные, хотя никто не повторная отправка).
Что мне не хватает?
редактировать: После предложения @ JimR и чтения этот, Я пытался:
n = ss.receiveBytes( buffer, sizeof(buffer), MSG_OOB );
И даже это:
n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE | MSG_OOB );
Оба вызывают одно и то же исключение: неверный аргумент.
я считать (это было давно) вы должны изменить
n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE );
в
n = ss.receiveBytes( buffer, sizeof(buffer), MSG_OOB );
редактировать: Вместе с вышеуказанными изменениями вам нужно будет позвонить setsockopt
с SO_OOBINLINE
флаг и соответствующие аргументы, поэтому данные OOB будут видны в обычном потоке, а не в отдельном канале. В вашем случае, как указано в комментариях, позвоните ss.setOOBInline(true);
,
SO_OOBINLINE
это опция сокета, используемая с setsockopt
,
MSG_OOB
это флаг для recv
а также send
и компания.
Других решений пока нет …