CAsyncSocket::Receive
呼叫此成員函式接收通訊端的資料。
virtual int Receive(
void* lpBuf,
int nBufLen,
int nFlags = 0
);
參數
lpBuf
輸入資料的緩衝區。nBufLen
lpBuf 的長度 (以位元組為單位)。nFlags
指定呼叫的方法。通訊端選項和 nFlags 參數取決於函式語意。後者可透過合併下列其中一個值來建構的 C++ OR 運算子:在輸入資料的MSG_PEEK 窺視。資料複製到緩衝區,但從輸入佇列不會移除。
MSG_OOB 處理 Out-of-Band 資料。
傳回值
如果未發生任何錯誤, 接收 傳回所接收的位元組數目。如果關閉連接,它會傳回 0。否則, SOCKET_ERROR 的值,都會傳回,而特定錯誤碼來呼叫 GetLastError擷取。下列錯誤套用至這個成員函式:
WSANOTINITIALISED A 成功 AfxSocketInit 必須在使用此 API 之前發生。
WSAENETDOWN 視窗通訊端實作偵測網路子系統失敗。
WSAENOTCONN 通訊端未連接。
封鎖視窗通訊端作業的WSAEINPROGRESS A 正在進行中。
WSAENOTSOCK 描述元不是通訊端。
WSAEOPNOTSUPP MSG_OOB 已指定,但不是,通訊端類型 SOCK_STREAM。
WSAESHUTDOWN 通訊端已經關閉,,在 ShutDown 叫用 nHow 設為 0 或 2. 之後,呼叫在通訊端上 接收 是不可能的。
WSAEWOULDBLOCK 通訊端標記為未封鎖,並且 接收 作業將會封鎖。
WSAEMSGSIZE 資料包太大而無法符合指定的緩衝區和已截斷。
WSAEINVAL 通訊端未繫結的 繫結。
WSAECONNABORTED 虛擬通道中止的緣故暫止或任何其他失敗。
WSAECONNRESET 虛擬通道由遠端重設。
備註
這個函式會連接至資料流或資料包通訊端使用和來讀取輸入資料。
對於型別 SOCK_STREAM通訊端,相同的資訊與目前可用的所提供的緩衝區的大小決定傳回。如果通訊端為 Out-of-Band Data 處置 (通訊端選項 SO_OOBINLINE) 的內嵌工作,很有趣且 Out-of-Band Data 是未讀取,,只有 Out-of-Band 資料將會傳回。應用程式可以使用 IOCtlSIOCATMARK 選取或 OnOutOfBandData 判斷 Out-of-Band 資料是否仍要讀取。
對於資料包通訊端,資料會從第一個加入佇列的資料包,擷取所提供的緩衝區決定的大小。如果資料包大於所提供的緩衝區,緩衝區會填入資料包的第一個部分,超過的資料將遺失和 接收 傳回 SOCKET_ERROR 的值所設定的錯誤碼的加入至 WSAEMSGSIZE。如果傳入的資料不可在通訊端, SOCKET_ERROR 的值傳回錯誤碼設定為 WSAEWOULDBLOCK。OnReceive 回呼函式可用於判斷詳細資料何時到達。
如果通訊端是型別,並 SOCK_STREAM 遠端順利地關閉連接, 接收 將會立即完成具有 0 接收的位元組。如果連接重設, 接收 因錯誤 WSAECONNRESET。
CAsyncSocket::OnReceive ,每次呼叫,應該只呼叫一次接收 。
範例
CAsyncSocket::OnReceive。請參閱範例。
需求
Header: afxsock.h