首页 > 系统相关 >【TCP】并发服务器<进程>

【TCP】并发服务器<进程>

时间:2023-12-14 21:15:57浏览次数:33  
标签:addr int TCP 并发 new sockfd 服务器 include buf

  1 #include <stdio.h>
  2 #include <strings.h>    //bzero
  3 #include <unistd.h>     //close
  4 #include <sys/socket.h> //socket
  5 #include <netinet/in.h> //struct sockaddr_in
  6 #include <arpa/inet.h>  //inet_addr
  7 #include <string.h>
  8 #include <signal.h>
  9 #include <sys/types.h>
 10 #include <sys/wait.h>
 11 #include <stdlib.h>
 12 
 13 void deal_son(int arg)
 14 {
 15     printf("即将回收子进程资源\n");
 16     wait(NULL);
 17     printf("已经回收子进程资源\n");
 18 }
 19 
 20 int main(int argc, char const *argv[])
 21 {
 22     // 1.创建套接字
 23     int sockfd = socket(AF_INET, SOCK_STREAM, 0);
 24     if (sockfd < 0)
 25     {
 26         perror("socket");
 27         return -1;
 28     }
 29     // 端口复用
 30     int yes = 1;
 31     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));
 32     // 2.绑定bind
 33     struct sockaddr_in my_addr;
 34     my_addr.sin_family = AF_INET;
 35     my_addr.sin_port = htons(8000);
 36     my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 机器的所有可用IP地址
 37     int ret = bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
 38     if (ret != 0)
 39     {
 40         perror("bind");
 41         return -1;
 42     }
 43     // 3.监听
 44     int backlog = 10;
 45     ret = listen(sockfd, backlog);
 46     if (ret < 0)
 47     {
 48         perror("listen");
 49         return -1;
 50     }
 51     // 4.提取,等待一个客户端连接
 52     struct sockaddr_in cli_addr;
 53     socklen_t len = sizeof(cli_addr);
 54     char buf[1024] = "";
 55     char ip[16] = "";
 56     int sockfd_new = 0;
 57     while (1)
 58     {
 59         // 保证提取到了正确的客户端,而不是被信号打断
 60         while (1)
 61         {
 62             sockfd_new = accept(sockfd, (struct sockaddr *)&cli_addr, &len);
 63             if (sockfd_new > 0)
 64                 break;
 65         }
 66 
 67         inet_ntop(AF_INET, (void *)&cli_addr.sin_addr, ip, 16);
 68         printf("提取到的客户端: %s--->%hu\n", ip, ntohs(cli_addr.sin_port)); // ip port
 69 
 70         pid_t pid = fork();
 71         if (pid < 0)
 72             close(sockfd_new);
 73         else if (pid == 0)
 74         {
 75             close(sockfd);
 76             // 5.循环收发消息
 77             while (1)
 78             {
 79                 bzero(buf, sizeof(buf));
 80                 recv(sockfd_new, buf, sizeof(buf), 0);
 81                 printf("接收到%s:%hu--->%s\n", ip, ntohs(cli_addr.sin_port), buf);
 82                 send(sockfd_new, "ok", sizeof("ok"), 0);
 83                 if (strcmp(buf, "quit") == 0)
 84                     break;
 85                 // 如果收到了0长度的数据包,意思客户端断开连接,子进程结束
 86                 if (strlen(buf) == 0)
 87                     break;
 88             }
 89             _exit(1);
 90         }
 91         else
 92         {
 93             close(sockfd_new);
 94             // 当子进程结束时,会给父进程发送SIGCHLD信号,父进程收到信号回收资源
 95             signal(SIGCHLD, deal_son); // 无阻塞
 96         }
 97     }
 98 
 99     // 6.关闭套接字
100     close(sockfd_new);
101     close(sockfd);
102     return 0;
103 }

 

标签:addr,int,TCP,并发,new,sockfd,服务器,include,buf
From: https://www.cnblogs.com/mengyaoli/p/17902010.html

相关文章

  • 【HTTP】服务器代码<线程>
    1#include<stdio.h>2#include<pthread.h>3#include<strings.h>4#include<string.h>5#include<unistd.h>6#include<sys/socket.h>7#include<netinet/in.h>8#include<arpa/inet.h>9......
  • 关于EthernetIP转ModbusTCP协议转换的成熟应用
    在现代工业自动化领域,以太网和互联网的集成已经成为一种趋势。Ethernet/IP转ModbusTCP网关作为一种关键的通信设备,能够实现以太网和ModbusTCP协议之间的转换,从而在工业自动化领域中发挥重要作用。本文将详细介绍Ethernet/IP转ModbusTCP网关的应用和配置方法。Ethernet/IP转Mo......
  • 线程数和并发量关系
    并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标。那么他们之间究竟是怎样的一个对应关系和内在联系?测试时,我们经常容易将线程数等同于表述为并发数,这一表述正确吗?本文就将对性能领域的这些关键概念做一次探讨。文章可能会比较长,希望您保持耐心看完。......
  • jemter--性能测试(并发量与吞吐量以及线程数关系)
     1.性能测试满足用户量计算(2、8原则):e.g:业务量10000     时间1min   接口平均响应时间为0.4S   调度时间300s ①吞吐量(QPS)=(10000*80%)/(1*60*20%)=667②并发数=线程数(不循环)=QPS*平均响应时间=667*0.4=266             ......
  • 服务器日记
    查看玩法:自己拥有一台服务器可以做哪些很酷的事情?-知乎(zhihu.com)  自己拥有一台服务器可以做哪些很酷的事情?-知乎(zhihu.com)搜索监控服务器:netdata监控服务器_百度搜索(baidu.com)查看教程:65.7kStar!强大又全面的性能监控工具——Netdata-知乎(zhihu.com)查看......
  • 网络七层协议和TCP
    搭建环境使用nc工具搭建一个TCP服务器。服务端使用命令创建监听端口nc-l-p1023客户端使用命令连接nc<目标ip>-p1023以上使用tcpdump或者wireshark进行抓包搭建环境如下![[Pastedimage20231214135926.png]]使用wireshark抓包如下![[Pastedimage20231214092055.......
  • TCP协议 和 UDP协议 的区别 (三次握手/四次挥手)
    TCP协议拓展:FTP:(File Transfer Protocol)文件传输协议FIle协议:访问本地文件Webscoket:网络通信协议;主动给客户端发送协议FTP:文件传输协议①重点:面试重点:TCP、UDP协议区别UDP(UserDatagramProtocol)......
  • 服务器数据恢复-raid5多块磁盘掉线导致上层卷无法挂载,oracle数据库不可用的数据恢复案
    服务器数据恢复环境:一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列,linux操作系统+ext3文件系统,服务器上层部署有oracle数据库。服务器故障&检测:raid5阵列中有两块硬盘出现故障掉线,导致服务器上层卷无法挂载,oracle数据库无法正常使用。通过管理后台查看服务器中硬盘的状态,......
  • 如何在 Eolink Apikit 中发起 TCP/UDP 文档测试
    TCP/UDP是两种常用的网络传输协议。TCP协议提供可靠的连接,而UDP协议提供不可靠的连接。TCP协议是面向连接的协议,在建立连接之前,客户端和服务器需要先握手。握手完成后,客户端和服务器之间就会建立一个可靠的连接。在连接建立之后,客户端和服务器可以通过该连接进行数据传输。T......
  • python中协程并发io等待
    importasyncioimporttimeasyncdefa():start_time=time.time()print("函数a开始执行")tasks=[asyncio.create_task(b())]#创建一个任务列表,包含函数b的任务print("函数a执行其他操作")awaitasyncio.sleep(14)#休眠1秒print("函数a执行完......