Информация об изменениях

Сообщение Re[3]: Порты завершения и все что с ними связано от 20.05.2021 10:15

Изменено 20.05.2021 10:35 ononim

Re[3]: Порты завершения и все что с ними связано
O>>На всякий случай отвечу на вопрос типа 'а зачем он мне его возвращает я ведь его сам знаю?' — затем что если вы запустили 100500 параллельных WSASend, по этому указателю вы сможете понять к какому именно из них относится этот результат.
O>Вообще соответствие пакета, который мы достали из очереди с помощью GetQueuedCompletionStatus — и одного из 100500 параллельных WSASend — идентифицируется через CompletionKey.
O>А поэтому вопрос остается, зачем тогда передавать адрес указателя на структуру WSAOVERLAPPED, чтобы в итоге получить ее адрес

CompletionKey ассоциирован с файлом, а не с операцией. И если вы запускаете не более одной операции над файлом — это не значит что их нельзя запустить 1000500. Или запустить одновременно WSASend и WSARecv.
Re[3]: Порты завершения и все что с ними связано
O>>На всякий случай отвечу на вопрос типа 'а зачем он мне его возвращает я ведь его сам знаю?' — затем что если вы запустили 100500 параллельных WSASend, по этому указателю вы сможете понять к какому именно из них относится этот результат.
O>Вообще соответствие пакета, который мы достали из очереди с помощью GetQueuedCompletionStatus — и одного из 100500 параллельных WSASend — идентифицируется через CompletionKey.
O>А поэтому вопрос остается, зачем тогда передавать адрес указателя на структуру WSAOVERLAPPED, чтобы в итоге получить ее адрес

Во первых: CompletionKey ассоциирован с файлом, а не с операцией. И если вы запускаете не более одной операции над файлом — это не значит что их нельзя запустить 1000500. Или запустить одновременно WSASend и WSARecv.


Во вторых: Даже если у вас per-file всегда работает лишь одна операция, то OVERLAPPED структуру можно завернуть в объект-состояние подключения, и получить его простым тайп-кастом, а не lookup-ом по мапе:
struct ConnectionState
{
    WSAOVERLAPPED ovl;
    int some;
    int private;
    int information;
};
struct ConnectionState *cs = malloc(sizeof(struct ConnectionState));
WSASend(...&cs->ovl);
...

и потом так ненавязчиво:
WSAOVERLAPPED *povl;
GetQueuedCompletionStatus(...&povl);
struct ConnectionState *cs = (struct ConnectionState *)povl;