1.21 day6 IO网络编程

news2024/11/15 8:39:26

网络聊天室

服务端

#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.coloradmin.cn/o/1403090.html

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

相关文章

【C++进阶07】哈希表and哈希桶

一、哈希概念 顺序结构以及平衡树中 元素关键码与存储位置没有对应关系 因此查找一个元素 必须经过关键码的多次比较 顺序查找时间复杂度为O(N) 平衡树中为树的高度&#xff0c;即O( l o g 2 N log_2 N log2​N) 搜索效率 搜索过程中元素的比较次数 理想的搜索方法&#xff1a…

如何一键生成原创文案?方法大揭密

在当今信息爆炸的时代&#xff0c;优秀的文案变得尤为重要。无论是网站、广告还是社交媒体&#xff0c;都需要吸引用户注意力的高质量、有吸引力的文案。不过&#xff0c;创作出这样的文案并不容易&#xff0c;需要投入大量的时间和精力。那么&#xff0c;有没有一种方法可以一…

Java 面向对象 06 对象内存图(黑马)

之前设计的如下图&#xff1a; 方法区和内存在物理上是一块的&#xff0c;但是有不好的地方&#xff0c;所以变成了这种形式&#xff1a; 一个对象的内存图&#xff1a; 在创建对象时虚拟机至少做了以下七步&#xff1a; 解释&#xff1a; 第一步&#xff1a; 第二步&#x…

视频格式转换软件,无忧转换畅享愉悦

在这个视频无处不在的时代&#xff0c;一款好的视频格式转换工具显得尤为重要。它不仅解决了你的燃眉之急&#xff0c;更让你畅享快速转换和简单操作带来的愉悦体验。现在就加入我们&#xff0c;开启全新的视频转换之旅吧&#xff01; 所需工具&#xff1a; 一个【媒体梦工厂…

【Leetcode】2788. 按分隔符拆分字符串

文章目录 题目思路代码 题目 题目链接 给你一个字符串数组 words 和一个字符 separator &#xff0c;请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组&#xff0c;不包括空字符串 。 注意 separator 用于决定拆分发生的位置&#…

一区优化直接写:KOA-CNN-BiLSTM-Attention开普勒优化卷积、长短期记忆网络融合注意力机制的多变量回归预测程序!

适用平台&#xff1a;Matlab 2023版及以上 KOA开普勒优化算法&#xff0c;于2023年5月发表在SCI、中科院1区Top顶级期刊《Knowledge-Based Systems》上。 该算法提出时间很短&#xff0c;目前还没有套用这个算法的文献。 同样的&#xff0c;我们利用该新鲜出炉的算法对我们的…

Pandas--简介(1)

Pandas 简介 Pandas 是一个开源的数据分析和数据处理库&#xff0c;它是基于 Python 编程语言的。Pandas 提供了易于使用的数据结构和数据分析工具&#xff0c;特别适用于处理结构化数据&#xff0c;如表格型数据&#xff08;类似于Excel表格&#xff09;。Pandas 是数据科学和…

Spring boot项目java bean和xml互转

Spring boot项目实现java bean和xml互转 项目场景&#xff1a;互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工&#xff01; 项目场景&#xff1a; 工作中需要给下游第三方收费系统做数据挡板&#xff0c;由于下游系统使用的是soap webservice,里面涉及各种…

UE5 C++学习笔记 常用宏的再次理解

1.随意创建一个类&#xff0c;他都有UCLASS()。GENERATED_BODY()这样的默认的宏。 UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject. &#xff08;告诉引擎我是从远古大帝UObject中&#xff0c;继承而来&#xff0c;我们是一家人&#xff0c;只是我进化了其他功能…

【C++修行之道】竞赛常用库函数(sort,min和max函数,min_element和max_element、nth_element)

目录 一、sort 1.1sort简介 语法 参数 功能 适用容器 1.2sort的用法 1.3自定义比较函数 示例 1265蓝桥题 —— 排序 二、min和max函数 三、min_element和max_element 497蓝桥题 —— 成绩分析 四、nth_element 一、sort 1.1sort简介 sort函数包含在头文件<a…

如何在WordPress中使用 AI 进行 SEO(12 个工具)

您想在 WordPress 中使用 AI 进行 SEO 吗&#xff1f; 人工智能正在对 SEO 行业产生重大影响。已经有优秀的人工智能 SEO 工具&#xff0c;您可以使用它们来提高您的 SEO 排名&#xff0c;而无需付出太多努力。 在本文中&#xff0c;我们将向您展示如何通过我们精心挑选的工具…

Qt 开发环境配置 vs和Qt creator

Qt 开发环境配置 vs和Qt creator 1、安装的软件 1、vs_Enterprise.exe 2、Qt creator (最好是最新的版本,低版本不支持vs2019) 下载地址&#xff1a;https://gofile-3535697530.cn1.quickconnect.cn/sharing/zMCh5ENgZ 密码&#xff1a;qt_dev 2、Qt Creator配置 1、打开…

检索增强生成中的创新

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号(NLP Research),及时查看最新内容 原文标题:Innovations In Retrieval Augmented Generation 原文地址:https://medium.com/emalpha/innov…

springsecurity集成kaptcha功能

前端代码 本次采用简单的html静态页面作为演示&#xff0c;也可结合vue前后端分离开发&#xff0c;复制就可运行测试 项目目录 登录界面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</…

x-cmd pkg | speedtest-cli - 网络速度测试工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 speedtest-cli 是一个网络速度测试工具&#xff0c;用于测试计算机或服务器与速度测试服务器之间的网络连接速度。 它使用 speedtest.net 测试互联网带宽&#xff0c;可以帮助用户获取网络的上传和下载速度、延迟等参…

Java项目:ssm框架基于spring+springmvc+mybatis框架的民宿预订管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm827基于SSM框架的民宿预订管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调…

stm32内存分配博客笔记

原文&#xff1a; stm32内存分配 笔记&#xff1a; 1、向量表与代码段&#xff1b;根据Cortex-M3权威指南描述&#xff0c;系统复位后&#xff0c;在向量表异常0处保存的是堆栈起始地址&#xff0c;而后紧跟中断向量表 2、可以从链接脚本.ld文件中看到终端向量表第一个被链接…

品牌百度百科词条怎么写?

在互联网时代&#xff0c;品牌的影响力愈发重要&#xff0c;而百度百科作为我国最大的百科全书&#xff0c;更是塑造品牌形象、传播品牌价值的重要平台。如何撰写一篇高质量的百度百科品牌词条&#xff0c;成为了众多企业和品牌关注的焦点。品牌百度百科词条怎么写&#xff1f;…

QGraphicsView前有QWidget遮罩,导致QGraphicsItem鼠标事件不响应

场景&#xff1a;在一个QWidget上放置了一个QGraphicsView用于显示图像&#xff0c;QGraphicsView设置了场景&#xff0c;并添加了一个自定义QGraphicsItem。由于需求原因&#xff0c;又绘制了一个标尺QWidget放在QGraphicsView前部。 结果导致标尺QWidget显示时&#xff0c;重…

系统IO

OS&#xff1a;操作系统 管理和分配硬件资源的系统软件&#xff0c;现代操作系统必须提供并发功能 介于应用与硬件之间的 在linux下做应用开发&#xff0c;其实就是调用操作系统提供的API函数的接口操作硬件 一、文件IO是什么&#xff1f; 文件IO分为系统IO和标…