WIN網路程式設計 WSAAsyncSelect

2021-08-30 09:27:54 字數 1970 閱讀 8334

///

// wsaasyncselect.cpp檔案

//#define wsagetselecterror(lparam) hiword(lparam)//高字為出錯**

//#define wsagetselectevent(lparam) loword(lparam)//低字為通知碼

//允許應用程式以windows訊息的形式接收網路事件通知

//int wsaasyncselect(

//socket s,//需要設定的套接字控制代碼

//hwnd hwnd,//指定乙個視窗控制代碼

//u_int wmsg,//網路事件到來時接收到的訊息id,可以在wm_user以上的

//數值中任意選擇乙個用做id

//long levent//指定哪些通知碼需要傳送

//levent具體組合

//fd_read接收到對方發過來的資料報

//fd_write資料緩衝區滿後再次變空時,winsock介面通過該通知碼通知應用程式。

//fd_accept監聽中套接字檢測到有連線進入

//fd_connect如果用套接字去連線對方的主機,當連線動作完成後會接收到

//這個通知碼

//fd_close 檢測到套接字對應的連線被關閉

#include "../common/initsock.h"

#include

#define wm_socket wm_user +101// 自定義訊息

cinitsock thesock;

ushort nport = 4567;//此伺服器監聽的埠號

// 建立監聽套節字

socket slisten = ::socket(af_inet, sock_stream,ipproto_tcp);

sockaddr_in sin;

sin.sin_family = af_inet;

sin.sin_port = htons(nport);

sin.sin_addr.s_un.s_addr = inaddr_any;

// 繫結套節字到本地機器

if(::bind(slisten,(sockaddr*)&sin, sizeof(sin)) ==socket_error)

// 將套接字設為視窗通知訊息型別。

::wsaasyncselect(slisten, hwnd, wm_socket,fd_accept|fd_close);

// 進入監聽模式

::listen(slisten, 5);

// 從訊息佇列中取出訊息

msg msg;

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

// 當getmessage返回0時程式結束

return msg.wparam;

}lresult callback windowproc(hwnd hwnd, uint umsg, wparam wparam,lparam lparam)

//處理發生的事件

switch(wsagetselectevent(lparam))

break;

casefd_write:

break;

casefd_read:

;if(::recv(s,sztext, 1024, 0) == -1)

::closesocket(s);

else

printf("接收資料:%s",sztext);

}break;

casefd_close:

break;}}

return 0;

case wm_destroy:

::postquitmessage(0) ;

return 0 ;

}// 將我們不處理的訊息交給系統做預設處理

return ::defwindowproc(hwnd, umsg, wparam,lparam);

}

WIN網路程式設計 TCPServer

tcpserver.cpp檔案 include common initsock.h include cinitsock initsock 初始化winsock庫 int main 填充sockaddr in結構 sockaddr in sin sin.sin family af inet sin.s...

WIN網路程式設計 IOCP服務程式 (

iocpserver.cpp檔案 ciocpserver類的測試程式 include iocp.h include include class cmyserver public ciocpserver void onconnectionclosing ciocpcontext pcontext,ci...

WIN網路程式設計 IOCP服務程式設計注意事項

iocp服務程式設計注意事項 記憶體資源管理 每個重疊的傳送或接收操作所提交的資料緩衝區很可能會鎖定。記憶體被鎖定之後,它不能從物理記憶體換出。但作業系統對 鎖定記憶體的數量 不是投遞的運算元量 有限制,如果伺服器預期處理大量的併發客戶,可以在每個連線上投遞乙個0位元組的接收操作,這樣不會有記憶體鎖...