2012-07-25 103 views
1

我使用的std ::載體,以表示我的每IO數據結構的緩衝區: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; 

我想指定的最大大小,並執行「縮小以適合」,呼籲的WSARecv後m_vecBuffer()。我看過this page,但找不到我要找的信息。

+0

這不需要內存釋放嗎?我嘗試在網絡服務器中避免這種情況。我使用普通數組並且從不調整它們。我不知道最大尺寸是多少,但是它大於256K。很可能它是32位系統上的4G,(可以,實際上不太可能)。 – 2012-07-25 14:26:42

+0

看看[這個答案](http://stackoverflow.com/a/2862176/1496544)。 – Littlegator 2012-07-25 16:12:47

+0

@ Littlegator-感謝您的鏈接! – jpen 2012-07-25 16:22:12

回答

1

傳遞給WSARecv()WSABUF結構指定了一個指向緩衝區的指針,該緩衝區指向WSARecv()讀取的字節數以及可以讀入該緩衝區的最大字節數。當WSARecv()完成其工作時,它會報告實際讀入緩衝區的字節數。如果使用vector作爲緩衝區,則必須預先將矢量分配給任意最大大小,然後將WSABUF::buf設置爲指向矢量的內部存儲器,將WSABUF::len設置爲矢量的分配大小,然後將矢量大小調整爲WSARecv()報告的新值。

+0

是的,這正是我要做的。乾杯雷米。 – jpen 2012-07-25 21:19:55

相關問題