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...