基礎:套接字重疊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...