2012-07-25 110 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

相关问题