Как мне обрабатывать частичные завершения записи из перекрывающихся операций ввода-вывода с использованием портов завершения ввода-вывода - PullRequest
2 голосов
/ 15 июня 2010

На портах завершения ввода / вывода Windows, скажем, я делаю это:

void function()
{
    WSASend("1111"); // A
    WSASend("2222"); // B
    WSASend("3333"); // C
}

Если я получил «завершение записи», в котором говорится, что 3 байта WSASend () A были отправлены, возможно ли, чтосразу после этого я получу «запись завершена», которая сообщит мне, что некоторые или все B & C были отправлены, или TCP будет удерживать их, пока я не выполню повторный вызов WSASend () с остальными данными A?Или TCP завершит это автоматически?

1 Ответ

4 голосов
/ 15 июня 2010

Я разрабатываю клиентские и серверные системы с IOCP уже более 10 лет, и я никогда не видел частичного завершения записи при обычном использовании. Вы МОЖЕТЕ получить их, но если вы это сделаете, то, скорее всего, ваш сервер все-таки хрен; вы, скорее всего, получите завершение записи с ошибкой ENOBUFS, которая, как правило, означает, что вы исчерпали пул невыгружаемых страниц или превысили лимит заблокированных страниц.

ИМХО, вы должны управлять своими ресурсами так, чтобы никогда не превышать эти ограничения операционной системы.

Если завершение записи возвращает меньше, чем количество байтов, которое, по вашему мнению, должно было быть записано, то на самом деле мало что можно сделать, чтобы восстановить, если у вас есть еще ожидающие записи. В приведенном в вашем вопросе примере, если произошел сбой A, вы могли бы действительно отключить соединение, так как B и C могли бы преуспеть. На практике вам не нужно беспокоиться о чем-то большем.

Если вы знаете, что у вас больше нет ожидающих записи по этому соединению, тогда вы МОЖЕТЕ выполнить другую запись для записи последующих данных.

И TCP не входит в это вообще.

...