Как быть в случае, когда несколько операций размещаются в одном и том же сокете

Я разрабатываю клиентское приложение, которое управляет одним сокетом. Я использую IOCP для управления асинхронным вводом-выводом.

Это цитата из книги по сетевому программированию:

Все перекрывающиеся операции гарантированно выполняются в том порядке, в котором их выдало приложение. Однако не гарантируется, что уведомления о завершении, возвращаемые из порта завершения, будут в том же порядке. То есть, если приложение отправляет две перекрывающиеся операции WSARecv, одну с буфером 10 КБ, а другую с буфером 12 КБ, сначала заполняется буфер 10 КБ, а затем буфер 12 КБ. Рабочий поток приложения может получить уведомление от GetQueuedCompletionStatus для WSARecv размером 12 КБ до события завершения для операции размером 10 КБ. Конечно, это проблема только тогда, когда на сокете размещено несколько операций.

Итак, как мне поступить в этом случае?


person jpen    schedule 26.07.2012    source источник


Ответы (1)


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

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

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

person Torsten Robitzki    schedule 26.07.2012
comment
+1, самый простой способ справиться с этим - не иметь с ним дела! У меня был аналогичный подход для класса сокетов IOCP, и он использовал свой собственный список буферов для отправки, чтобы обойти эту проблему. По мере выполнения каждого запроса будут передаваться следующие. Все потокобезопасно, конечно;) - person Moo-Juice; 26.07.2012