併發伺服器除了可以用多執行緒和多程序實現以外,還可以用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 否則說明是乙個已經...