Потеря данных Winsock2 в отладчике

#c #winsock #winsock2 #overlapped-io

#c #winsock #winsock2 #перекрытый ввод-вывод

Вопрос:

я использую Winsock2 в сочетании с перекрытым вводом-выводом. Это означает, что я вызываю WSARecv с WSAOVERLAPPED структурой, а позже я жду данных с помощью WSAWaitForMultipleEvents.

Я сделал странное наблюдение, что, похоже, я теряю любые данные, которые отправляются в мое приложение, когда я останавливаю его с помощью отладчика. Я думал, что эти данные скопятся где-нибудь в ОС, а затем будут доставлены при следующем вызове WSARecv.

Мое предположение неверно?

Комментарии:

1. где-то еще в вашем коде должна быть какая-то ошибка, ситуация, которую вы описали, не должна порождать эту ошибку, и где-то в ОС есть скопление данных, если они не доставлены в вашу программу. но у самой ОС есть некоторые ограничения, я не знаю, что произойдет, если она переполнится.

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

Ответ №1:

UDP или TCP?

Я предполагаю, что вы используете отдельную ПЕРЕКРЫВАЮЩУЮСЯ структуру для каждого вызова и отдельное событие для каждой структуры.

Имейте в виду, что использование перекрывающегося ввода-вывода с событиями не особенно масштабируемо, гораздо проще просто связать сокет с портом завершения ввода-вывода и полностью пропустить все события.

Комментарии:

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

2. Да, но отладчик может привести к тому, что любые условия гонки будут появляться чаще… Можем ли мы увидеть какой-нибудь код?