WSASend () с более чем одним буфером - может завершиться не полностью? - PullRequest
1 голос
/ 17 июня 2010

Скажем, я отправляю следующий вызов WSASend (порты завершения ввода-вывода Windows без функций обратного вызова):

void send_data()
{
    WSABUF wsaBuff[2];
    wsaBuff[0].len = 20;
    wsaBuff[1].len = 25;
    WSASend(sock, &wsaBuff[0], 2, ......);
}

Когда я получаю уведомление "write_done" из порта завершения, возможно ли, что wsaBuff [1] будет отправлено полностью (25 байт), а wsaBuff [0] будет отправлено только частично (скажем, 7 байтов)?

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Как я уже говорил ранее, в ответе на один из ваших очень похожих вопросов единственное время, которое может привести к сбою, - это ситуации с ограниченными ресурсами (пул невыгружаемых страниц или заблокированные страницы, скорее всего, ограничивают проблемы), где выможет получить частичное завершение и возврат ошибки ENOBUFS.И снова, как я уже говорил, за 10 лет работы по разработке IOCP я никогда не рассматривал это как проблему на производстве, только в ситуациях, когда мы подвергались стресс-тестированию системы до смерти (буквально, иногда как не страничные страницы).Исчерпание пула может иногда приводить к тому, что драйверы с плохим поведением приводят к появлению синего экрана).

Я бы посоветовал вам просто добавить некоторый код для регистрации ошибки, закрыть сокет, и все, вы столкнулись с возможностьюнеудача и может двигаться дальше.Я был бы удивлен, если ваш код обработки ошибок когда-либо выполняется.Но вы можете быть уверены, что будете знать, если это так, и, как только вы сможете воспроизвести проблему, вы сможете потратить больше времени на размышления о том, действительно ли вам нужно решить ее лучше.

0 голосов
/ 17 июня 2010

Поскольку WSASend является предпочтительным способом выполнения операций ввода-вывода с перекрытием, он не будет иметь никакого смысла, если он будет завершен, пока он не завершен - уведомление о завершении / подпрограмма / событие является единственным способом для приложения очистить / утилизировать использованные структуры. .

Также: НЕТ, это невозможно, один WSASend вызов по-прежнему является одним вызовом ввода-вывода, независимо от используемых буферов.

...