訊息機制 WSAAsyncSelect

2021-05-31 22:57:27 字數 2817 閱讀 1582

訊息機制-wsaasyncselect

wsaasyncselect基於windows訊息機制非同步i/o模型,為特定網路事件指定系統通知資訊.

函式定義

int wsaasyncselect(socket s, hwnd hwnd, unsigned int wmsg, long levent);

(1)引數4-1event:設定使用者關心得套介面上的網路事件.形式如:1event=fd_read/fd_close.

網路i/o事件 簡表

事件值 

含義 觸發條件

fd_read 

套介面有可讀訊息通知 

recv,recvfrom,wsarecv或wsarecvfrom

fd_write 

套介面有可發訊息通知 

send,sendto,wsasend或wsasendto

fd_oob 

套件口有外帶資料訊息通知 

recv,recvfrom,wsarecv或wsarecvfrom

fd_accept 

套介面有鏈結請求訊息通知 

accept或wsaaccept(錯誤碼不能wsatry_again)

fd_connect 希望得到connect或多點join操作完成資訊通知 

無fd_close(面向連線) 套介面關閉訊息通知 

無fd_qos 

套介面qos狀態發生變化訊息通知 

wsaioctl(sio_get_qos)

fd_group_qos 保留 

reserved

fd_routing_inte***ce_change 

特定方向的路由介面發生改變訊息通知。 

wsaioctl(sio_routing_inte***ce_change)

fd_address_list_change

得到本地位址列表上套介面協議族發生改變通知。 

wsaioctl(sio_address_list_change)

(2)引數3-wmsg:為套介面事件設定1event通知訊息通常形式(wm_user + n)

如 #define wm_user_server 

wm_user+1

(3)引數2-bwnd指定系統通知訊息wmsg的視窗控制代碼.函式若呼叫成功,

wsaasyncselect返回0;否則返回socket_error,這時可用wsagetlasterror來獲取錯誤碼. 

事實上,成功傳送一次訊息,通知機制會暫停工作直到有重新啟用訊息通知機制到來.才可重新啟用事件.

水平觸發:fd_read,fd_oob和fd_accept 即重新啟用,需要引發訊息傳送的條件. 

邊緣觸發:fd_qos,fd_group_qos等.

同一介面多次呼叫wsaasyncselect函式,只有最後一次生效.

因此:wsaasyncselect(s, m_hwnd, wm_user_server, fd_read),加上

wsaasyncselect(s, m_hwnd, wm_user_server, fd_close) 並不等於

wsaasyncselect(s, m_hwnd, wm_user_server, fd_read | fd_close)

取消套介面上的i/o事件訊息通知:、

wsaasyncselect(s, hwnd, 0, 0)

在mfc程式設計環境中,使用該訊息處理函式

begin_message_map(c***dlg, cdialog)

//}afx_msg_map

on_message(wm_user_server, onservermsg)

........

end_message_map()

處理訊息函式宣告為:

afx_msg void onservermsg(wparam wparam,lparam lparam);

它定義為:

void c***dlg::onservermsg(wparam wparam,lparam lparam)

switch(wsagetselectevent(lparam))

}其中函式會接受到兩個引數wparam 和 lparam。

其中 wparam引數 指明網路事件套介面,多個套介面指定同乙個使用者訊息,那麼就需要根據wparam判斷到底是哪個套介面待處理。

lparam引數包含兩資訊:底字指定發生網路事件,高字包含可能出現錯誤帶**。

另外 onservermsg函式中出現兩個巨集定義

#define wsagetselecterror(lparam) 

hiword(lparam)

#define wsagetselectevent(lparam) 

loword(lparam)

一般來講,當使用者 收到第乙個fd_write使用者訊息時就可以向套介面寫資料,直到碰到wsaewoulbalock錯誤時才

等待下一次fd_write通知訊息。

總結:wsaasynselect在mfc中使用流程

(1)、使用#define語句定義套介面網路事件設定使用者訊息值,一般為wm_user+n形式。

(2)、呼叫wsaasynsselect函式,為套介面設定"網路事件-使用者訊息-訊息接收窗體"的對應關係。

(3)、在訊息接收窗體的**的訊息對映模組中,加入on_message巨集,設定使用者訊息的處理函式。

(4)、編寫使用者處理函式,該函式應該首先使用wsagetselecterror巨集判斷是否有錯誤發生:

然後根據wparam值了解是哪乙個套介面上發生了網路事件從而引起使用者訊息被傳送:最後使用

wsagetselectevent巨集來了解所發生的網路事件,從而進行相應處理。

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

FD WRITE 訊息機制

我本想把傳送和接收分開作為兩部分,但是最後我決定只略微解釋一下 fd read 留下更多的時間來說明更複雜的 fd write fd read 事件非常容易掌握.當有資料傳送過來時,winsock 會以 fd read 事件通知你,對於每乙個 fd read 事件,你需要像下面這樣呼叫 recv i...

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...