網路伺服器程式設計 事件選擇模型

2021-08-30 17:41:27 字數 2841 閱讀 2054

事件選擇模型將每個套接字和每個wsaevent物件對應起來,並且在註冊的時候指定需要關注的哪些網路事件。

缺陷:不能同時處理多個套接字,只能同時處理乙個事件對應的套接字;乙個執行緒中處理的套接字有限,一般為64;應用程式中要處理大於64個套接字,必須額外建立執行緒。

//事件選擇tcp伺服器端

#include

#include

#pragma

comment

(lib

,"ws2_32.lib")

using

namespace

std;

intmain(

intargc

, char

** argv)

//步驟2:建立監聽套接字和伺服器端ip/port

socket

socklisten = socket(

af_inet

, sock_stream

, 0);

sockaddr_in

addr_server;

memset(&addr_server, 0,

sizeof

(addr_server));

addr_server.sin_family =

af_inet;

addr_server.sin_addr.

s_addr

= htonl(

inaddr_any

);//inaddr_any表示繫結電腦上所有網絡卡ip

addr_server.sin_port = htons(6000);

//不能使用公認埠,即埠》= 1024

//步驟3:套接字繫結和監聽

bind(socklisten, (

sockaddr

*)&addr_server,

sizeof

(addr_server));

listen(socklisten, 5);

//步驟4:建立新的事件

wsaevent

newevent;

newevent = wsacreateevent();

//步驟5:註冊網路事件

wsaeventselect(socklisten, newevent,

fd_accept

| fd_close);

//步驟6:建立事件陣列和套接字陣列

wsaevent

eventarray[

wsa_maximum_wait_events

];

socket

sockarray[

wsa_maximum_wait_events];

inteventcount = 0;

eventarray[eventcount] = newevent;

sockarray[eventcount] = socklisten;

eventcount++;

while

(1)

sockaddr_in

addr_client;

intlen =

sizeof

(sockaddr);

socket

sockclient = accept(sock, (

sockaddr

*)&addr_client, &len); if

(sockclient !=

invalid_socket)

} }else

if(workevent.lnetworkevents &

fd_read)

} }else

if(workevent.lnetworkevents &

fd_close)

eventcount--; }

else

if(workevent.lnetworkevents &

fd_write)

}//步驟10:關閉套接字和庫解綁

closesocket(socklisten);

wsacleanup();

return0;

} //事件選擇tcp客戶端:

#include

#include

#pragma

comment

(lib

, "ws2_32.lib")

using

namespace

std;

intmain()

// clean up

closesocket(sockclient);

wsacleanup();

return0;

} wsaeventselect(引數1,引數2,引數3):註冊網路事件,並關聯套接字。

引數1:關聯的套接字;

引數2:需要註冊的網路事件;

引數3:網路事件型別。

wsawaitformultipleevents(引數1,引數2,引數3,引數4,引數5):等待網路事件發生。

引數1:網路事件的個數;

引數2:網路事件陣列;

引數4:等待時間,wsa_infinite表示一直等待。

返回值:返回值index減去wsa_wait_event_0就是所發生網路事件在網路時間陣列中的索引;但是在windows平台,wsa_wait_event_0等於0。

wsaenumnetworkevents(引數1,引數2,引數3):查詢發生在套接字上的網路事件,並清除系統內部的網路事件記錄,重置事件物件。

引數1:發生網路事件的套接字;

引數2:被重置的網路事件;

引數3:指向wsanetworkevents的結構指標。

linux網路伺服器模型

linux系統網路伺服器模型主要有兩種 併發伺服器和迴圈伺服器。所謂併發伺服器就是在同乙個時刻可以處理來自多個客戶端的請求 迴圈伺服器是指伺服器在同一時刻指可以響應乙個客戶端的請求。而且對於tcp和udp套接字,這兩種伺服器的實現方式也有不同的特點。首先tcp伺服器接受乙個客戶端的連線請求,處理連線...

關於網路伺服器

假如我有數千萬甚至是上億的使用者資料,我想把使用者自增id和使用者名稱username放到快取裡。我的需求是,當要查詢使用者的資訊時,我想先從快取裡根據使用者名稱username獲取到使用者的id,然後再通過id在資料庫裡查詢使用者的資訊。我想當乙個使用者表達到上億的數量級別時,用自增id來查詢肯定...

網路伺服器宕機

1.伺服器程序終止 當伺服器程序終止時,伺服器傳送fin給客戶端,客戶端回以ack,客戶端進入close wait狀態,但還沒有結束連線。此時客戶端阻塞於fgets,客戶端繼續傳送buffer,伺服器傳送rst,客戶端readline返回0。而如果客戶端不理睬readline返回的rst,繼續wri...