Ситуация:
В одном потоке с помощью функции WSASend() отправляем определённое количество байт с помощью какого-либо сокета.
В другом потоке с помощью функции GetQueuedCompletionStatus() вынимаем из completion port уведомления об отправке.
Вопрос:
Может ли в completion port прийти уведомление с КОЛИЧЕСТВОМ БАЙТ, МЕНЬШИМ, чем переданное в функцию WSASend()?
О! Вызывает глубокий интерес, при каких ИМЕННО обстоятельствах это произойдёт?
Re[3]: Overlapped sockets
От:
Аноним
Дата:
17.12.08 14:09
Оценка:
Здравствуйте, avesus, Вы писали:
A>Здравствуйте, Gomes, Вы писали: G>>Да.
A>О! Вызывает глубокий интерес, при каких ИМЕННО обстоятельствах это произойдёт?
например посылаете большой объем данных
часть доставлена и подтверждена а часть нет (например обрыв)
скорее всего вы получите ошибку, так что досылать оставшееся повторно смысла нет
т.е. на практике я не видел ни разу что-бы отосланных реально было меньше чем отдано на отправку но ошибки не было
хотя апи позволяет и такой сценарий, но придумать обстоятельства я не могу
Здравствуйте, avesus, Вы писали:
A>Вопрос: A> Может ли в completion port прийти уведомление с КОЛИЧЕСТВОМ БАЙТ, МЕНЬШИМ, чем переданное в функцию WSASend()?
Ну по крайней мере в одном случае да: система отправила меньше байт, чем вы просили, после чего соединение закрылось по независящим от нее обстоятельствам. Например, по таймауту или из-за того, что с другой стороны пришел TCP RST.
Правильный вопрос: следует ли из того, что пришло уведомление с меньшим количеством байт, чем вы просили передать то, что сокет сломался и больше в него ничего послать нельзя? Я не знаю ответ на этот вопрос, но если это явно не обещано в MSDN, я бы не стал на это рассчитывать.
Re[5]: Overlapped sockets
От:
Аноним
Дата:
18.12.08 06:10
Оценка:
Здравствуйте, avesus, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>хотя апи позволяет и такой сценарий, но придумать обстоятельства я не могу
A>А каким образом апи позволяет такой сценарий, чтобы в Completion Port пришло меньше байт, чем было передано в WSASend() ?
Ээ, опять 25... Вы с этого начали свой первый вопрос. апи возвращает error = 0, xfer < bytes_sent.
Как такое может быть я не очень представляю. Но апи такой вариант предложить теоретически может.
Кстати говоря, давным давно, в блокирующем send() я на такое нарывался в ледующем сценарии:
1-идет много send(), естественно они отдаются мнгновенно, скопировав данные из моего буфера в системный
2-идет send() но в системном буфере осталось места меньше моего буфера но > 0 — тогда send() копировал часть
и возвращал мне сколько реально он скопировал, если системный буфер был вообще пуст (следующий вызов)
то send() блокировался до освобождения места. Я уже и не помню даже, был ли это майкрософтовский tcp стек или сторонний.
A>P.S.: Система работает в очень жёстких условиях (должна выживать вплоть до полного креша винды).
Ну... могу вас уверить, 99.9% креша это не винды а кривые драйверы или приложения. Пишем аккуратно!