tcpserver — отправка и получение данных OOB через TCP-соединение с использованием переполнения стека POCO

Мне нужно разработать 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 );

Оба вызывают одно и то же исключение: неверный аргумент.

1

Решение

я считать (это было давно) вы должны изменить

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 и компания.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]