网络—DAY4

思维导图

多进程并发服务器
 

#include<myhead.h>
#define SER_IP "192.168.122.56"
#define SER_PORT 8888
void handler(int signo)
{if(signo==SIGCHLD){while(waitpid(-1,NULL,WNOHANG)>0);}
}
int main(int argc, char *argv[])
{//将SIGCHLD信号与处理函数绑定if(signal(SIGCHLD,handler)==SIG_ERR){perror("signal");return -1;}//创建套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket");return -1;}printf("socket success sfd=%d\n",sfd);//端口快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt");return -1;}printf("端口号快速重用成功\n");//绑定ip地址和端口//填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind");return -1;}  printf("bind success\n");//将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen");return -1;}printf("listen success\n");//阻塞等待客户端连接//第二个参数->我要记录发送连接方的地址信息结构体struct sockaddr_in cin;socklen_t socklen=sizeof(cin);while(1){int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd==-1){perror("accept");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){//accept创了一个newfd,父进程中不使用,关闭close(newfd);}else if(pid==0){//数据通信char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int ret = recv(newfd,rbuf,sizeof(rbuf),0);if(ret==0){printf("客户端已下线\n");break;}printf("[%s:%d]:%s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}close(newfd);exit(EXIT_SUCCESS);}}close(sfd);return 0;
}

多线程并发服务器
 

#include<myhead.h>
#define SER_IP "192.168.122.56"
#define SER_PORT 8888
struct MsgInfo
{int newfd;struct sockaddr_in cin;
};void* deal_cli_msg(void* arg)
{//将传递进来的数据解析出来int newfd=((struct MsgInfo*)arg)->newfd;struct sockaddr_in cin=((struct MsgInfo*)arg)->cin;//数据通信char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int ret = recv(newfd,rbuf,sizeof(rbuf),0);if(ret==0){printf("客户端已下线\n");break;}printf("[%s:%d]:%s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}close(newfd);pthread_exit(NULL);
}
int main(int argc, char *argv[])
{//创建套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket");return -1;}printf("socket success sfd=%d\n",sfd);//端口快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockopt");return -1;}printf("端口号快速重用成功\n");//绑定ip地址和端口//填充地址信息结构体struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);//绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind");return -1;}  printf("bind success\n");//将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen");return -1;}printf("listen success\n");//阻塞等待客户端连接//第二个参数->我要记录发送连接方的地址信息结构体struct sockaddr_in cin;socklen_t socklen=sizeof(cin);while(1){int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);if(newfd==-1){perror("accept");return -1;}printf("[%s:%d]:已连接,newfd=%d\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);//定义用于传参的变量struct MsgInfo info={newfd,cin};//创建分支线程用于通信pthread_t tid=-1;if(pthread_create(&tid,NULL,deal_cli_msg,&info)==-1){printf("创建线程失败\n");return -1;}//回收分支线程的资源pthread_detach(tid);}close(sfd);return 0;
}

流式域套接字服务器

#include<myhead.h>
int main(int argc, char *argv[])
{//创建套接字int sfd=socket(AF_UNIX,SOCK_STREAM,0);if(sfd==-1){perror("socket");return -1;}printf("socket success sfd=%d\n",sfd);//判断要绑定的套接字文件是否存在if(access("./unix",F_OK)==0){//说明文件存在,将其删除if(unlink("./unix")!=0){perror("unlink");return -1;}}//绑定ip地址和端口//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");//绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind");return -1;}  printf("bind success\n");//将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen");return -1;}printf("listen success\n");//阻塞等待客户端连接//第二个参数->我要记录发送连接方的地址信息结构体struct sockaddr_un cun;socklen_t socklen=sizeof(cun);int newfd=accept(sfd,(struct sockaddr*)&cun,&socklen);if(newfd==-1){perror("accept");return -1;}printf("[%s]:已连接,newfd=%d\n",cun.sun_path,newfd);//数据通信char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));int ret = recv(newfd,rbuf,sizeof(rbuf),0);if(ret==0){printf("客户端已下线\n");break;}printf("[%s]:%s\n",cun.sun_path,rbuf);strcat(rbuf,"*_*");send(newfd,rbuf,strlen(rbuf),0);printf("发送成功\n");}close(sfd);close(newfd);return 0;
}

流式域套接字客户端
 

#include<myhead.h>
int main(int argc, char *argv[])
{int cfd=socket(AF_UNIX,SOCK_STREAM,0);if(cfd==-1){perror("socket");return -1;}printf("socket success\n");if(access("./linux",F_OK)==0){if(unlink("./linux")!=0){perror("unlink");return -1;}}//绑定ip地址和端口	//填充地址信息结构体struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./linux");//绑定if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind");return -1;}struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");if(connect(cfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("connect");return -1;}printf("connect success\n");char wbuf[128]="";while(1){printf("请输入>>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';if(strcmp(wbuf,"quit")==0){break;}send(cfd,wbuf,strlen(wbuf),0);bzero(wbuf,sizeof(wbuf));recv(cfd,wbuf,sizeof(wbuf),0);printf("收到消息为:%s\n",wbuf);}close(cfd);return 0;
}

报式域套接字服务器
 

#include<myhead.h>
int main(int argc, char *argv[])
{//创建套接字int sfd=socket(AF_UNIX,SOCK_DGRAM,0);if(sfd==-1){perror("socket");return -1;}printf("socket success sfd=%d\n",sfd);//判断要绑定的套接字文件是否存在if(access("./unix",F_OK)==0){//说明文件存在,将其删除if(unlink("./unix")!=0){perror("unlink");return -1;}}//绑定ip地址和端口//填充地址信息结构体struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");//绑定if(bind(sfd,(struct sockaddr*)&sun,sizeof(sun))==-1){perror("bind");return -1;}  printf("bind success\n");//第二个参数->我要记录发送连接方的地址信息结构体struct sockaddr_un cun;socklen_t socklen=sizeof(cun);//数据通信char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cun,&socklen);printf("[%s]:%s\n",cun.sun_path,rbuf);strcat(rbuf,"*_*");if(sendto(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("sendto");return -1;}printf("发送成功\n");}close(sfd);return 0;
}

报式域套接字客户端
 

#include<myhead.h>
int main(int argc, char *argv[])
{int cfd=socket(AF_UNIX,SOCK_DGRAM,0);if(cfd==-1){perror("socket");return -1;}printf("socket success\n");//判断要绑定的套接字文件是否存在if(access("./linux",F_OK)==0){//说明文件存在,将其删除if(unlink("./linux")!=0){perror("unlink");return -1;}}struct sockaddr_un cun;cun.sun_family=AF_UNIX;strcpy(cun.sun_path,"./linux");if(bind(cfd,(struct sockaddr*)&cun,sizeof(cun))==-1){perror("bind");return -1;}struct sockaddr_un sun;sun.sun_family=AF_UNIX;strcpy(sun.sun_path,"./unix");char wbuf[128]="";while(1){printf("请输入>>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;sendto(cfd,wbuf,strlen(wbuf),0,(struct sockaddr*)&sun,sizeof(sun));printf("发送成功\n");recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);printf("收到服务器消息:%s\n",wbuf);}close(cfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821351.shtml

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

相关文章

项目中,如何写 readme.md 文件 | 写项目总结

tips&#xff1a;注意写 1. readme文件&#xff1a;①项目文档&#xff08;项目需求和设计文档、项目系统架构和技术文档、接口文档&#xff09;、②项目结构、③启动项目。具体结构见下文。 2. 项目总结&#xff1a;技术栈、描述、主要工作&#xff01;&#xff01;需求及功…

递归、搜索与回溯算法——递归

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享递归,搜索与回溯算法关于递归的专题 如果有不足的或者错误的请您指出! 目录 1.什么时候使用递归2.汉诺塔2.1解析2.2题解 3.合并两个有序链表3.1解析3.2题解 4.翻转链表4.1解析4…

人类连接的桥梁:探索Facebook如何连接世界

随着技术的发展和全球化的进程&#xff0c;我们的世界正在变得越来越紧密相连。在这个过程中&#xff0c;社交媒体平台扮演了一个至关重要的角色&#xff0c;为人们提供了一个跨越国界、文化和语言的交流平台。其中&#xff0c;Facebook作为全球最大的社交媒体平台&#xff0c;…

rancher踩坑日志:prometheus访问kubelet 10250端口提示鉴权失败

该原因是因为kubectl禁止了非授权用户访问10250端口来获取node的数据。 解决思路&#xff1a; 添加prometheus访问kubelet时带上证书进行验证匹配 --> 由于我的prometheus是rancher安装的&#xff0c;不知道要怎么修改所以研究了一会没研究明白就放弃了。设置prometheus访问…

如何批量删除不包含指定关键字的数据行?

一、需求 有一个报名表&#xff0c;包括年龄&#xff0c;地址&#xff0c;特长等数据&#xff0c;现在想删除特长一列中不含“篮球”这个关键字行&#xff0c;可以使用这些办法。 二、删除数据 方法1.自动筛选&#xff0c; 1.1 选中数据后&#xff0c;点击数据选项卡&#…

微信人脉扩张!多号批量自动加好友,你get到了吗?

微信是我们在拓展社交圈和寻找商业机会时&#xff0c;与更多的人建立联系的重要渠道。但是&#xff0c;手动一个个添加好友显然费时费力&#xff0c;这时候&#xff0c;微信管理系统的批量自动加好友功能就成为了微信人脉扩张的神器。 通过微信管理系统&#xff0c;我们可以轻…

IO流-打印流

简介 为打印而生的IO流 打印流的继承体系 优点 高效方便打印的是啥就是啥&#xff0c;不会瞎转&#xff08;不会把97转成a&#xff09; PrintStream try(PrintStream ps new PrintStream("test7.txt", "UTF-8"); ){ps.println(97); // 打印流的优点就是原…

三个晚上!给干废了!MINI2440 挂载 NFS

虚拟机执行&#xff1a;sudo ifconfig tap0 10.10.10.1 up qemu 开发板&#xff1a; set bootargs noinitrd root/dev/nfs rw nfsroot10.10.10.1:/nfsroot ip10.10.10.10:10.10.10.1 ::255.255.255.0 consolettySAC0,115200 Hit any key to stop autoboot: 0 MINI2440 # set…

前后端分离vue.js+nodejs新闻文章发布论坛网站系统44x94

Vue&#xff1a; Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以及…

​代码混淆的原理是什么?常见代码混淆方法介绍

本文主要想你介绍代码混淆的原理&#xff0c;常见代码混淆方法&#xff0c;欢迎查阅~ 移动应用代码安全非常重要&#xff0c;代码逆向会导致代码逻辑被获取&#xff0c;进一步导致控制流被hook&#xff0c;安全防线被破&#xff0c;给APP安全带来巨大风险&#xff0c;因此开发者…

跟着Datawhale重学数据结构与算法

数据结构和算法之前学过&#xff0c;现在跟着Datawhale重学一下&#xff0c;就当是监督自己学习&#xff0c;重新拾起来养成一个好的习惯&#xff0c;以后可以一直坚持下去。 开源链接&#xff1a;【 教程地址 】【电子网站】 首先&#xff1a; #mermaid-svg-Cdr3rn9fGCVAiKS…

Redis消息队列-基于Stream的消息队列-消费者组

7.5 Redis消息队列-基于Stream的消息队列-消费者组 消费者组&#xff08;Consumer Group&#xff09;&#xff1a;将多个消费者划分到一个组中&#xff0c;监听同一个队列。具备下列特点&#xff1a; 创建消费者组&#xff1a; key&#xff1a;队列名称 groupName&#xff1a…

安装SSMS出现错误和SSMS连接数据库失败

1.点击图片下安装的时候&#xff0c;出现0x80070643错误 解决办法&#xff1a; 1,如果是是第一次安装的话&#xff0c;重新启动电脑&#xff0c;把原来下载的SSMS删除掉&#xff0c;在重新下载安装 2.如果是原来就下载过&#xff0c;先…

OpenBayes 在线教程|张国荣、鲁迅等老照片秒变高清!即刻上手的超火 SUPIR-AI 图像修复教程

小伙伴们&#xff0c;大家在生活中是不是也会遇到这样的烦恼&#xff1a;心心念念想要打印一张充满回忆的老照片或酷炫动漫壁纸&#xff0c;却发现图像糊得像打了马赛克&#xff1f; 市面上的图像修复工具五花八门&#xff0c;选择困难症人群找得快要崩溃&#xff1f; 终于找…

3.1 iHRM人力资源 - 组织架构、树形结构、添加子部门

iHRM人力资源 - 组织架构 文章目录 iHRM人力资源 - 组织架构一、展示数据-树形组件1.1 组件说明1.2 树组件自定义结构获取作用域数据1.2.1 说明1.2.2 页面代码1.2.3 获取组织架构数据-api 1.3 效果图1.4 修改树形结构bug 二、添加子部门2.1 表单弹层2.1.1 下拉菜单点击事件2.1.…

使用DGL实现一个异构图的例子

使用DGL实现一个异构图的例子 异构图 截图的地址&#xff1a; dgl 异构图 相比同构图&#xff0c;异构图里可以有不同类型的节点和边。这些不同类型的节点和边具有独立的ID空间和特征。 例如在下图中&#xff0c;”用户”和”游戏”节点的ID都是从0开始的&#xff0c;而且两种…

Appium Desktop + Appium Inspector + 模拟器连接

一、环境预备 1.你需要安装好配置好adb,确保可以在命令行直接运行adb指令 2.安装Appium Desktop、Appium Inspector 、 模拟器 二、启动appium 服务 启动后&#xff0c;画面如下&#xff1a; 三、启动模拟器 此时&#xff0c;启动模拟器&#xff0c;打开电脑cmd窗口&#x…

算法设计与分析实验报告c++实现(矩阵链相乘、投资问题、完全背包问题、数字三角形、最小生成树、背包问题)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用动态…

[RK3399 Linux] 使用busybox 1.36.1制作rootfs

一、 编译、安装、配置 busybox 1.1 下载源码 根文件系统是根据busybox来制作的。 下载地址:https://busybox.net/downloads/。 这里就以1.36.1版本为例进行编译安装介绍: 注意:编译linux内核与文件系统中的所有程序要使用相同的交叉编译器。 下载完成后解压: mkdir …

java(网络编程)

什么是网络编程? 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件、等等 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输 Java中可以使用ja…