2012-07-25 4 views
1

Я использую зЬй :: вектор для представления буфера в моей в структуре данных ввода-вывода:Какое максимальное количество байтов может получить WSARecv за один раз?

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().

Я посмотрел this page, но не смог найти информацию, которую я ищу.

+0

Это не требует освобождения памяти? Я стараюсь избегать таких вещей на сетевых серверах. Я использую простые массивы и никогда не изменяю их размер. Я не знаю, что такое максимальный размер, но это больше, чем 256K. Вполне возможно, что это 4G на 32-битной системе (ОК, маловероятно на практике :). –

+0

Отъезд [этот ответ] (http://stackoverflow.com/a/2862176/1496544). – Littlegator

+0

@ Littlegator-Спасибо за ссылку! – jpen

ответ

1

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

+0

Да, это именно то, что я собираюсь делать. Приветствие Реми. – jpen

Смежные вопросы