WSAasyncSelect 非同步選擇訊息模型

2021-10-05 11:49:59 字數 2364 閱讀 7953

wsaasyncselect 非同步選擇訊息模型適用於簡單對效率要求不太高的windows視窗程式。

該模型windows為使用者封裝好了執行緒呼叫,以訊息的方式通知accep/recv等事件是否已經發生,不用一直阻塞等待。

下面是這種模型的簡單**實現:

主要針對伺服器accept 和recv做非同步呼叫主要看加出的部分

#include

#include

#include

#include

#pragma comment(lib, "ws2_32.lib")

#include

using namespace std;

//定義兩個訊息分別針對accept和recv到了後 進行通知使用者

#define wm_myaccept wm_user+ 0x1

#define wm_myrecv  wm_user+0x2

if (!hwnd)

showwindow(hwnd, ncmdshow);   //顯示視窗

updatewindow(hwnd);             //繪製使用者區

while (getmessage(&msg, null, 0, 0))

return (int)msg.wparam; 

}socket sockserver;

socket sockclient = invalid_socket;

//視窗函式

lresult callback wndproc(hwnd hwnd, uint message, wparam  wparam, lparam  lparam)

// step 1. ask system for a socket.this socket is waiter

sockserver = ::socket(pf_inet, sock_stream, 0);

if (sockserver == invalid_socket)

//step 2. bind the socket to a local address and port.接待套接字

sockaddr_in addrserver = ;

addrserver.sin_family = af_inet;

addrserver.sin_addr.s_un.s_addr = inet_addr("88.88.106.176");

//host to network short.小端轉大端

addrserver.sin_port = (30001);

if (::bind(sockserver, reinterpret_cast(&addrserver),

sizeof addrserver) == socket_error)

// step 3. listen. 監聽佇列的設定  

if (listen(sockserver, 5) == socket_error)

//繫結accept訊息和服務端套接字

if (wsaasyncselect(sockserver, hwnd, wm_myaccept, fd_accept))

return 0;

}case wm_myaccept: //有客戶端連線 這裡會以訊息到方式進行通知  此時accept肯定是馬上響應

; //將對放的資訊儲存在這個結構體裡

int ilength = sizeof addrclient;

sockclient = ::accept(sockserver, reinterpret_cast(&addrclient), &ilength);

if (sockclient == invalid_socket)

//繫結recv訊息和網路套接字recv訊息到了以 wm_myrecv訊息通知

wsaasyncselect(sockclient, hwnd, wm_myrecv, fd_read);

return 0;

}casewm_myrecv: //和accept同理

;int iresult = ::recv(sockclient, reinterpret_cast(buf), 100, 0);

return 0;

}default:                //預設時採用系統訊息預設處理函式

return  defwindowproc(hwnd, message, wparam, lparam);

//ret;

}return (0);

}

訊息機制 WSAAsyncSelect

訊息機制 wsaasyncselect wsaasyncselect基於windows訊息機制非同步i o模型,為特定網路事件指定系統通知資訊.函式定義 int wsaasyncselect socket s,hwnd hwnd,unsigned int wmsg,long levent 1 引數4...

WSAAsyncSelect模型詳解

ps 這是本人第一次在csnd上寫部落格,由於水平有限,還請各位大神批評指正。一 wsaasyncselect模型介紹 wsaasyncselect模型是windows sockets的乙個非同步i o模型。應用程式可以用它在乙個套接字上接收以windows訊息為基礎的網路事件。應用程式建立套接字後...

WSAASyncSelect模式的乙個小經驗

wsaasyncselect 模式fd close 訊息通常會在最後乙個 fd read 訊息之前出現,也就是說,當資料接收完之後,系統常會先傳送 fd close 訊息,然後才傳送 fd read 弄不明白微軟的那些程式設計師 所以,在執行 fd close 之時,應該先等待最後乙個 fd rea...