WSARecv

在重疊模型中,接收數據就要靠它了,它的參數也比recv要多,因為要用到重疊結構

基本介紹

  • 中文名:WSARecv
  • 接收緩衝區:LPWSABUF lpBuffers, // 
  • 標誌位的指針:LPDWORD lpFlags, // 
  • 重疊結構:LPWSAOVERLAPPED 
簡介,代碼示例,

簡介

在重疊模型中,接收數據就要靠它了,它的參數也比recv要多,因為要用到重疊結構嘛,它是這樣定義的:
int WSARecv(
SOCKET s, // 當然是投遞這個操作的套接字
,與Recv函式不同
// 這裡需要一個由WSABUF結構構成的數組
DWORD dwBufferCount, // 數組中WSABUF結構的數量
LPDWORD lpNumberOfBytesRecvd, // 如果接收操作立即完成,這裡會返回函式調用所接收到的位元組數
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // 完成例程中將會用到的參數,我們這裡設定為 NULL
);
返回值:
WSA_IO_PENDING : 最常見的返回值,這是說明我們的WSARecv操作成功了,但是I/O操作還沒有完成,所以我們就需要綁定一個事件來通知我們操作何時完成

代碼示例

:(變數的定義順序和上面的說明的順序是對應的)
SOCKET s;
WSABUFDataBuf; // 定義WSABUF結構的緩衝區
// 初始化一下DataBuf
#defineDATA_BUFSIZE 4096
charbuffer[DATA_BUFSIZE];
ZeroMemory(buffer,DATA_BUFSIZE);
DataBuf.len= DATA_BUFSIZE;
DataBuf.buf= buffer;
DWORDdwBufferCount = 1, dwRecvBytes = 0, Flags = 0;
// 建立需要的重疊結構
WSAOVERLAPPEDAcceptOverlapped ;// 如果要處理多個操作,這裡當然需要一個WSAOVERLAPPED數組
WSAEVENTevent; // 如果要多個事件,這裡當然也需要一個WSAEVENT數組
// 需要注意的是可能一個SOCKET同時會有一個以上的重疊請求, 也就會對應一個以上的WSAEVENT
Event =WSACreateEvent();
ZeroMemory(&AcceptOverlapped,sizeof(WSAOVERLAPPED));
AcceptOverlapped.hEvent= event; // 最關鍵的一步,把事件句柄“綁定”到重疊結構上
WSARecv(s,&DataBuf, dwBufferCount, &dwRecvBytes,&Flags,&AcceptOverlapped, NULL); // 使用WSARecv來把請求投遞到重疊結構上了|

相關詞條

熱門詞條

聯絡我們