Какое максимальное количество байтов WSARecv может получить за один раз?

Я использую std :: vector для представления буфера в моей структуре данных ввода-вывода:

struct PerIoData 
{
    WSAOVERLAPPED m_overlapped;
    SOCKET m_socket;
    WSABUF m_wsaBuf;
    std::vector<BYTE> m_vecBuffer;
    DWORD m_dwFlags;
    DWORD m_dwNumberOfBytesSent;
    DWORD m_dwNumberOfBytesToSend;
    eOperationType m_operationType;
};

...
...
if (WSARecv(pPerIoData->m_socket, &(pPerIoData->m_wsaBuf), 1, &dwNumberOfBytesReceived, &(pPerIoData->m_dwFlags), &(pPerIoData->m_overlapped), NULL) == 0)
    continue;

Я хочу указать максимальный размер и выполнить «сжатие по размеру» для m_vecBuffer после вызова WSARecv ().

Я просмотрел эту страницу, но мне не удалось найти нужную информацию.


person jpen    schedule 25.07.2012    source источник
comment
Разве для этого не потребуется освобождение памяти? Я стараюсь избегать таких вещей на сетевых серверах. Я использую простые массивы и никогда не меняю их размер. Не знаю, какой максимальный размер, но он больше 256К. Вполне возможно, что это 4G на 32-битной системе (ладно, на практике маловероятно :).   -  person Martin James    schedule 25.07.2012
comment
Ознакомьтесь с этим ответом.   -  person Littlegator    schedule 25.07.2012
comment
@ Littlegator-Спасибо за ссылку!   -  person jpen    schedule 25.07.2012


Ответы (1)


Структура WSABUF, которую вы передаете WSARecv(), определяет указатель на буфер, в который WSARecv() считывает байты, и максимальное количество байтов, которое может быть прочитано в этот буфер. Когда WSARecv() завершает свою работу, он сообщает, сколько байтов было фактически прочитано в буфер. Если вы используете vector в качестве буфера, вам необходимо предварительно выделить вектор для любого максимального размера, который вы хотите, затем установить WSABUF::buf, чтобы он указывал на внутреннюю память вектора, установите WSABUF::len на выделенный размер вектора, а затем измените размер вектора на новое значение, о котором сообщает WSARecv().

person Remy Lebeau    schedule 25.07.2012
comment
Да, это именно то, что я собираюсь сделать. Ура, Реми. - person jpen; 26.07.2012