1、高性能網(wǎng)絡(luò)服務(wù)程序
我們一直強(qiáng)調(diào)做網(wǎng)站、網(wǎng)站建設(shè)對(duì)于企業(yè)的重要性,如果您也覺(jué)得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過(guò)程中的有力推手。專業(yè)網(wǎng)站制作公司不一定是大公司,創(chuàng)新互聯(lián)公司作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。
Linux的一個(gè)應(yīng)用優(yōu)勢(shì)是可用于設(shè)計(jì)各種高性能網(wǎng)絡(luò)服務(wù)程序,高性能的一個(gè)特點(diǎn)就是實(shí)現(xiàn)并發(fā)訪問(wèn)處理,及同時(shí)為多個(gè)在線用戶提供服務(wù);多進(jìn)程網(wǎng)絡(luò)服務(wù)、多線程網(wǎng)絡(luò)服務(wù)、線程池網(wǎng)絡(luò)服務(wù);
2、多進(jìn)程網(wǎng)絡(luò)服務(wù)
:利用Linux系統(tǒng)中的父子進(jìn)程關(guān)系為多用戶提供并發(fā)服務(wù),是一種比較流行的并發(fā)服務(wù)技術(shù),其基本理念是:來(lái)一個(gè)用戶,啟動(dòng)一個(gè)服務(wù)進(jìn)程。若有新連接到來(lái),則啟動(dòng)子進(jìn)程與其交互,服務(wù)結(jié)束后,其子進(jìn)程自動(dòng)退出。
模型如下:
3、代碼實(shí)現(xiàn):
用一個(gè)整數(shù)的運(yùn)算模擬多進(jìn)程的網(wǎng)絡(luò)服務(wù)。
(1)、utili.h
#include<unistd.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<pthread.h> #define SERVER_PORT 9090 #define SERVER_IP "127.0.0.1" #define LISTEN_QUEUE 5 #define BUFFER_SIZE 255 typedef enum{ADD,SUB,MUL,DIV,MOD, QUIT}OPER_TYPE; typedef struct OperStruct{ int op1; int op2; OPER_TYPE oper; }OperStruct;
(2)、ser.c
#include"../utili.h" void Process_Handler(int sockConn); void Process_Handler(int sockConn){ OperStruct op; int result; while(1){ int res = recv(sockConn, &op, sizeof(op), 0); if(res == -1){ printf("recv data fail.\n"); continue; } if(op.oper == ADD){ result = op.op1 + op.op2; }else if(op.oper == SUB) { result = op.op1 - op.op2; }else if(op.oper == MUL){ result = op.op1 * op.op2; }else if(op.oper == DIV){ result = op.op1 / op.op2; }else if(op.oper == QUIT){ break; } res = send(sockConn, &result, sizeof(result), 0); if(res == -1){ printf("send data fail.\n"); continue; } } close(sockConn); } int main(void){ int sockSer = socket(AF_INET, SOCK_STREAM, 0); if(sockSer == -1){ perror("socket"); return -1; } struct sockaddr_in addrSer, addrCli; addrSer.sin_family = AF_INET; addrSer.sin_port = htons(SERVER_PORT); addrSer.sin_addr.s_addr = inet_addr(SERVER_IP); socklen_t len = sizeof(struct sockaddr); int res = bind(sockSer, (struct sockaddr*)&addrSer, len); if(res == -1){ perror("bind"); close(sockSer); return -1; } listen(sockSer, LISTEN_QUEUE); int sockConn; while(1){ printf("Server Wait Client Connect.......\n"); sockConn = accept(sockSer, (struct sockaddr*)&addrCli, &len); if(sockConn == -1){ printf("Server Accept Client Connect Fail.\n"); continue; }else{ printf("Server Accept Client Connect Success.\n"); printf("Client IP:>%s\n", inet_ntoa(addrCli.sin_addr)); printf("Client Port:>%d\n",ntohs(addrCli.sin_port)); } pid_t pid; pid = fork(); if(pid == 0){ close(sockSer); Process_Handler(sockConn); exit(0); }else if(pid > 0){ close(sockConn); continue; }else{ printf("Create Process Fail.\n"); continue; } } close(sockSer); return 0; }
(3)、cli.c
#include"utili.h" void InputData(OperStruct *pt); void InputData(OperStruct *pt){ printf("please input op1 and op2 : "); scanf("%d %d", &(pt->op1), &(pt->op2)); } //Cli int main(void){ int sockCli = socket(AF_INET, SOCK_STREAM, 0); if(sockCli == -1){ perror("socket"); return -1; } struct sockaddr_in addrSer; addrSer.sin_family = AF_INET; addrSer.sin_port = htons(SERVER_PORT); addrSer.sin_addr.s_addr = inet_addr(SERVER_IP); socklen_t len = sizeof(struct sockaddr); int res = connect(sockCli, (struct sockaddr*)&addrSer, len); if(res == -1){ perror("connect"); close(sockCli); return -1; }else{ printf("Client Connect Server Success.\n"); } char cmd[2]; OperStruct op; int result; while(1){ printf("Please input operator : "); scanf("%s",cmd); if(strcmp(cmd, "+") == 0){ op.oper = ADD; InputData(&op); }else if(strcmp(cmd,"-") == 0){ op.oper = SUB; InputData(&op); }else if(strcmp(cmd,"*") == 0){ op.oper = MUL; InputData(&op); }else if(strcmp(cmd,"/") == 0){ op.oper = DIV; InputData(&op); }else if(strcmp(cmd, "quit") == 0){ op.oper = QUIT; }else{ printf("Cmd invalid.\n"); } res = send(sockCli, &op, sizeof(op), 0); if(res == -1){ printf("send data fail.\n"); continue; } if(op.oper == QUIT) break; res = recv(sockCli, &result, sizeof(result), 0); if(res == -1){ printf("recv data fail.\n"); continue; } printf("result = %d\n", result); } close(sockCli); return 0; }
運(yùn)行結(jié)果:
客戶1
客戶1
客戶2
4、結(jié)果分析
(1)、utili.h在ser.c的上一層目錄,utili.h和cli.c是在同一層目錄;
(2)、進(jìn)程服務(wù)器:socker是引用計(jì)數(shù)器模型,close()是減少一個(gè),并沒(méi)有真正的關(guān)閉,每次創(chuàng)建一個(gè)進(jìn)程都會(huì)給socker引用計(jì)數(shù)器加1;
(3)、缺點(diǎn):a、啟動(dòng)和關(guān)閉子進(jìn)程帶來(lái)很大的開(kāi)銷;b、系統(tǒng)最多只能產(chǎn)生512個(gè)進(jìn)程,也就是說(shuō)最多只有512個(gè)客戶,形成不了處理大型訪問(wèn)的情形;
當(dāng)前名稱:多進(jìn)程網(wǎng)絡(luò)服務(wù)
網(wǎng)站網(wǎng)址:http://bm7419.com/article44/gochee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站維護(hù)、外貿(mào)建站、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)