Как приостановить сервер сокетов IOCP TCP?

Моя программа похожа на HTTP-прокси, она ожидает сообщения на интерфейсе и перенаправляет их на другой интерфейс. Приложение использует только IOCP, как на стороне клиента, так и на стороне сервера. Иногда клиент работает медленнее (в соотношении 10 или 100), чем сервер, который не может буферизовать слишком много данных. Как я могу приостановить установленное TCP-соединение, а затем возобновить его без потери сообщений? Я пытался отложить публикацию нового события recv IOCP, но некоторые сообщения теряются. С++/Windows 7+


person Olivier    schedule 19.09.2015    source источник
comment
Договоритесь о меньшем размере скользящего окна, равном объему данных, которые вы хотите буферизовать при одном соединении.   -  person Ben Voigt    schedule 19.09.2015


Ответы (1)


Я пытался отложить публикацию нового события recv IOCP

На самом деле это должно помочь. Буфер приема вашего TCP-соединения на стороне сервера затем заполнится до размера буфера приема, установленного в вашем сокете, после чего сокет вернется к отправляющей стороне этого сокета, что - стандартными средствами управление потоком TCP — просто прекращает отправку дополнительных пакетов, пока получатель не просигнализирует об обработке большего количества сообщений.

Теперь от отправляющей стороны зависит, как долго она хочет ждать (тайм-аут) перед отключением.

"некоторые сообщения потеряны"

Это может произойти только с TCP, если вы отключитесь, о чем уведомят и отправитель, и получатель. Таким образом, данные не просто теряются. Это зависит от вашего сетевого протокола поверх TCP, хотя может ли приложение-отправитель знать, сколько сообщений успешно обработано принимающим приложением (в данном случае вашим прокси-сервером).

person Evgeniy Berezovsky    schedule 08.10.2015
comment
Спасибо, поведение TCP-стека при задержке сообщений мне было непонятно. - person Olivier; 09.10.2015