Select實現併發伺服器

2021-07-25 12:42:37 字數 1839 閱讀 4400

併發伺服器除了可以用多執行緒和多程序實現以外,還可以用select實現單執行緒併發,下面用select實現簡單的示例,伺服器接收客戶端的連線,並將客戶發的訊息返回,**如下:

伺服器端**:

main.c

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define port 8888

#define buff_len 1024

int client_sock;

int errexit(const

char *format, ...);

int echo(int fd);

int main()

if (fd_isset(ss, &rfds))

for (fd = 0; fd < nfds; ++fd)}}

}}int echo(int fd) else

if(cc == 0)

printf("client %d disconnect\n", fd);

else

printf("read from client %d error, close!\n", fd);

return cc;

}int errexit(const

char *format, ...)

createserver.h//封裝了建立伺服器**

#ifndef createserver_h

#define createserver_h

int create_tcp_server(int);

int create_udp_server(int);

#endif // createserver_h

createserver.c//封裝方法的具體實現

#include 

#include

#include

#define listen_size 20

int start_server(int port, int type)

//設定伺服器位址

struct sockaddr_in server_addr; //伺服器位址結構

bzero(&server_addr, sizeof(struct sockaddr_in)); //清零

server_addr.sin_family = af_inet; //協議族

server_addr.sin_addr.s_addr = htonl(inaddr_any); //ip位址

server_addr.sin_port = htons(port); //埠

//繫結位址結構到套接字描述符

if(bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)

//tcp

if(sock_stream == type)

printf("tcp server start\n");

}else

printf("udp server start\n");

return ss;

}int create_tcp_server(int port)

int create_udp_server(int port)

客戶端測試**:

**同之前的部落格,參見:

併發伺服器 select 程式設計

1,併發伺服器,通過多路io復用,能使得乙個程序同時處理多路io,提公升伺服器吞吐量。在linux支援epoll模型之前,都使用select poll模型來實現io多路復用。select在socket程式設計中還是比較重要的,可是對於初學socket的人來說都不太愛用select寫程式,他們只是習慣...

I O復用 select函式實現併發伺服器

多程序伺服器端模型 乙個程序對應乙個客戶端 在模型中引入復用技術,減少程序數。無論連線多少客戶端,提供服務的程序只有1個。select函式呼叫過程 利用select函式可以同時監視多個檔案描述符。監視檔案描述符可以視為監視套接字。將要監視的檔案描述符集中到一起。集中時也要按照監視項 接收,傳輸,異常...

select實現tcp併發伺服器的基本框架流程

服務端初始化 socket bind listen for fd set listen fd allset 設定監聽讀寫檔案描述符 select 呼叫select函式 if 如果是傾聽套接字就緒,說明乙個新的連線請求建立 建立連線 accept 加入到監聽檔案描述符中去 else 否則說明是乙個已經...