WSARecv()

WSARecv()是從一個套接口接收數據的程式。主要用於在重疊模型中接收數據。

基本介紹

  • 外文名:WSARecv()
  • 簡述:從一個套接口接收數據。
  • 用途:在重疊模型中,用於接收數據
  • 性質:函式
簡述,概述,返回值,錯誤代碼,

簡述

#include <winsock2.h>
int WSAAPI WSARecv (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPINT lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
s:一個標識已連線套接口的描述字。
lpBuffers:一個指向WSABUF結構數組指針。每一個WSABUF結構包含一個緩衝區的指針和緩衝區的長度。
dwBufferCount:lpBuffers數組中WSABUF結構的數目。
lpNumberOfBytesRecvd:如果接收操作立即結束,一個指向本調用所接收的位元組數的指針。
lpFlags:一個指向標誌位的指針。
lpOverlapped:一個指向WSAOVERLAPPED結構的指針(對於非重疊套接口則忽略)。
lpCompletionRoutine:一個指向接收操作結束後調用的例程指針(對於非重疊套接口則忽略)。

概述

WSARecv
在重疊模型中,接收數據就要靠它了,它的參數也比recv要多,因為要用到重疊結構嘛,它是這樣定義的:
int WSARecv(
SOCKET s, // 當然是投遞這個操作的套接字
LPWSABUF lpBuffers, // 接收緩衝區,與Recv函式不同
// 這裡需要一個由WSABUF結構構成的數組
DWORD dwBufferCount, // 數組中WSABUF結構的數量
LPDWORD lpNumberOfBytesRecvd, //用於異步操作, 如果接收操作立即完成,這裡會返回函式調用所接收到的位元組數
LPDWORD lpFlags, // 和函式socket()一樣,和用來控制套接字的行為,例如,指出當前當前套接字是面向流的還是面向訊息的。通常設定為0。
LPWSAOVERLAPPED lpOverlapped, // “綁定”的重疊結構。非重疊操作(或非異步操作)可忽略。 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // 完成例程中將會用到的參數,在異步操作中,本參數可設定為NULL。非重疊操作(或非異步操作)忽略。
);

返回值

對於非重疊(非異步的)的操作,函式返回大於0的值表示操作成功。返回0表示連線中斷,此時需要釋放套接字資源。返回SOCKET_ERROR(-1),表示出錯,使用WSAGetLastError()獲取出錯的原因。.就非重疊操作而言,其語義與標準recv函式是相同的。
對於異步操作,若無錯誤發生且接收操作立即完成,則WSARecv()函式返回0,請注意在這種情況下完成指示(啟動指定的完成例程或設定一個事件對象)將早已發生。否則的話,將返回SOCKET_ERROR錯誤,應用程式可通過WSAGetLastError()來獲取相應的錯誤代碼。錯誤代碼WSA_IO_PENDING表示重疊操作成功啟動,過後將有完成指示。任何其他的錯誤表示重疊操作未能成功地啟動,以後也不會有完成指示。
如果設定了MSG_INTERRUPT標誌,則返回值的含義變化。零表示成功,具體含義同上。否則的話,返回值直接包含如下所示的錯誤代碼。由於中斷環境中無法調用WSAGetLastError(),故是必需的。請注意僅適用於Win16環境,僅適用於PROTOCOL_INFO結構中設定了XP1_INTERRUPT位的協定

錯誤代碼

WSANOTINITIALISED 在調用本API之前應成功調用WSAStartup()。
WSAENETDOWN 網路子系統失效。
WSAENOTCONN 套接口未連線。
WSAEINTR 通過WSACancelBlockingCall()函式取消(阻塞)調用。
WSAEINPROGRESS 一個阻塞的WinSock調用正在進行中,或者服務提供者仍在處理一個回調函式
WSAENETRESET 由於遠端的復位造成連線的中止。
WSAENOTSOCK 描述字不是一個套接口
WSAEOPNOTSUPP 設定了MSG_OOB,但是該套接口不是諸如SOCK_STREAM流類型的,與套接口相關的通訊域不支持帶外數據,或者套接口是單向的,只支持傳送操作。
WSAESHUTDOWN 套接口已經關閉;一個套接口以SD_RECEIVE或 SD_BOTH的how參數shutdown()後,無法進行WSARecv()調用。
WSAEWOULDBLOCK 重疊套接口:太多重疊的輸入/輸出請求。非重疊套接口:套接口被標誌為非阻塞,但是操作不能立即完成。
WSAEINVAL 套接口未用bind()捆綁,或者套接口未用重疊標誌創建。
WSAECONNABORTED 由於逾時或其他錯誤導致虛電路中止。
WSAECONNRESET 虛電路被遠端復位。
WSAEDISCON 遠端優雅的結束了連線。
WSA_IO_PENDING 成功啟動一個重疊操作,過後將有完成指示。
另請參閱: WSACloseEvent(),WSACreateEvent(),WSAGetOverlappedResult(), WSASocket(),WSAWaitForMultipleEvents()

相關詞條

熱門詞條

聯絡我們