Здравствуйте, 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()?