Re[2]: Есть вопрос по работе с сокетом через порты завершени
От: s3dworld Россия  
Дата: 26.09.11 13:10
Оценка:
Здравствуйте, 11molniev, Вы писали:

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

1>.....
S>>Мне не понятно поведение системы в такой вот ситуации: я вызываю WSASend() и прошу её передать 75 МБ (размер выбрал для наглядности примера). Соединение с сокетом существует, операция не может быть выполнена мгновенно, в результате я получу ошибку WSA_IO_PENDING (собственно это успешная ошибка). Я занимаюсь своими делами, а система за меня отсылает данные (видимо тут я только должен позаботиться чтобы буфер с отсылаемыми данными не накрылся при выходе из области видимости, в которой вызывалась WSASend(), то есть сделать его не на стеке как в приведённом выше примере). Через 40 секунд сервер (а может и я сам) завершает соединение со мной, но я успел передать только 13 МБ. Функция GetQueuedCompletionStatus() передаст управление. И вопрос к Вам, что она мне вернёт?

1>Скока передаст столько и вернет. Тоже относиться и к синхронному выполнению WSASend.

То есть получается, что когда я хочу передать 7 МБ, на порт завершения может прийти уведомление,где в параметре lpNumberOfBytes я получу 3 МБ и мне нужно снова вызвать WSASend() чтобы отправить не отправленные 4 МБ (не подумайте что я буду отправлять заново весь буфер, только то, что не отправилось)? Вообще странное поведение для асинхронной функции. Я то думал что если я хочу отправить 7 МБ, то она хоть в лоб разобъётся, но в порт отправится пакет либо если все 7 МБ передаст, либо если произойдёт ошибка. А тот через задницу.

А если в момент асинхронной операции произойдёт отключение сокета, где я могу получить код ошибки после получения управления от GetQueuedCompletionStatus()? Просто вызвав GetLastError()?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.