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

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.mzph.cn/news/878652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Grafana】Prometheus结合Grafana打造智能监控可视化平台

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Oracle 客户端 PL/SQL Developer 15.0.4 安装与使用

目录 官网下载与安装 切换中文与注册 连接Oracle数据库 tnsnames.ora 文件使用 Oracle 客户端 PL/SQL Developer 12.0.7 安装、数据导出、Oracle 执行/解释计划、for update。 官网下载与安装 1、官网&#xff1a;https://www.allroundautomations.com/products/pl-sql-d…

Redis的配置和启动+Redis Insight连接

一、安装 Redis的安装&#xff1a;从镜像站下载&#xff1a;索引 redis-local (huaweicloud.com)&#xff0c;然后将其传到Linux虚拟机中进行解压&#xff0c;解压之后需要下载gcc&#xff0c;因为Redis底层是用c写的&#xff0c;所以要编译一下生成redis文件&#xff0c;然后…

vite项目配置本地开发使用https访问

在Vite项目中启用HTTPS以安全地使用navigator.mediaDevices.getUserMedia() 引言 在现代Web开发中&#xff0c;保护用户隐私和数据安全是至关重要的。特别是在涉及到媒体捕获功能&#xff0c;如使用用户的摄像头或麦克风时&#xff0c;Web应用需要遵循严格的安全准则。naviga…

反向迭代器:reverse_iterator的实现

目录 前言 特点 注意事项 实现 构造函数 功能函数 在list与vector中的使用 vector list 前言 反向迭代器是一种在序列容器的末尾开始&#xff0c;并向前移动至序列开始处的迭代器。在C中&#xff0c;反向迭代器由标准库中的容器类提供&#xff0c;比如vector、list、d…

Ansible剧本编写指南:从简单任务到复杂自动化的实现

Ansible剧本编写指南&#xff1a;从简单任务到复杂自动化的实现 Ansible 是一个流行的开源自动化工具&#xff0c;被广泛用于配置管理、应用部署、任务自动化以及 IT 基础设施的编排。它的核心是简单且易于学习的 YAML 格式&#xff0c;使用户能够编写可重用、可维护的剧本&am…

Qt 字符串的编码方式,以及反斜杠加3个数字是什么编码\344\275\240,如何生成

Qt 字符串的编码方式 问题 总所周知&#xff0c;Qt的ui文件在编译时&#xff0c;会自动生成一个ui_xxxxx.h的头文件&#xff0c;打开一看&#xff0c;其实就是将摆放的控件new出来以及布局的代码。 只要用Qt提供的uic.exe工具&#xff0c;自己也可以将ui文件输出为代码文件…

rust feature 简介

Rust 的 feature 是一种机制&#xff0c;用于在编译时选择性地启用或禁用代码的某些部分。通过 feature&#xff0c;你可以在 Cargo.toml 中定义哪些功能需要启用&#xff0c;并在代码中通过条件编译来控制代码的编译与否。下面是 feature 机制的详解&#xff1a; 1. 基本概念…

设计模式 18 备忘录模式

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

c# 笔记 winform添加右键菜单,获取文件大小 ,多条件排序OrderBy、ThenBy,list<double>截取前5个

Winform右键菜单‌ 要在C# Winform应用程序中添加右键菜单&#xff0c;‌你可以按照以下步骤操作&#xff1a;‌ 1.‌创建菜单项‌ 在Form的构造函数或加载事件中&#xff0c;‌创建ContextMenuStrip控件的实例&#xff0c;‌并为其添加菜单项。‌ 2.‌绑定到控件‌ 将Con…

tcp 流量控制

TCP流量控制是TCP/IP协议中用于控制发送方和接收方之间数据传输速率的一种机制&#xff0c;以防止网络拥塞和确保网络资源的有效利用。流量控制主要通过调整TCP窗口大小来实现&#xff0c;确保发送方不会发送超出接收方处理能力的数据量。以下是TCP流量控制的关键概念和工作原理…

c++ websocket简单讲解

只做简单讲解。 一.定义和原理 WebSocket 是从 HTML5 开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制&#xff0c;传统的 web 程序都是属于 "⼀问⼀答" 的形式&#xff0c;即客⼾端给服务器发送了⼀个 HTTP 请求&#xff0c;服务器给客⼾端返回⼀个 HTTP 响…

Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue

BlockingQueue BlockingQueue 是Java并发包&#xff08;java.util.concurrent&#xff09;中提供的一个阻塞队列接口&#xff0c;它继承自 Queue 接口。 BlockingQueue 中的元素采用 FIFO 的原则&#xff0c;支持多线程环境并发访问&#xff0c;提供了阻塞读取和写入的操作&a…

视频汇聚平台LntonAIServer视频质量诊断功能--偏色检测与噪声检测

随着视频监控技术的不断进步&#xff0c;视频质量成为了决定监控系统性能的关键因素之一。LntonAIServer新增的视频质量诊断功能&#xff0c;特别是偏色检测和噪声检测&#xff0c;进一步强化了视频监控系统的可靠性和实用性。下面我们将详细介绍这两项功能的技术细节、应用场景…

【AI】Pytorch_损失函数优化器

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 本文已达到10w字&#xff0c;故按模块拆开&#xff0c;详见目录导航。 整体框架如下 数据及预处理 模型及其构建 损失函数及优化器 本节目录 损失函数创建损失函数 &#xff08;共18个&#xff09;nn.CrossEnt…

【openwrt-21.02】T750 openwrt MT7916 WPS PBC功能实现

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …

MySQL数据备份策略监控:实现方法与最佳实践

数据备份是数据库管理中的重要环节&#xff0c;它确保了在数据丢失或损坏的情况下能够恢复数据。在MySQL中&#xff0c;实施有效的数据备份策略监控对于保障数据安全和业务连续性至关重要。监控不仅可以帮助及时发现备份过程中的问题&#xff0c;还可以确保备份数据的完整性和可…

iOS 收集打印日志

可以将要在Xcode 控制台打印的日志写在沙盒&#xff0c;最后导出分享&#xff0c;进行问题分析。 正式版本不建议使用&#xff0c;避免增加用户内存。配合解决顽固 Bug 可以通过该方法收集打印日志 .h头文件 interface LogManager : NSObject(FSLogManager *)shareInstance; -…

【多场景应用】基于杰发科技AC7840x的Mini LED背光驱动设计

应用场景&#xff1a; 在汽车应用中&#xff0c;Mini LED背光驱动设计主要用于仪表盘、中控屏和车载娱乐系统等显示屏。这项技术可以显著提升显示效果&#xff0c;提供更高的亮度、更深的黑色和更广的色域&#xff0c;使得图像更加生动逼真&#xff0c;尤其在强光和宽温度范围…

Redis 篇-深入了解查询缓存与缓存所带来的问题(读写不一致、缓存穿透、缓存雪崩、缓存击穿)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本章目录 1.0 什么是缓存 2.0 项目中具体如何添加缓存 3.0 添加缓存后所带来的问题 3.1 读写不一致问题 3.1.1 缓存更新策略 3.1.2 具体实现缓存与数据库的双写一致 3.2 缓存穿…