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

歡迎訪問 生活随笔!

生活随笔

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

linux

linux网络编程(二)高并发服务器

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

linux網(wǎng)絡(luò)編程(二)高并發(fā)服務(wù)器

  • 錯(cuò)誤處理
  • 高并發(fā)服務(wù)器
    • 多進(jìn)程并發(fā)服務(wù)器
    • 客戶端

錯(cuò)誤處理

#include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret = bind(fd, sa, salen)) < 0){perror("bind error:");exit(1);}return ret;}int Accept(int fd, struct sockaddr* sa, socklen_t* salenptr) {int ret;again:if ((ret = accept(fd, sa, salenptr)) < 0){if ((errno == ECONNABORTED) || (errno == EINTR)){goto again;}else{perror("accept error:");exit(1);}}return ret;}int Socket(int family, int type, int protocol) {int ret;if ((ret=socket(family, type, protocol)) == -1){perror("socket error:");exit(1);}return ret; }int Listen(int fd, int backlog) {int ret;if ((ret = listen(fd, backlog)) < 0){perror("listen error:");exit(1);}return ret;}pid_t Fork() {pid_t pid;pid = fork();if (pid < 0){perror("pid error:");exit(1);}else if (pid == 0){//子進(jìn)程return pid;}else{//主進(jìn)程return pid;}}ssize_t Read(int fd, void* ptr, size_t nbytes) {ssize_t n; again:if ((n = read(fd, ptr, nbytes)) == -1){if (errno == EINTR)goto again;elsereturn -1;}return n; }

高并發(fā)服務(wù)器

多進(jìn)程并發(fā)服務(wù)器

使用多進(jìn)程并發(fā)服務(wù)器時(shí)要考慮以下幾點(diǎn):

  • 父進(jìn)程最大文件描述個(gè)數(shù)(父進(jìn)程中需要close關(guān)閉accept返回的新文件描述符)
  • 系統(tǒng)內(nèi)創(chuàng)建進(jìn)程個(gè)數(shù)(與內(nèi)存大小相關(guān))
  • 進(jìn)程創(chuàng)建過多是否降低整體服務(wù)性能(進(jìn)程調(diào)度)
  • #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <strings.h> #include <string.h> #include <ctype.h> #include <signal.h> #include <arpa/inet.h> #include <sys/wait.h>#include "wrap.h" #define SERV_PORT 6666void* wait_child(int signo) {while (waitpid(0, NULL, WNOHANG) > 0);return; }int main() {pid_t pid;int fsd,csd,n;char buf[BUFSIZ],clie_ip[BUFSIZ];struct sockaddr_in serv_addr,clie_addr;socklen_t clie_len;//創(chuàng)建套接字fsd = Socket(AF_INET, SOCK_STREAM, 0);bzero(&serv_addr,sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr =htonl(INADDR_ANY) ;//綁定Bind(fsd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));Listen(fsd, 128);while(1){clie_len = sizeof(clie_addr);//接受客戶端 阻塞csd = Accept(fsd, (struct sockaddr*)&clie_addr, &clie_len);printf("client IP = %s , port = %d \n",inet_ntop(AF_INET,&clie_addr.sin_addr.s_addr, clie_ip,sizeof(clie_ip)),ntohs(&clie_addr.sin_port));pid = Fork();if (pid == 0){//子進(jìn)程close(fsd);break;}else{close(csd);//安裝信號(hào),子進(jìn)程結(jié)束回收signal(SIGCHLD,wait_child);}}//子進(jìn)程 接受的客戶端的小寫字符轉(zhuǎn)化成大寫字符if (pid == 0){while (1){n = Read(csd, buf, sizeof(buf));if (n == 0){close(csd);return 0;}else if (n > 0){write(STDOUT_FILENO, buf, sizeof(buf));for (int i = 0; i < n; i++){//轉(zhuǎn)化大寫buf[i] = toupper(buf[i]);}write(csd, buf, n);}//清空數(shù)組memset(buf, 0, sizeof(buf));}}return 0;}

    客戶端

    #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <netinet/in.h> #include <arpa/inet.h> #include <ctype.h> #include <stdio.h> #include <memory.h>#define CLIE_PORT 6666 #define CLIE_IP "118.178.192.222"int main() {char buf[BUFSIZ] = {0};struct in_addr s; // IPv4地址結(jié)構(gòu)體int cfd,ret,n;struct sockaddr_in addr;//客服端創(chuàng)建套接字cfd = socket(AF_INET,SOCK_STREAM,0);if (cfd == -1){perror("client error:");exit(1);}memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(CLIE_PORT);inet_pton(AF_INET, CLIE_IP,&addr.sin_addr.s_addr);ret =connect(cfd,(struct sockaddr *)&addr,sizeof(addr));if (ret <0){perror("connect error:");exit(1);}while (1){//從終端寫入fgets(buf,sizeof(buf),stdin);write(cfd,buf,strlen(buf));n=read(cfd, buf, sizeof(buf));printf("n = %d",n);if(n==0){exit(1);}write(STDOUT_FILENO, buf, n);memset(buf, 0, sizeof(buf));}close(cfd);return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的linux网络编程(二)高并发服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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