Overlapped sockets
От: avesus Россия  
Дата: 17.12.08 10:50
Оценка:
Ситуация:
В одном потоке с помощью функции WSASend() отправляем определённое количество байт с помощью какого-либо сокета.
В другом потоке с помощью функции GetQueuedCompletionStatus() вынимаем из completion port уведомления об отправке.

Вопрос:
Может ли в completion port прийти уведомление с КОЛИЧЕСТВОМ БАЙТ, МЕНЬШИМ, чем переданное в функцию WSASend()?
win32 api overlapped sockets comletion port
Re: Overlapped sockets
От: Gomes Россия http://irazin.ru
Дата: 17.12.08 11:47
Оценка:
Здравствуйте, avesus, Вы писали:

A> Может ли в completion port прийти уведомление с КОЛИЧЕСТВОМ БАЙТ, МЕНЬШИМ, чем переданное в функцию WSASend()?

Да.
Re[2]: Overlapped sockets
От: avesus Россия  
Дата: 17.12.08 12:22
Оценка:
Здравствуйте, Gomes, Вы писали:
G>Да.

О! Вызывает глубокий интерес, при каких ИМЕННО обстоятельствах это произойдёт?
Re[3]: Overlapped sockets
От: Аноним  
Дата: 17.12.08 14:09
Оценка:
Здравствуйте, avesus, Вы писали:

A>Здравствуйте, Gomes, Вы писали:

G>>Да.

A>О! Вызывает глубокий интерес, при каких ИМЕННО обстоятельствах это произойдёт?


например посылаете большой объем данных
часть доставлена и подтверждена а часть нет (например обрыв)
скорее всего вы получите ошибку, так что досылать оставшееся повторно смысла нет
т.е. на практике я не видел ни разу что-бы отосланных реально было меньше чем отдано на отправку но ошибки не было
хотя апи позволяет и такой сценарий, но придумать обстоятельства я не могу
Re[4]: Overlapped sockets
От: avesus Россия  
Дата: 17.12.08 14:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>хотя апи позволяет и такой сценарий, но придумать обстоятельства я не могу


А каким образом апи позволяет такой сценарий, чтобы в Completion Port пришло меньше байт, чем было передано в WSASend() ?

P.S.: Система работает в очень жёстких условиях (должна выживать вплоть до полного креша винды).
Re: Overlapped sockets
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.08 00:06
Оценка:
Здравствуйте, 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% креша это не винды а кривые драйверы или приложения. Пишем аккуратно!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.