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