共用方式為


PFN_WSK_RECEIVE_FROM回呼函式 (wsk.h)

WskReceiveFrom 函式會從遠端傳輸位址接收數據報和任何相關聯的控制資訊。

語法

PFN_WSK_RECEIVE_FROM PfnWskReceiveFrom;

NTSTATUS PfnWskReceiveFrom(
  [in]            PWSK_SOCKET Socket,
  [in]            PWSK_BUF Buffer,
                  ULONG Flags,
  [out, optional] PSOCKADDR RemoteAddress,
  [in, out]       PULONG ControlLength,
  [out, optional] PCMSGHDR ControlInfo,
  [out, optional] PULONG ControlFlags,
  [in, out]       PIRP Irp
)
{...}

參數

[in] Socket

WSK_SOCKET 結構的指標,指定要接收數據報之數據報套接字的套接字物件。

[in] Buffer

初始化 WSK_BUF 結構的指標,描述從套接字接收數據報的數據緩衝區。

Flags

此參數保留供系統使用。 WSK 應用程式必須將此參數設定為零。

[out, optional] RemoteAddress

呼叫端配置的緩衝區指標,接收數據報來源的遠端傳輸位址。 緩衝區必須位於非分頁記憶體中。 緩衝區也必須夠大,才能包含對應至 WSK 應用程式在建立數據報套接字時所指定的位址系列的特定 SOCKADDR 結構類型。 此指標是選擇性的,而且可以 NULL

[in, out] ControlLength

ULONG 的指標,指定 ControlInfo 參數所指向的緩衝區大小。 當接收作業完成時,變數會接收與所接收數據報相關聯的控制資訊大小。 如果傳回的值是零,則數據報沒有控件資訊存在。 此指標是選擇性的,而且可以 NULL。 如果此參數 NULL,則會忽略 ControlInfo 參數。

[out, optional] ControlInfo

呼叫端配置的緩衝區指標,接收與已接收之數據報相關聯的控制資訊。 與數據報相關聯的控件信息數據是由一或多個控件數據物件所組成,每個物件都是以 CMSGHDR 結構開頭。 如果已接收的數據報沒有控件資訊存在,則未定義緩衝區的內容。 此指標是選擇性的,而且可以 NULL。 如果 ControlInfoLength 參數 NULL,則 ControlInfo 參數應 NULL

[out, optional] ControlFlags

ULONG 型別變數的指標,可接收下列旗標組合的位 OR:

MSG_BCAST

數據報會以連結層廣播的形式接收,或接收目的地傳輸地址為廣播位址。

MSG_MCAST

數據報是以多播位址的目的地傳輸位址接收。

MSG_TRUNC

數據報已截斷,因為數據報的大小大於 Buffer 參數所指定的緩衝區大小。

MSG_CTRUNC

控件資訊數據已截斷,因為控件資訊的位元組數目大於 ControlInfo 參數所指定的緩衝區大小。

這個參數是選擇性的,而且可以 NULL

[in, out] Irp

WSK 子系統用來異步完成接收作業的呼叫端配置 IRP 指標。 如需搭配 WSK 函式使用 IRP 的詳細資訊,請參閱 搭配 Winsock 核心函式使用 IRP

傳回值

WskReceiveFrom 會傳回下列其中一個 NTSTATUS 代碼:

傳回碼 描述
STATUS_SUCCESS
已成功從套接字接收數據。 IRP 將會以成功狀態完成。 IRP 的 [IoStatus.Information] 字段包含收到的位元組數目。
STATUS_PENDING
WSK 子系統無法立即從套接字接收數據報。 WSK 子系統會在從套接字收到數據報之後完成 IRP。 接收作業的狀態將會在 IRP 的 IoStatus.Status 欄位中傳回。 如果作業成功,IRP 的 [IoStatus.Information] 字段將包含收到的位元組數目。
STATUS_FILE_FORCED_CLOSED
套接字已不再運作。 IRP 將會以失敗狀態完成。 WSK 應用程式必須呼叫 WskCloseSocket 函式,以儘快關閉套接字。
其他狀態代碼
發生錯誤。 IRP 將會以失敗狀態完成。

言論

如果 WSK 應用程式已設定資料報套接字的固定遠端傳輸位址,WSK 子系統將會捨棄從任何其他遠端傳輸位址接收的數據報。 如需設定資料報套接字遠端傳輸地址的詳細資訊,請參閱 SIO_WSK_SET_REMOTE_ADDRESS

如果 WSK 應用程式的 WskReceiveFromEvent 事件回呼函式是在數據報套接字上啟用,而且應用程式在相同的數據報套接字上也具有對 WskReceiveFrom 函式的暫止呼叫, 然後,當數據報到達時,WskReceiveFrom 函式的暫止呼叫會優先於 WskReceiveFromEvent 事件回呼函式。 WSK 子系統只有在沒有從暫止呼叫至 WskReceiveFrom 函式的暫止呼叫中佇列時,才會呼叫應用程式的 WskReceiveFromEvent 事件回呼函式。 不過,WSK 應用程式不應該假設 WSK 子系統不會呼叫應用程式的 WskReceiveFromEvent 事件回呼函式,而數據報套接字具有 WskReceiveFrom 函式的暫止呼叫。 WSK 子系統仍可呼叫 WSK 應用程式的 WskReceiveFromEvent 套接字事件回呼函式的競爭條件。 WSK 應用程式確保 WSK 子系統不會在數據報套接字上呼叫應用程式的 WskReceiveFromEvent 事件回呼函式的唯一方式,就是停用應用程式在套接字上的 WskReceiveFromEvent 事件回呼函式。

如果 WskReceiveFrom 函式傳回STATUS_PENDING,Buffer 參數所指向之 WSK_BUF 結構中所述的 MDL 鏈結必須保持鎖定在記憶體中,直到 IRP 完成為止。 此外,ControlInfoLength 參數所指向的變數、ControlInfo 參數所指向的緩衝區,以及由 ControlFlags 參數所指向的變數也必須維持有效狀態,直到 IRP 完成為止。 如果 WSK 應用程式使用其中一個 ExAllocateXxx 函式配置這些緩衝區或變數,則除非 IRP 完成之後,才能釋放具有對應 ExFreeXxx 函式的記憶體。 如果 WSK 應用程式在堆疊上配置了這些緩衝區或變數,它就無法從呼叫 WskReceiveFrom 函式的函式傳回,直到 IRP 完成之後。

要求

要求 價值
最低支援的用戶端 可在 Windows Vista 和更新版本的 Windows作系統中使用。
目標平臺 普遍
標頭 wsk.h (包括 Wsk.h)
IRQL <= DISPATCH_LEVEL

另請參閱

CMSGHDR

SIO_WSK_SET_REMOTE_ADDRESS

SOCKADDR

WSK_BUF

WSK_PROVIDER_DATAGRAM_DISPATCH

WSK_SOCKET

WskCloseSocket

WskControlSocket

WskReceiveFromEvent

WskSendTo