TCP协议多进程多线程并发服务器

news/2024/9/17 8:10:46/ 标签: tcp/ip, 服务器, 算法, linux, 开发语言, c语言, 网络协议

TCP多进程多线程并发服务器

1.多进程并发服务器

#include <myhead.h>#define SERPORT 6666
#define SERIP "192.168.0.136"
#define BLACKLOG 10void hande(int a)
{if(a==SIGCHLD){while(waitpid(-1,NULL,WNOHANG)!=-1);//回收僵尸进程}
}int main(int argc, const char *argv[])
{if(signal(SIGCHLD,hande)==SIG_ERR)//捕获子进程退出的信号{perror("signal");return -1;}//1.创建原始套接字int oldfd = socket(AF_INET,SOCK_STREAM,0);//IPV4,TCP通信方式if(oldfd ==-1){perror("socket");return -1;}//设置套接字属性,端口号快速复用int k=666;if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k))==-1){perror("setsockopt");return -1;}//2.绑定IP和端口struct sockaddr_in sin={.sin_family=AF_INET,.sin_port=htons(SERPORT),.sin_addr.s_addr=inet_addr(SERIP)};if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("bind");return -1;}//3.监听if(listen(oldfd,BLACKLOG)==-1){perror("listen");return -1;}//4.循环接受客户端请求,创建进程struct sockaddr_in cin;int cinlen=sizeof(cin);while(1){int newfd=accept(oldfd,(struct sockaddr *)&cin,&cinlen);//接受客户端信息(IP和端口号)if(newfd==-1){perror("accept");return -1;}printf("%s:%d连接成功\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));pid_t pid=fork();//创建进程if(pid>0)//{close(newfd);//关闭上一次退出的文件描述符}else if(pid==0){char buff[1024];while(1){int len=recv(newfd,buff,sizeof(buff),0);//接受客户端发送来的信息if(len==0){printf("客户端退出\n");break;}printf("服务器收到的消息:%s\n",buff);strcat(buff,"/succ");send(newfd,buff,sizeof(buff),0);printf("发送成功\n");close(newfd);//关闭新的文件描述符exit(0);//退出子进程}}else{perror("fork");return -1;}}close(oldfd);return 0;
}

2.多线程并发服务器

#include <myhead.h>#define SERPORT 6666
#define SERIP "192.168.0.136"
#define BLACKLOG 10typedef struct
{int newfd;//存储新文件描述符struct sockaddr_in cin;//存储客户端信息
}New;void *fun1(void *a)
{int newfd = ((New *)a)->newfd;struct sockaddr_in cin = ((New *)a)->cin;//解析客户端信息char buff[1024];while(1){memset(buff,0,sizeof(buff));int len = recv(newfd,buff,sizeof(buff),0);printf("收到%s:%d的信息:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buff);//输出客户端信息if(len==0){printf("客户端退出\n");break;}strcat(buff,"/succ");//回个信息send(newfd,buff,sizeof(buff),0);printf("发送成功\n");}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//1.创建原始套接字int oldfd = socket(AF_INET,SOCK_STREAM,0);//IPV4,TCP通信方式if(oldfd ==-1){perror("socket");return -1;}//设置套接字属性,端口号快速复用int k=666;if(setsockopt(oldfd,SOL_SOCKET,SO_REUSEADDR,&k,sizeof(k))==-1){perror("setsockopt");return -1;}//2.绑定IP和端口struct sockaddr_in sin={.sin_family=AF_INET,.sin_port=htons(SERPORT),.sin_addr.s_addr=inet_addr(SERIP)};if(bind(oldfd,(struct sockaddr *)&sin,sizeof(sin))==-1){perror("bind");return -1;}//3.监听if(listen(oldfd,BLACKLOG)==-1){perror("listen");return -1;}struct sockaddr_in cin;int cinlen=sizeof(cin);New msg;while(1){int newfd=accept(oldfd,(struct sockaddr *)&cin,&cinlen);//接受客户端信息(IP和端口号)if(newfd==-1){perror("accept");return -1;}printf("%s:%d连接成功\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));msg.newfd=newfd;msg.cin=cin;pthread_t tid;if(pthread_create(&tid,NULL,fun1,&msg)!=0)//创建线程,传入参数结构体{perror("pthread_create");return -1;}pthread_detach(tid);//挂起由系统回收线程}close(oldfd);return 0;
}

客户端:

#include <myhead.h>#define CLIPORT 6666
#define CLIIP "192.168.0.136"
int main(int argc, const char *argv[])
{int oldfd = socket(AF_INET,SOCK_STREAM,0);//1、创建原始套节字if(oldfd==-1){perror("socket");return -1;}//2、bind可选//3、连接服务器struct sockaddr_in cin = {.sin_family = AF_INET,//IPV4通信.sin_port = htons(CLIPORT),//端口号转为网络字节序.sin_addr.s_addr = inet_addr(CLIIP)//IP地址转为网络字节序};if(connect(oldfd,(struct sockaddr *)&cin,sizeof(cin))==-1){perror("connect");return -1;}printf("连接服务器成功\n");//发送消息char buff[1024];while(1){memset(buff,0,sizeof(buff));printf("客户端发信息:");fgets(buff,sizeof(buff),stdin);buff[strlen(buff)-1] = '\0';send(oldfd,buff,sizeof(buff),0);//阻塞发送recv(oldfd,buff,sizeof(buff),0);//阻塞接收printf("收到服务器的消息:%s\n",buff);}close(oldfd);return 0;
}

广播发送接收端

广播发送端:采用setsockopt 设置网络属性,为允许广播

#include <myhead.h>
#define SENDPORT 6666
#define SENDIP "192.168.0.255"//广播IP地址int main(int argc, const char *argv[])
{//1、创建套接字int oldfd = socket(AF_INET,SOCK_DGRAM,0);if(oldfd==-1){perror("socket");return -1;}//2、设置套接字允许广播int k=2;if(setsockopt(oldfd,SOL_SOCKET,SO_BROADCAST,&k,sizeof(k))==-1){perror("setsockopt");return -1;}printf("设置允许广播成功\n");struct sockaddr_in send = {.sin_family = AF_INET,.sin_port = htons(SENDPORT),.sin_addr.s_addr = inet_addr(SENDIP)};struct sockaddr_in rec;int reclen = sizeof(rec);char buff[1024];//3、发送信息while(1){memset(buff,0,sizeof(buff));sleep(5);strcat(buff,"/successful");sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&send,sizeof(send));printf("发送成功\n");}close(oldfd);//关闭套接字return 0;
}

广播接收端:

#include <myhead.h>
#define SENDPORT 6666
#define SENDIP "192.168.0.255"//广播IP地址
int main(int argc, const char *argv[])
{
//1、创建套接字int oldfd = socket(AF_INET,SOCK_DGRAM,0);if(oldfd==-1){perror("socket");return -1;}
//绑定struct sockaddr_in rec = {.sin_family = AF_INET,.sin_port = htons(SENDPORT),.sin_addr.s_addr = inet_addr(SENDIP)};if(bind(oldfd,(struct sockaddr *)&ree,sizeof(ree))==-1){perror("bind");return -1;}char buff[1024];while(1){bzero(buff,sizeof(buff));recvfrom(oldfd,buff,sizeof(buff),0,NULL,NULL);//接收消息printf("%s\n",buff);strcat(buff,"/suc");sendto(oldfd,buff,sizeof(buff),0,(struct sockaddr *)&rec,sizeof(rec));printf("发送成功\n");}return 0;


http://www.ppmy.cn/news/1522791.html

相关文章

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …

Gin自定义校验函数

在Web开发中&#xff0c;数据验证是确保用户输入符合预期格式的关键步骤。Gin框架通过集成go-playground/validator包&#xff0c;提供了强大的数据验证功能。除了内置的验证规则&#xff0c;Gin还支持自定义验证函数&#xff0c;这使得我们可以针对特定的业务需求灵活地定义验…

GitHub每日最火火火项目(9.8)

项目名称&#xff1a;polarsource / polar 项目介绍&#xff1a;polar 是一个开源的项目&#xff0c;它是 Lemon Squeezy 的替代方案&#xff0c;并且具有更优惠的价格。这个项目的目标是让开发者能够在自己热爱的编码工作中获得报酬。它为开发者提供了一种新的选择&#xff0c…

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式&#xff08;Singleton Pattern&#xff09; 确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 示例代码&#xff1a; class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance this;this.data []…

数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树

文章目录 树与二叉树的应用1.哈夫曼树与哈夫曼曼编码1.1 带权路径长度1.2 哈夫曼树1.2.1 哈夫曼树的构造1.3 哈夫曼编码 2.并查集2.1 并查集的三要素2.1.1 并查集的逻辑结构2.1.2 并查集的存储结构 2.2 并查集的优化2.2.1 初步优化&#xff08;并操作优化&#xff09;2.2.2 终极…

mybatis官方仓库-常用的仓库都有哪些作用

在GitHub上&#xff0c;MyBatis组织下的37个仓库主要涵盖了MyBatis框架的各个方面&#xff0c;包括但不限于核心框架、插件、工具、示例以及与其他技术的集成等。以下是对这些仓库功能的大致分类和描述&#xff1a; MyBatis 核心项目 mybatis-3&#xff1a;这是MyBatis的核心…

C语言深度剖析--不定期更新的第五弹

const关键字 来看一段代码&#xff1a; #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下&#xff1a; 接下来我们在上面的代码做小小的修改&#xff1a; #include <stdio.h> int main() {const int a 1…

2024数学建模国赛ABCDE题选题分析及初步思路

高教社杯全国大学生数学建模竞赛&#xff08;以下简称“国赛”&#xff09;是面向全国大学生的一项重要赛事&#xff0c;旨在培养学生的数学建模能力、团队合作能力和科学研究能力。近年来&#xff0c;国赛的参赛人数和比赛难度不断提升&#xff0c;对参赛者的数学建模能力提出…

C++复习day05

类和对象 1. 面向对象和面向过程的区别是什么&#xff1f;&#xff08;开放性问题&#xff09; 1. **抽象级别**&#xff1a;- **面向对象**&#xff1a;以对象&#xff08;数据和方法的集合&#xff09;为中心&#xff0c;强调的是数据和行为的封装。- **面向过程**&#xf…

探索fastFM:Python中的高效推荐系统库

文章目录 &#x1f680; 探索fastFM&#xff1a;Python中的高效推荐系统库背景&#xff1a;为何选择fastFM&#xff1f;快照&#xff1a;fastFM是什么&#xff1f;安装指南&#xff1a;如何将fastFM加入你的项目&#xff1f;快速入门&#xff1a;五个基础函数的使用实战演练&am…

C语言第二周课

目录 引言: 一、数据类型大小及分类 (1)计算机中常用存储单位 (2)整体介绍一下C语言的数据类型分类。 (3)下面是我们本节课要学的基本内容----常用的数据类型 二、 数据类型的数值范围 三、打印输出类型 数据类型打印示例: 引言: 我们常常在写C语言程序时&#xff0c;总…

滚雪球学MyBatis-Plus(13):测试与部署

前言 在上期内容中&#xff0c;我们深入探讨了 MyBatis Plus 的高级功能&#xff0c;包括自定义 SQL 注解、批量操作以及数据加密与解密。这些功能极大地提高了开发效率&#xff0c;并增强了数据操作的灵活性和安全性。 本期内容将重点介绍 MyBatis Plus 的测试与部署。我们将…

win2003_prepatched_v6b有效期到2021年4月2日,所以编译win2k3会有错误

openssl 查看证书pfx过期时间win2003_prepatched_v6b有效期到2021年4月2日&#xff0c;所以编译win2k3会有错误 要使用OpenSSL查看PFX&#xff08;也称为PKCS#12&#xff09;证书的过期时间&#xff0c;你可以使用以下命令&#xff1a; openssl pkcs12 -in your_certificate.p…

设计模式 19 观察者模式

设计模式 19 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

自动化抢票 12306

自动化抢票 12306 1. 明确需求 明确采集的网站以及数据内容 网址: https://kyfw.12306.cn/otn/leftTicket/init数据: 车次相关信息 2. 抓包分析 通过浏览器开发者工具分析对应的数据位置 打开开发者工具 F12 或鼠标右键点击检查 刷新网页 点击下一页/下滑网页页面/点击搜…

stm32之外部flash下载算法

文章目录 下载算法下载到芯片的核心思想算法程序中擦除操作执行流程擦除操作大致流程&#xff1a;算法程序中编程操作执行流程算法程序中校验操作执行流程 创建MDK下载算法通用流程第1步&#xff0c;使用MDK提供好的程序模板第2步&#xff0c;修改工程名第3步&#xff0c;修改使…

LiveKit的agent介绍

概念 LiveKit核心概念&#xff1a; Room&#xff08;房间&#xff09;Participant&#xff08;参会人&#xff09;Track&#xff08;信息流追踪&#xff09; Agent 架构图 ​ 订阅信息流 ​ agent交互流程 客户端操作 加入房间 房间创建方式 手动 赋予用户创建房间的…

STM32(十二):DMA直接存储器存取

DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源。&#xff08;运行内存SRAM、程序存储器Flash、寄存器&#xff09; 12个独立可配置的通道&…

SAP自动化操作

业务场景 1、主数据维护&#xff08;物料、成本中心、科目、资产、供应商、客户等等&#xff09; 2、业务单据创建&#xff08;包括内部订单、销售订单&#xff0c;采购订单&#xff0c;生产订单&#xff0c;交货单等等&#xff09; 3、业务单据处理&#xff08;订单评审&…

HTTP 二、进阶

四、安全 1、TLS是什么 &#xff08;1&#xff09;为什么要有HTTPS ​ 简单的回答是“因为 HTTP 不安全”。由于 HTTP 天生“明文”的特点&#xff0c;整个传输过程完全透明&#xff0c;任何人都能够在链路中截获、修改或者伪造请求 / 响应报文&#xff0c;数据不具有可…