Очистить сокет в переполнении стека

Я попытался очистить сокет после вызова send функция в с ++.
я использовал winsock2.h библиотека.

Мне нужно отправить данные сразу после отправки сообщения, но я не могу найти такую ​​функцию, как flash функция.

Я пытаюсь отправить сообщения на устройство, и оно ожидает получения сообщений одно за другим.
Я имею в виду, что если я отправляю в отправителе два сообщения, например «MessageOne» и «MessageTwo», получатель получает сообщение «MessageOneMessageTwo», которое не является отдельным, и устройство не распознает команды.

Так как я могу это сделать?

0

Решение

Вы ничего не можете сделать на Отправить сторона, чтобы сделать Получать сторона получает сообщения «по одному». Ответственность за правильную реконструкцию отправленных кадров («сообщений») несет полностью принимающая сторона. Полученный код должен знать длину сообщения как-то (полностью зависит от протокола) и получать столько данных, сколько необходимо для построения целого кадра (обычно это достигается отправкой recv с заданной длиной и указанным, который интересует только весь буфер, например. MSG_WAITALL флаг). Мне очень трудно поверить, что ваше устройство не знает, как справиться с этим, и если это действительно так, то буквально ничего такого ты можешь сделать. Мне кажется, как-то более вероятно, что вы не понимаете требований к устройству / протоколу и задаете не тот вопрос.

6

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

Для сокетов нет функции «сброса». Если вам нужно отправить два сообщения в быстрой последовательности, просто отправьте их. Если это сокет TCP, они будут доставлены в правильном порядке (в том порядке, в котором вы их отправили).

Эта модель на самом деле не редкость; Сначала отправьте заголовок сообщения, а затем отдельную отправку данных сообщения.

1

Точный ответ на ваш вопрос о схеме пакета с примером из Winsock FAQ

0

Насколько мне известно, на самом деле не существует способности «сбрасывать». функция send возвращает количество отправленных байтов, поэтому вы можете выполнять цикл до тех пор, пока не будут отправлены все байты.

Редактировать:
Чтобы добавить к тому, что я прочитал, вы хотите от других пользователей. Единственный известный мне способ увеличить «внутренний буфер» (очистка — это то, что winsock делает самостоятельно) — это setockopt, используя опцию so_sendbuf.

Статья, касающаяся этого:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx

0

установите параметры сокета на NDELAY на стороне отправки

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