1.21 day6 IO网络编程

网络聊天室

服务端

#include <myhead.h>
#define PORT 8888
#define IP "192.168.122.48"
struct MSG
{char tyep;char name[20];char buf[128];
};
typedef struct Node
{struct sockaddr_in cin;struct Node*next;
}*node;int main(int argc, const char *argv[])
{node head=NULL;int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){perror("socket error");return -1;}int reuse=setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse));if(reuse==-1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(PORT);sin.sin_addr.s_addr=inet_addr(IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}int pid=fork();if(pid>0){//父收struct sockaddr_in cin;socklen_t socklen=sizeof(cin);struct MSG mg;node p=(node)malloc(sizeof(struct Node));p->next=NULL;while(1){bzero(&mg,sizeof(mg));recvfrom(sfd,&mg,sizeof(mg),0,(struct sockaddr*)&cin,&socklen);int tyep=ntohl(mg.tyep);switch(tyep){case 'L':{printf("%s[%s:%d]登陆成功\n",mg.name,inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));sprintf(mg.buf,"----%s登陆成功----",mg.name);while(p->next!=NULL){p=p->next;sendto(sfd,&mg,sizeof(mg),0,(struct sockaddr*)&(p->cin),sizeof(p->cin));}p->cin=cin;p->next=NULL;head->next=p;}break;case 'C':{//便利链表但是要跳过当前客户端char wbuf[258]="";sprintf(wbuf,"%s:%s",mg.name,mg.buf);strcpy(mg.buf,wbuf);while(p->next!=NULL){p=p->next;if(memcmp(&cin,&p->cin,sizeof(cin))!=0){sendto(sfd,&mg,sizeof(mg),0,(struct sockaddr*)&(p->cin),sizeof(p->cin));}}}break;case 'Q':{//暗元素删除sprintf(mg.buf,"----%s已下线----",mg.name);while(p->next!=NULL){if(memcmp(&cin,&p->next->cin,sizeof(cin))==0){node q=p->next;p->next=q->next;free(q);}else{p=p->next;sendto(sfd,&mg,sizeof(mg),0,(struct sockaddr*)&p->cin,sizeof(p->cin));}}}break;}}}else if(pid==0){//子发struct MSG mg={htonl(1),"系统"};while(1){bzero(mg.buf,128);fgets(mg.buf,128,stdin);mg.buf[strlen(mg.buf)-1]=0;sendto(sfd,&mg,sizeof(mg),0,(struct sockaddr*)&sin,sizeof(sin));}}else{perror("fork error");return -1;}return 0;
}

客户端

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

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

相关文章

提升认知,推荐15个面向开发者的中文播客

前言 对于科技从业者而言&#xff0c;无论是自学成才的程序员&#xff0c;还是行业资深人士&#xff0c;终身学习是很有必要的&#xff0c;尤其是在这样一个技术快速迭代更新的时代。 作为一个摆脱了时间和空间限制的资讯分享平台&#xff0c;播客&#xff08;Podcast&#x…

检查一个Java List是否包含某个JavaBean对象的特定值,并且获取这个值

import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 创建一个新的ArrayList List<MyBean> list new ArrayList<MyBean>(); // 添加一些元素 list.add(new MyBean("apple", …

42 漏洞发现-操作系统之漏洞探针类型利用修复

目录 系统漏洞发现意义?漏洞类型危害情况?如何做好未卜先知?相关名词解释:漏洞扫描工具演示-Goby&#xff0c;Nmap&#xff0c;Nessus(操作)漏洞类型区分讲解-权限提升,远程执行等(思路)漏洞利用框架演示-Metasploit,Searchsploit等(操作)漏洞修复方案讲解说明-补丁,防护软件…

go和swoole性能比较

开发效率 Go语言是本质上是静态语言&#xff0c;开发效率稍差&#xff0c;但性能更强&#xff0c;更适合底层软件的开发 Swoole使用PHP语言&#xff0c;动态脚本语言&#xff0c;开发效率最佳&#xff0c;更适合应用软件的开发 IO模型 go语言使用单线程eventloop处理IO事件&…

GO 的那些 IDE

文章目录 支持哪些功能快捷键代码高亮代码格式化代码提示导航跳转代码调试构建编译其他功能 GO有哪些IDEGolandVS CodeVim GOSublime TextAtomLiteIDEEclipse 总结 “程序员为什么要使用 IDE”&#xff0c;在一些社区论坛&#xff0c;经常可以看到这样的提问。关于是否应该使用…

Tomcat目录和文件

打开tomcat的解压之后的目录可以看到如下的目录结构&#xff1a; Bin bin目录主要是用来存放tomcat的命令&#xff0c;主要有两大类&#xff0c;一类是以.sh结尾的&#xff08;linux命令&#xff09;&#xff0c;另一类是以.bat结尾的&#xff08;windows命令&#xff09;。 …

【Java 设计模式】行为型之策略模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互相替换。策略模式允许客户端在运行时选择算法的具体实现&#xff…

sqlmap使用教程(2)-连接目标

目录 连接目标 1.1 设置认证信息 1.2 配置代理 1.3 Tor匿名网络 1.4 检测WAF/IPS 1.5 调整连接选项 1.6 处理连接错误 连接目标 场景1&#xff1a;通过代理网络上网&#xff0c;需要进行相应配置才可以成功访问目标主机 场景2&#xff1a;目标网站需要进行身份认证后才…

【科研】陈天奇-机器学习科研的十年有感

目录 起始: 科研是什么 第零年: 可以做什么 第一年: 意外可以收获什么

C语言常见面试题:什么是宏,宏的作用是什么?

宏在计算机科学中是一种批量处理程序命令&#xff0c;它是一种抽象的规则或模式&#xff0c;用于说明某一特定输入&#xff08;通常是字符串&#xff09;如何根据预定义的规则转换成对应的输出&#xff08;通常也是字符串&#xff09;。在编译时&#xff0c;预处理器会对宏进行…

微信小程序-03

小程序官方把 API 分为了如下 3 大类&#xff1a; 事件监听 API 特点&#xff1a;以 on 开头&#xff0c;用来监听某些事件的触发 举例&#xff1a;wx.onWindowResize(function callback) 监听窗口尺寸变化的事件 同步 API 特点1&#xff1a;以 Sync 结尾的 API 都是同步 API 特…

扫地机器人(二分算法+贪心算法)

1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后&#xff0c;比现在sweep的位置&#xff08;现在已经覆盖的范围&#xff09;还要靠左&#xff0c;就是覆盖连续不起来&#xff0c;呢么这个len就是有问题的&#xff0c;退出函数&#xff0c;再…

STM32WLE5JC学习

低功耗定时器&#xff08;LPTIM1&#xff0c;LPTIM2和LPTIM3&#xff09; 这些低功耗定时器有一个独立的时钟和运行在停止模式&#xff0c;如果他们的时钟来自LSE,LSI&#xff0c;或由外部时钟。它们能够从停止模式唤醒系统。 LPTIM1可以在停止0&#xff0c;停止1和停止2模式…

黑马axios案例之地区查询

查询某个省内某个城市的所有地区 接口&#xff1a;http://hmajax.itheima.net/api/area 参数名: pname:省份名字或直辖市名字&#xff0c;比如北京、福建省、辽宁省… cname:城市名字&#xff0c;比如北京市、厦门市、大连市… <!DOCTYPE html> <html lang"en&q…

嵌入式软件工程师面试题——2025校招社招通用(计算机网络篇)(三十二)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…

IntelliJ IDEA 如何配置git?

在IntelliJ IDEA中配置Git可以让你方便地进行版本控制、代码提交和协作开发。下面是一些简单的步骤&#xff0c;帮助你配置Git&#xff1a; 1、安装Git&#xff1a; 首先&#xff0c;确保你已经在你的计算机上安装了Git。你可以从Git官方网站&#xff08;https://git-scm.com…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-4 轨迹追踪

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-4 轨迹追踪 1. 目标误差控制-误差的调节2. 稳态非零值控制3. 输入增量控制 1. 目标误差控制-误差的调节 2. 稳态非零值控制 3. 输入增量控制

使用zap接收gin框架默认的日志

gin默认的中间件 首先我们来看一个最简单的gin项目&#xff1a; func main() {r : gin.Default()r.GET("/hello", func(c *gin.Context) {c.String("hello liwenzhou.com!")})r.Run( }接下来我们看一下gin.Default()的源码&#xff1a; func Default() …

fiddler流量捕获之winconfig

windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig 按钮可以解除&#xff0c;这个与菜单栏 Tools→Win8 Loopback Exemptions 功能是相同的&#xff0c;流量捕获&#xff1a;指拦截和记录通过计算…

[Combine 开发] combineLatest、merge、zip的使用区别

combineLatest、merge 和 zip 是三个常用的操作符&#xff0c;用于组合和处理流式数据。以下是它们的区别以及在 Combine 中的使用场景 combineLatest combineLatest 操作符&#xff0c;用于将多个发布者的最新元素进行组合 当任何一个发布者发出新元素时&#xff0c;combine…