Re[6]: Вопросы по асинх. TCP серверу с пулом потоков (IOCP)
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 30.01.11 08:37
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

D>>----------------------

D>>Тут ещё вопросики созрели при использовании WSAxxxx в режиме IOCP (MSDN мало что дал):
D>>Что означает если WSARecv возвращает WSAEWOULDBLOCK ?
D>>Что означает если WSASend возвращает WSAEWOULDBLOCK ?

JR>Она всегда означает одно — в данный момент система не может выполнить запрошенную операцию с этим экземпляром сокета, необходимо попробовать повторить её позже. На WSARecv получить её маловероятно, разве что в случае грубой ошибки в логике.


Ну почему же. Есть сообщение о возможности читать, читаем — раз, два, три... на очередной попытке чтения нам говорят, что данных больше нет, вот тогда прекращаем (и запрашиваем следующую нотификацию). Не заводить же сразу буфер на максимальный размер одной посылки? Это будет просто неэкономным.
Так что [WSA]EWOULDBLOCK из чтения — абсолютно нормально.


D>>Может ли WSASend возвратить в lpNumberOfBytesTransferred (параметр ф-ии GetQueuedCompletionStatus) число меньшее чем суммарный размер буферов переданных через параметр LPWSABUF lpBuffers ?

D>>Ну 0 возвратить может (это означает "потерю" клиента).

JR>Теоретически это возможно и должно означать, что на часть данных от корреспондента получена квитанция, после чего связь была потеряна. Однако на практике я такого не встречал.


Это, кстати, крайне странный теоретический вариант — потому что нелогичный код.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.