日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux网络编程服务器模型选择之并发服务器(上)

發(fā)布時(shí)間:2023/11/30 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux网络编程服务器模型选择之并发服务器(上) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載:http://www.cnblogs.com/lizhenghn/p/3617666.html

? 與循環(huán)服務(wù)器的串行處理不同,并發(fā)服務(wù)器對(duì)服務(wù)請(qǐng)求并發(fā)處理。循環(huán)服務(wù)器只能夠一個(gè)一個(gè)的處理客戶端的請(qǐng)求,顯然效率很低。并發(fā)服務(wù)器通過建立多個(gè)子進(jìn)程來實(shí)現(xiàn)對(duì)請(qǐng)求的并發(fā)處理。并發(fā)服務(wù)器的一個(gè)難點(diǎn)是如何確定子進(jìn)程的數(shù)據(jù),因?yàn)椴磺宄?qǐng)求客戶端的數(shù)目,因此實(shí)現(xiàn)中通常采用事先分配一定數(shù)目的子進(jìn)程與動(dòng)態(tài)增加子進(jìn)程相結(jié)合的方法來實(shí)現(xiàn)并發(fā)服務(wù)器。

簡單并發(fā)服務(wù)器模型

/* UDP簡單并發(fā)服務(wù)器模型 */ /* 服務(wù)器主進(jìn)程 */ socket(...); bind(...); fork(); //創(chuàng)建多個(gè)子進(jìn)程進(jìn)行請(qǐng)求處理 while(1); /* 服務(wù)器子進(jìn)程1 */ while(1) {recvfrom(....);process(...);sendto(.....); } close(...); /* 服務(wù)器子進(jìn)程2(同上) */ .................. .................. .................. /* 服務(wù)器子進(jìn)程3(同上) */ .................. .................. .................. /* TCP簡單并發(fā)服務(wù)器模型 */ /* 服務(wù)器主進(jìn)程 */ socket(...); bind(...); fork();//創(chuàng)建多個(gè)子進(jìn)程進(jìn)行請(qǐng)求處理 while(1); /* 服務(wù)器子進(jìn)程1 */ socket(...); bind(...); listen(...); while(1) {accept(...);recv(....)process(...);send(.....); } close(....); /* 服務(wù)器子進(jìn)程2(同上) */ .................. .................. .................. /* 服務(wù)器子進(jìn)程3(同上) */ .................. .................. ..................

?

一個(gè)并發(fā)服務(wù)器的例子

下面給出一個(gè)簡單的并發(fā)服務(wù)器樣子,仍然模擬服務(wù)器對(duì)外提供時(shí)間服務(wù)器,等待客戶端到來,并返回給客戶端服務(wù)器的當(dāng)前時(shí)間。

UDP循環(huán)服務(wù)器

1 /** UDP并發(fā)服務(wù)器--server端程序**/ 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <netinet/in.h> 5 #include <time.h> 6 #include <string.h> 7 #include <stdio.h> 8 #define BUFFLEN 1024 9 #define SERVER_PORT 12347 10 #define BACKLOG 5 11 12 static void handle_request(int s, struct sockaddr_in* from, char *buff) 13 { 14 time_t now; 15 int len = sizeof(*from); 16 memset(buff, 0, BUFFLEN); 17 now = time(NULL); 18 sprintf(buff, "%24s\r\n",ctime(&now)); 19 sendto(s, buff, strlen(buff),0, (struct sockaddr*)from, len);/*發(fā)送數(shù)據(jù)*/ 20 } 21 22 static void handle_connect(int s_s) 23 { 24 struct sockaddr_in from; /*客戶端地址*/ 25 int len = sizeof(from); 26 int n = 0; 27 char buff[BUFFLEN]; 28 29 /*主處理過程*/ 30 while(1) 31 { 32 memset(buff, 0, BUFFLEN); 33 /*接收客戶端連接*/ 34 n = recvfrom(s_s, buff, BUFFLEN,0,(struct sockaddr*)&from, &len);/*接收發(fā)送方數(shù)據(jù)*/ 35 if(n > 0 && !strncmp(buff, "TIME", 4))/*判斷是否合法接收數(shù)據(jù)*/ 36 { 37 /*創(chuàng)建進(jìn)程進(jìn)行數(shù)據(jù)處理*/ 38 if(!fork()) 39 { 40 handle_request(s_s, &from, buff);/*處理連接請(qǐng)求*/ 41 return ; 42 } 43 } 44 } 45 } 46 47 48 int main(int argc, char *argv[]) 49 { 50 int s_s; /*服務(wù)器套接字文件描述符*/ 51 struct sockaddr_in local; /*本地地址*/ 52 53 /*建立TCP套接字*/ 54 s_s = socket(AF_INET, SOCK_STREAM, 0); 55 56 /*初始化地址接哦股*/ 57 memset(&local, 0, sizeof(local)); 58 local.sin_family = AF_INET;/*AF_INET協(xié)議族*/ 59 local.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/ 60 local.sin_port = htons(SERVER_PORT);/*服務(wù)器端口*/ 61 62 /*將套接字文件描述符綁定到本地地址和端口*/ 63 int err = bind(s_s, (struct sockaddr*)&local, sizeof(local)); 64 65 /*處理客戶端連接*/ 66 handle_connect(s_s); 67 68 close(s_s); 69 70 return 0; 71 }

?

TCP循環(huán)服務(wù)器

1 /** TCP并發(fā)服務(wù)器--server端程序**/ 2 #include <sys/types.h> 3 #include <sys/socket.h> 4 #include <netinet/in.h> 5 #include <time.h> 6 #include <string.h> 7 #include <stdio.h> 8 #define BUFFLEN 1024 9 #define SERVER_PORT 12347 10 #define BACKLOG 5 11 12 static void handle_request(int s_c) 13 { 14 time_t now; 15 char buff[BUFFLEN]; 16 int n = 0; 17 memset(buff, 0, BUFFLEN); 18 n = recv(s_c, buff, BUFFLEN,0);/*接收發(fā)送方數(shù)據(jù)*/ 19 if(n > 0 && !strncmp(buff, "TIME", 4))/*判斷是否合法接收數(shù)據(jù)*/ 20 { 21 memset(buff, 0, BUFFLEN); 22 now = time(NULL); 23 sprintf(buff, "%24s\r\n",ctime(&now)); 24 send(s_c, buff, strlen(buff),0);/*發(fā)送數(shù)據(jù)*/ 25 } 26 /*關(guān)閉客戶端*/ 27 close(s_c); 28 } 29 30 static void handle_connect(int s_s) 31 { 32 int s_c; /*客戶端套接字文件描述符*/ 33 struct sockaddr_in from; /*客戶端地址*/ 34 int len = sizeof(from); 35 36 /*主處理過程*/ 37 while(1) 38 { 39 /*接收客戶端連接*/ 40 s_c = accept(s_s, (struct sockaddr*)&from, &len); 41 if(s_c > 0)/*客戶端成功連接*/ 42 { 43 /*創(chuàng)建進(jìn)程進(jìn)行數(shù)據(jù)處理*/ 44 if(fork() > 0)/*父進(jìn)程*/ 45 { 46 close(s_c);/*關(guān)閉父進(jìn)程的客戶端連接套接字*/ 47 } 48 else 49 { 50 handle_request(s_c);/*處理連接請(qǐng)求*/ 51 return ; 52 } 53 } 54 } 55 } 56 57 58 int main(int argc, char *argv[]) 59 { 60 int s_s; /*服務(wù)器套接字文件描述符*/ 61 struct sockaddr_in local; /*本地地址*/ 62 63 /*建立TCP套接字*/ 64 s_s = socket(AF_INET, SOCK_STREAM, 0); 65 66 /*初始化地址*/ 67 memset(&local, 0, sizeof(local)); 68 local.sin_family = AF_INET;/*AF_INET協(xié)議族*/ 69 local.sin_addr.s_addr = htonl(INADDR_ANY);/*任意本地地址*/ 70 local.sin_port = htons(SERVER_PORT);/*服務(wù)器端口*/ 71 72 /*將套接字文件描述符綁定到本地地址和端口*/ 73 int err = bind(s_s, (struct sockaddr*)&local, sizeof(local)); 74 err = listen(s_s, BACKLOG);/*偵聽*/ 75 76 /*處理客戶端連接*/ 77 handle_connect(s_s); 78 79 close(s_s); 80 81 return 0; 82 }

?

注意,

1. 為了方便退出,server程序中對(duì)信號(hào)SIGINT信號(hào)進(jìn)行了處理,此時(shí)所有的進(jìn)程都會(huì)退出;

2. 并發(fā)服務(wù)器中的client程序與上一節(jié)介紹循環(huán)服務(wù)器時(shí)使用的client程序是一樣的,這里不在貼出來,

? ? 請(qǐng)參考?Linux網(wǎng)絡(luò)編程服務(wù)器模型選擇之循環(huán)服務(wù)器?http://www.cnblogs.com/lizhenghn/p/3617608.html


總結(jié)

以上是生活随笔為你收集整理的Linux网络编程服务器模型选择之并发服务器(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。