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

网络编程;TCP多进程并发服务器;TCP多线程并发服务器;TCP网络聊天室和UDP网络聊天室;后面两个还没写出来;0911

思维导图

TCP多进程并发服务器

网络编程实现,一个服务器,一个客户端的通信;多进程并发;父进程非阻塞回收子进程资源

代码

#include<myhead.h>
#define SER_IP "172.20.10.3" //服务器ip地址 虚拟机的
#define SER_PORT 8888void handler(int signum)
{//判断 捕获到的信号是SIGCHLDif(signum == SIGCHLD){//以非阻塞的方式回收僵尸进程while(waitpid(-1,NULL,WNOHANG)>0);}
}/****************main function***************/
int main()
{//绑定SIGCHLD信号到处理函数中if(signal(SIGCHLD,handler)==SIG_ERR){perror("signal error");return -1;}//1.创建一个用于连接的 套接字描述符int sfd = socket(AF_INET,SOCK_STREAM,0);if (sfd == -1){perror("socket error");return -1;}printf("sfd = %d\n",sfd);//套接字 设置 端口快速重用int reuse =1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopr error");return -1;}printf("端口已快速重用\n");//2.给套接字绑定ip地址和端口号//2.1 准备地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;//通信域地址族sin.sin_port = htons(SER_PORT);//服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP);//2.2 执行绑定工作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success");//3.将套接字 设置 被动监听状态if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.阻塞等候 客户端的连接//4.1定义地址信息结构体,用于接收客户端地址信息struct sockaddr_in cin;socklen_t addrlen=sizeof(cin); //接收地址长度while(1){//阻塞等待客户端连接int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd ==-1){perror("accept error");return -1;}printf("[%s:%d]-连接成功newfd = %d\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),newfd);//客户端连接成功 创建子进程用于通信pid_t pid=fork();//判断父进程if(pid>0){//父进程//不需要用到newfd,关闭close(newfd);}else if(pid ==0){//用不到sfd,关闭close(sfd);//5.实现数据的的收发char buf[128]="";while(1){//清空bufbzero(buf,sizeof(buf));//从套接字 中 读取消息int res = recv(newfd,buf,sizeof(buf),0);if(res==0){printf("客户端已下线\n");close(newfd);break;}printf("[%s:%d]:%s\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),buf);//给消息加一个:D还回去strcat(buf,":D");send(newfd,buf,strlen(buf),0);printf("发送成功\n");}}}//6.关闭套接字close(sfd);return 0;
}

TCP多线程并发服务器

网络编程实现,一个服务器,一个客户端的通信;多线程并发;线程分离,系统自动回收子线程的资源

代码

#include<myhead.h>
#define SER_IP "172.20.10.3" //服务器ip地址 虚拟机的
#define SER_PORT 8888/****************main function***************/
int main()
{//1.创建一个用于连接的 套接字描述符int sfd = socket(AF_INET,SOCK_STREAM,0);if (sfd == -1){perror("socket error");return -1;}printf("sfd = %d\n",sfd);//套接字 设置 端口快速重用int reuse =1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopr error");return -1;}printf("端口已快速重用\n");//2.给套接字绑定ip地址和端口号//2.1 准备地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;//通信域地址族sin.sin_port = htons(SER_PORT);//服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP);//2.2 执行绑定工作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}printf("bind success");//3.将套接字 设置 被动监听状态if(listen(sfd,128)==-1){perror("listen error");return -1;}printf("listen success\n");//4.阻塞等候 客户端的连接//4.1定义地址信息结构体,用于接收客户端地址信息struct sockaddr_in cin;socklen_t addrlen=sizeof(cin); //接收地址长度while(1){int newfd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd ==-1){perror("accept error");return -1;}printf("[%s:%d]-连接成功newfd = %d\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),newfd);//5.实现数据的的收发char buf[128]="";while(1){//清空bufbzero(buf,sizeof(buf));//从套接字 中 读取消息int res = recv(newfd,buf,sizeof(buf),0);if(res==0){printf("客户端已下线\n");close(newfd);break;}printf("[%s:%d]:%s\n",\inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port),buf);//给消息加一个:D还回去strcat(buf,":D");send(newfd,buf,strlen(buf),0);printf("发送成功\n");}//6.关闭套接字close(sfd);return 0;}
}

基于UDP的网络聊天室

没写出来,下一篇补充一下吧。 (╥﹏╥)


文章转载自:

http://z2U2o9Zy.mqfkd.cn
http://f6iIYaZt.mqfkd.cn
http://DikW7WT1.mqfkd.cn
http://fbmMxgKZ.mqfkd.cn
http://9yepTMQJ.mqfkd.cn
http://O4Mh5Rig.mqfkd.cn
http://8yCsSFgS.mqfkd.cn
http://YmZVfRZs.mqfkd.cn
http://DtmcUe6I.mqfkd.cn
http://Bx72QRVq.mqfkd.cn
http://xlDM6rv4.mqfkd.cn
http://XcHf7wqw.mqfkd.cn
http://3GpGXW1U.mqfkd.cn
http://Um7VQeTB.mqfkd.cn
http://67rxR3bA.mqfkd.cn
http://JmpZn8tZ.mqfkd.cn
http://KHDWB8Kb.mqfkd.cn
http://zK2AGcb7.mqfkd.cn
http://EPtcnGmK.mqfkd.cn
http://M8QX8rIr.mqfkd.cn
http://dAZup9kt.mqfkd.cn
http://2lbtFFwX.mqfkd.cn
http://dYNNzpsM.mqfkd.cn
http://VH1WFBuX.mqfkd.cn
http://gna0ggKN.mqfkd.cn
http://i1L1Byzb.mqfkd.cn
http://xItfymYz.mqfkd.cn
http://wwFV12nr.mqfkd.cn
http://OAuIwtD6.mqfkd.cn
http://sSAO8od4.mqfkd.cn
http://www.dtcms.com/a/377893.html

相关文章:

  • STM32项目分享:基于stm32的室内环境监测装置设计与实现
  • 利用归并算法对链表进行排序
  • GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples
  • Power Automate List Rows使用Fetchxml查询的一个bug
  • Zynq开发实践(FPGA之ddr sdram读写)
  • LeetCode 热题 160.相交链表(双指针)
  • 西门子 S7-200 SMART PLC 编程:转换 / 定时器 / 计数器指令详解 + 实战案例(案例篇)
  • SAM-Med3D:面向三维医疗体数据的通用分割模型(文献精读)
  • 考研复习-计算机网络-第五章-传输层
  • win11安装jdk8-u211-windows
  • 从传统到智能:3D 建模流程的演进与 AI 趋势 —— 以 Blender 为例
  • 开发避坑指南(46):Java Stream 对List的BigDecimal字段进行求和
  • 在OpenHarmony上适配图形显示【3】——添加显示接口类型
  • Node.js 模块化规范详解
  • Neo4j--登录及简单操作
  • 使用nvm安装Node.js18以下报错解决方案——The system cannot find the file specified.
  • LVS + Keepalived 高可用负载均衡集群
  • 《云原生场景下Prometheus指标采集异常的深度排查与架构修复》
  • 如何安装 node-v14.16.1-x64.msi?Node.js 14.16.1 64位MSI安装详细步骤
  • React 基础
  • 自动化SSL证书管理:应对域名SSL证书更新焦虑
  • 跨平台快速上手:Couchbase 安装与使用指南
  • 【译】Visual Studio 八月更新已发布 —— 更智能的人工智能、更出色的调试功能以及更多控制权
  • python+selenium+PO模式
  • Excel表格如何制作?【图文详解】表格Excel制作教程?电脑Excel表格制作?
  • 【基于CNN的57类交通标志识别系统】
  • 【深度学习新浪潮】Nano Banana(Gemini 2.5 Flash Image)技术解析与开发者实操指南
  • 【Qt开发】显示类控件(二)-> QLCDNumber
  • 三角孔径衍射误差难分析?OAS 软件深度仿真解难题
  • 鸿蒙Next Web组件生命周期详解:从加载到销毁的全流程掌控