当前位置: 首页 > news >正文

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;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • glsl着色器学习(六)
  • 第 20 章 DOM 进阶
  • ET6框架(五)ECS组件式编程
  • C语言之结构体
  • JS设计模式之“名片设计师” - 工厂方法模式
  • 达梦数据库事务管理
  • java中使用MongoTemplate入门学习
  • 国内可以免费使用的gpt网站【九月持续更新】
  • InstantX团队新作!基于端到端训练的风格转换模型CSGO
  • 鸿蒙(API 12 Beta6版)图形【NativeImage开发指导 (C/C++)】方舟2D图形服务
  • 深度探索Unity与C#:编织游戏世界的奇幻篇章
  • uniapp组件中的emit声明触发事件
  • shell脚本编程(函数)
  • 网络编程--python
  • Vue3 中的响应式系统:深入理解 Proxy API
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【刷算法】从上往下打印二叉树
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android优雅地处理按钮重复点击
  • Angularjs之国际化
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • HTTP请求重发
  • java8 Stream Pipelines 浅析
  • JAVA并发编程--1.基础概念
  • JWT究竟是什么呢?
  • linux安装openssl、swoole等扩展的具体步骤
  • RxJS: 简单入门
  • Swoft 源码剖析 - 代码自动更新机制
  • Webpack入门之遇到的那些坑,系列示例Demo
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从输入URL到页面加载发生了什么
  • 服务器之间,相同帐号,实现免密钥登录
  • 离散点最小(凸)包围边界查找
  • 深入浏览器事件循环的本质
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 用jQuery怎么做到前后端分离
  • 带你开发类似Pokemon Go的AR游戏
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # 达梦数据库知识点
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #APPINVENTOR学习记录
  • (1)(1.11) SiK Radio v2(一)
  • (4)(4.6) Triducer
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (ros//EnvironmentVariables)ros环境变量
  • (函数)颠倒字符串顺序(C语言)
  • (九十四)函数和二维数组
  • (七)c52学习之旅-中断
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (学习日记)2024.01.09
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决