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

  • 错误处理
  • 高并发服务器
    • 多进程并发服务器
    • 客户端

错误处理

#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){//子进程return pid;}else{//主进程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;
}

高并发服务器

多进程并发服务器

使用多进程并发服务器时要考虑以下几点:

  1. 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)
  2. 系统内创建进程个数(与内存大小相关)
  3. 进程创建过多是否降低整体服务性能(进程调度)
#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;//创建套接字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){//子进程close(fsd);break;}else{close(csd);//安装信号,子进程结束回收signal(SIGCHLD,wait_child);}}//子进程 接受的客户端的小写字符转化成大写字符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++){//转化大写buf[i] = toupper(buf[i]);}write(csd, buf, n);}//清空数组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地址结构体int cfd,ret,n;struct sockaddr_in addr;//客服端创建套接字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;
}

linux网络编程(二)高并发服务器相关推荐

  1. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  2. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  3. linux网路编程之多线程并发服务器

    1)在使用进程模型开发服务器过程中考虑以下问题 (1)调整进程内最大文件描述符上限 (2)线程如有共享,考虑线程同步 (3)客户端线程退出时,做退出处理(线程分离,自动回收) (4)系统负载,随着链接 ...

  4. linux网路编程之多进程并发服务器

    1)使用多进程并发服务器考虑的因素: (1)父进程描述最大文件描述符的个数(父进程需要关闭accept返回的新文件描述符) (2)系统内可创建进程的个数(与内存大小相关) (3)进程创建过多是否降低整 ...

  5. Linux IO多路复用之epoll网络编程,高并发的使用例子 (含源码)

    本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下: 客户端从标准输入读入一行,发送到服务端 服务端从网络读取一行,然 ...

  6. python网络编程及高并发问题

    面试其他篇 目录: 1.1 转载于:https://www.cnblogs.com/xiaonq/p/10460298.html

  7. linux网络编程二十:socket选项:SO_RCVTIMEO和SO_SNDTIMEO

  8. Linux高并发服务器开发---笔记4(网络编程)

    0705 第4章 项目制作与技能提升 4.0 视频课链接 4.1 项目介绍与环境搭建 4.2 Linux系统编程1.4.3 Linux系统编程2 4.4 多进程 1-9 10.进程间通信☆☆☆ 4.5 ...

  9. Linux网络编程(六)-高并发服务器03-I/O多路复用03:epoll【红黑树;根节点为监听节点】【无宏FD_SETSIZE限制;不需每次都将要监听的文件描述符从应用层拷贝到内核;不需遍历树】

    一.epoll概述 epoll的本质是一个[红黑树].监听结点为根节点. 大量并发,少量活跃效率高. epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并 ...

最新文章

  1. Python中xPath技术和BeautifulSoup的使用
  2. 数据结构关键路径_2021年厦门大学考研丨能源学院845数据结构参考书目推荐
  3. UVA - 10817 Headmaster's Headache
  4. 机器学习--python代码实现基于Fisher的线性判别(鸢尾花数据集的分类)
  5. centos自定义服务并加入开机启动
  6. 学了这几招,社交时人人都对你刮目相看
  7. dh算法 理论依据_DH算法
  8. DateTimeFormatter获取时间戳
  9. mysql多表查询去重复数据_SQL重复记录查询 查询多个字段、多表查询、删除重复记录的方法...
  10. 内存带宽性能测试工具
  11. Netty In Action中文版 - 第一章:Netty介绍
  12. 使用word完成海报制作说明书
  13. IMX6q ft5x0x_ts触摸芯片分析
  14. 随笔小记-12.31
  15. C/C++语言 ++i 与 i++ 详解
  16. js-只能输入数字(正则)
  17. 如何使用掘金进行量化策略绩效分
  18. 微软日语输入法全掌握
  19. IPNC_RDK_McFW_UserGuide
  20. Windows - 30元搞定Windows Hello人脸解锁

热门文章

  1. SpringBoot03 项目热部署
  2. Delta DVP 系列 PLC 各装置 Modbus 地址
  3. python基础:迭代器、生成器(yield)详细解读
  4. node源码详解(五)
  5. 判断线段和直线相交 POJ 3304
  6. Android N 新特性 + APP开发注意事项
  7. PostgreSQL 中的递归查询 与oracle 的比较
  8. CLI下的网页浏览器之二——Lynx
  9. mybatis源码_Mybatis源码之SqlSession
  10. python闭包的应用场景_简单谈谈Python中的闭包