CAsyncSocket::ReceiveFromEx
呼叫此成員函式接收資料包和儲存來源位址在 SOCKADDR 結構或在 rSocketAddress (處理 IPv6 位址)。
int ReceiveFromEx(
void* lpBuf,
int nBufLen,
CString& rSocketAddress,
UINT& rSocketPort,
int nFlags = 0
);
參數
lpBuf
輸入資料的緩衝區。nBufLen
lpBuf 的長度 (以位元組為單位)。rSocketAddress
out 接收已虛線的數字 IP 位址的 CString 物件的參考。rSocketPort
儲存連接埠。 UINT 的參考。nFlags
指定呼叫的方法。通訊端選項和 nFlags 參數取決於函式語意。後者可透過合併下列其中一個值來建構的 C++ OR 運算子:在輸入資料的MSG_PEEK 窺視。資料複製到緩衝區,但從輸入佇列不會移除。
MSG_OOB 處理 Out-of-Band 資料。
傳回值
如果未發生任何錯誤, ReceiveFromEx 傳回所接收的位元組數目。如果關閉連接,它會傳回 0。否則, SOCKET_ERROR 的值,都會傳回,而特定錯誤碼來呼叫 GetLastError擷取。下列錯誤套用至這個成員函式:
WSANOTINITIALISED A 成功 AfxSocketInit 必須在使用此 API 之前發生。
WSAENETDOWN 視窗通訊端實作偵測網路子系統失敗。
WSAEFAULTlpSockAddrLen 引數無效: lpSockAddr 緩衝區太小而無法容納對等電腦位址。
封鎖視窗通訊端作業的WSAEINPROGRESS A 正在進行中。
WSAEINVAL 通訊端未繫結的 繫結。
WSAENOTCONN 通訊端未連接SOCK_STREAM (僅限)。
WSAENOTSOCK 描述元不是通訊端。
WSAEOPNOTSUPP MSG_OOB 已指定,但不是,通訊端類型 SOCK_STREAM。
WSAESHUTDOWN 通訊端已經關閉,,在 ShutDown 叫用 nHow 設為 0 或 2. 之後,呼叫在通訊端上 ReceiveFromEx 是不可能的。
WSAEWOULDBLOCK 通訊端標記為未封鎖,並且 ReceiveFromEx 作業將會封鎖。
WSAEMSGSIZE 資料包太大而無法符合指定的緩衝區和已截斷。
WSAECONNABORTED 虛擬通道中止的緣故暫止或任何其他失敗。
WSAECONNRESET 虛擬通道由遠端重設。
備註
這個函式在 (可連接) 通訊端用來讀取輸入資料和擷取資料傳送到的位址。
這個函式和相同,但是它 CAsyncSocket::ReceiveFrom 處理 IPv6 位址和舊版的通訊協定。
對於型別 SOCK_STREAM通訊端,相同的資訊與目前可用的所提供的緩衝區的大小決定傳回。如果通訊端為 Out-of-Band Data 處置 (通訊端選項 SO_OOBINLINE) 的內嵌工作,很有趣且 Out-of-Band Data 是未讀取,,只有 Out-of-Band 資料將會傳回。應用程式可以使用 IOCtlSIOCATMARK 選取或 OnOutOfBandData 判斷 Out-of-Band 資料是否仍要讀取。lpSockAddr 和 lpSockAddrLen 參數為 SOCK_STREAM 通訊端會被忽略。
對於資料包通訊端,資料會從第一個加入佇列的資料包,擷取所提供的緩衝區決定的大小。如果資料包大於所提供的緩衝區,緩衝區會被訊息最前面的部分填滿,超過的資料將遺失和 ReceiveFromEx 傳回 SOCKET_ERROR 的值所設定的錯誤碼的加入至 WSAEMSGSIZE。
如果 lpSockAddr 為非零值 (Nonzero),然後,通訊端類型 SOCK_DGRAM,傳送資料通訊端的網路位址會複製到對應的 SOCKADDR 結構。值所指向的 lpSockAddrLen 在傳回初始化此結構的大小和修改值儲存在該位址的實際大小的存在。如果傳入的資料不可在通訊端, ReceiveFromEx 呼叫等候資料抵達,除非通訊端為未封鎖的呼叫。在這種情況下, SOCKET_ERROR 的值傳回錯誤碼設定為 WSAEWOULDBLOCK。OnReceive 回呼可用來判斷詳細資料何時到達。
如果通訊端是型別,並 SOCK_STREAM 遠端順利地關閉連接, ReceiveFromEx 將會立即完成具有 0 接收的位元組。
需求
Header: afxsock.h