基於select模型的server

2021-08-21 16:41:45 字數 1660 閱讀 2482

前面一篇介紹了io模型。其中重點介紹了io多路轉接中的三種模型,包括了select,poll,epoll三種。下面就是基於select模型編寫的伺服器與客戶機,兩者可以進行互動。

伺服器端**:k

#include#include#include#include#include#include#include#includeint fdarray[sizeof(fd_set)*8];

int startup(int port)

//為了防止伺服器主動斷開連線,無法連線重啟的問題

int opt = 1;

setsockopt(sock,sol_socket,so_reuseaddr,&opt,sizeof(opt));

struct sockaddr_in local;

local.sin_family = af_inet;

local.sin_addr.s_addr = htonl(inaddr_any);

local.sin_port = htons(port);

if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)

if(listen(sock,5)<0)

return sock;

}// ./select_server 8080

int main(int argc,char* argv)

int listen_sock = startup(atoi(argv[1]));

//已經建立listen_sock

fdarray[0] = listen_sock;//合法的描述符

int num = sizeof(fdarray)/sizeof(fdarray[0]);

int i = 1;

for(i;i=0)

//struct sockaddr_in client;

client.sin_port = htons(atoi(argv[1]));

client.sin_family = af_inet;

client.sin_addr.s_addr = htonl(inaddr_any);

//建立套接字

int sock = socket(af_inet,sock_stream,0);

if(sock<0)

//連線伺服器

if(connect(sock,(struct sockaddr*)&client,sizeof(client))<0)

for(;;)

;read(0,buf,sizeof(buf)-1);

//將訊息寫給檔案描述符

if(write(sock,buf,strlen(buf))<0)

//將伺服器返回的訊息寫到buf裡

int ret = read(sock,buf,sizeof(buf)-1);

if(ret<0)

if(ret==0)

printf("server:%s\n",buf);

}close(sock);

return 0;

}

這樣通過客戶端與伺服器的互動就可以互通訊息了。

基於Select模型的UDP TCP混合程式設計

selecttestserver.cpp 定義控制台應用程式的入口點。tcp udp復用server select非阻塞模式 ip 127.0.0.1 tcp port 5001 udp port 5000 include stdafx.h include pragma comment lib,ws...

基於事件套接字集合的select 模型

基於事件套接字集合的select 模型 select 選擇 模型是winsock 中最常見的i o 模型。之所以稱其為 select 模型 是由於它的 中心思想 便是利用select 函式,實現對i o 的管理!最初設計該模型時,主要面向的是某些使用unix 作業系統的計算機,它們採用的是berke...

基於select模型的udp客戶端實現超時機制

參考 多路選擇i o select模型 其思想在於使用乙個集合,該集合中包含需要進行讀寫的fd,通過輪詢這個集合,直到有乙個fd可讀寫,才返回。與阻塞i o不同的是,阻塞i o僅使用了一次系統呼叫,就是對fd的讀寫,如果沒有fd處於就緒狀態,則程序一直阻塞,而多路選擇i o使用了兩次系統呼叫,第一次...