Как бороться со случаем, когда несколько операций размещены в одном сокете
Я разрабатываю клиентское приложение, которое управляет одним сокетом. Я использую IOCP для управления асинхронным вводом / выводом.
Это цитата из книги по сетевому программированию:
Все перекрывающиеся операции гарантированно выполняются в том порядке, в котором их выдало приложение. Однако уведомления о завершении, возвращаемые из порта завершения, не гарантируются в том же порядке. То есть, если приложение публикует две перекрывающиеся операции WSARecv, одну с буфером 10 КБ, а другую с буфером 12 КБ, сначала заполняется буфер 10 КБ, а затем буфер 12 КБ. Рабочий поток приложения может получить уведомление от GetQueuedCompletionStatus для WSARecv 12 КБ до события завершения для операции 10 КБ. Конечно, это проблема, только когда в сокете размещено несколько операций.
Так как же мне поступить с этим делом?
1 ответ
Самое простое решение состоит в том, чтобы не иметь более одного выдающегося чтения или записи. Таким образом, если уведомление о завершении получено, ясно, что все данные были записаны в сокет. Если, ожидая завершения ввода-вывода, необходимо записать больше данных в сокет, просто зашифруйте эти данные и запишите их, когда завершится ввод-вывод.
Если у вас есть более одного невыполненного ввода-вывода для сокета, вы должны упорядочить их на стороне чтения. Что касается записи, вы должны вести бухгалтерский учет, чтобы знать, какая запись была последней и, следовательно, когда данные были полностью записаны.
С другой стороны, просто запись данных в успешно сокет не означает, что данные были правильно получены или обработаны на другой стороне, поэтому должен быть какой-то протокол. Если это так, вы можете просто положиться на этот протокол и просто искать уведомления об ошибках.