純重疊io伺服器模型

2021-09-09 06:21:40 字數 2269 閱讀 1224

基礎:套接字重疊io

客戶端: telnet 或者自己隨意寫乙個;

apc函式即需要使用alterable狀態的函式 , 例 sleepex.

另外重疊io與非阻塞是2個概念.

下面的**中使用到了非阻塞io, 僅僅作用在了accept上. 讓其不阻塞;

原因是如果阻塞accpet 就沒法呼叫到sleepex上,那麼apc函式將無法被呼叫,因此使用非阻塞;

這種純重疊io模型的伺服器缺點是既要accept,又要讓執行緒進入alterab;e狀態

這個例子同時解釋了非阻塞io. 和重疊io : 可以把設定非阻塞的函式注釋.看看效果

#include "stdafx.h"

#include "../utils.h"

#define buffsize 8192

typedef struct per_data , *pper_data;

//讀取 - apc

void callback readroutine(

in dword dwerror,

in dword cbtransferred,

in dword dwflags

) else

}//寫入 - apc

void callback writerouine(

in dword dwerror,

in dword cbtransferred,

in dword dwflags

)//設定非阻塞

int setnonblockmode(socket sock,u_long benable)

int _tmain(int argc, _tchar* ar**)

//設定監聽socket為非阻塞.可以把這一行注釋掉,這樣就將阻塞在accept上了

setnonblockmode(hlistensocket, true);

sockaddr_in serv_addr, client_addr;

memset(&serv_addr, 0, sizeof(serv_addr));

memset(&client_addr, 0, sizeof(client_addr));

serv_addr.sin_addr.s_addr = inaddr_any;

serv_addr.sin_family = af_inet;

serv_addr.sin_port = htons(port);

if (socket_error == bind(hlistensocket, (sockaddr*)&serv_addr, sizeof(serv_addr)))

if (socket_error == listen(hlistensocket, backlog))

int client_addr_size = sizeof(client_addr) , error = 0 , ret = 0;

socket hclientsock = null;

pper_data client_info = null;

dword flags = 0, recvbytes = 0;;

while (1)

client_addr_size = sizeof(client_addr);

hclientsock = accept(hlistensocket, (sockaddr*)&client_addr, &client_addr_size);

//由於是非阻塞套接字,因此需要判斷是否真的有連線進入

if (invalid_socket == hclientsock)

//建立一塊自定義資料

client_info = (pper_data)malloc(sizeof(per_data));

client_info->hsocket = hclientsock;

client_info->wsabuf.buf = client_info->buf;

client_info->wsabuf.len = buffsize;

//由於使用了apc,hevent可以自由分配

pover->hevent = (handle)client_info;

ret = wsarecv(hclientsock, &client_info->wsabuf, 1, &recvbytes, &flags, pover, readroutine);

if (0 == ret)

else

} wsacleanup();

return 0;

}

C 伺服器重疊I O 事件通告模型

include include include includeusing namespace std pragma comment lib,ws2 32.lib pragma comment lib,mswsock.lib const int nport 10000 const int buf le...

基於重疊IO模型的 回顯TCP伺服器設計

1 套接字物件 為每個套接字建立乙個socket obj物件,記錄與之相關的資訊。typedef struct socket objsocket obj,psocket obj 所有重疊io提交到特定的套接字上,釋放對應套接字物件,必須保證此套接字再沒有重疊io,即noutstandingops 0...

伺服器IO模型之Select

阻塞與非阻塞 select模型目的 主要是避免在套接字呼叫上阻塞的應用程式有能力管理多個套接字,即是單一執行緒模式下只能處理乙個套接字的問題,這樣可以避免執行緒膨脹。select模型函式 int select in int nfds,inout fd set readfds,inout fd set...