事件選擇模型將每個套接字和每個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...