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.hqwc.cn/news/422317.html

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

相关文章

HarmonyOS ArkUI 框架的实现原理和落地实践

HarmonyOS 操作系统特性 首先介绍一下鸿蒙操作系统&#xff0c;鸿蒙操作系统是华为设计的下一代分布式物联网操作系统&#xff0c;它首次引入了面向场景设计的分布式理念&#xff0c;同时能够实现一套操作系统通过裁减的方式适配到某种终端&#xff0c;它是华为面向万物互联理念…

预约小程序制作:最佳实践与案例分析

随着移动互联网的普及&#xff0c;预约小程序已经成为许多服务行业提升客户体验和效率的重要工具。如果你也想制作一个预约小程序&#xff0c;但是不知道如何入手&#xff0c;那么本文将为你提供一份详细的经验指南。 首先&#xff0c;你可以选择使用第三方制作平台来制作预约小…

unity项目《样板间展示》开发:火焰和UI设计

第二章&#xff1a;火焰和UI设计 前言一、火焰模型管理灶台火焰壁炉火焰 二、电视机播放三、UI设计结语 前言 这次带大家从0到1做一个unity项目&#xff1a;《样板间展示》。 顾名思义&#xff0c;项目内容是展示样板间&#xff0c;即玩家可以与房间中的物体、家具进行交互。 至…

PyQt ------ QTextEditor

PyQt ------ QTextEditor 引言正文示例1------进阶示例 引言 这里给大家介绍一下 PyQt6 中的 QTextEditor 组件用法。 正文 示例1------进阶示例 import sys from PyQt6.QtWidgets import QApplication, QWidget, QTextEdit, QVBoxLayout, QPushButtonclass TextEditorDemo…

深度学习笔试题(一)

一、单选题&#xff08;1-20题&#xff09; 1、这些图中的哪一个表示sigmoid激活函数&#xff1f;&#xff08;C&#xff09; A. B. C. D. 2、对于隐藏单元&#xff0c;tanh激活通常比sigmoid激活函数更有效&#xff0c;因为其输出的平均值接近于1&#xff0c;因此它可以更…

电脑文件msvcp140.dll重新安装的解决方法,详细解析msvcp140.dll

电脑文件msvcp140.dll找不到了&#xff0c;你遇到过这种事情么&#xff1f;其实msvcp140.dll文件找不到也是很正常的&#xff0c;毕竟dll文件的丢失时常发生&#xff0c;而msvcp140.dll只是其中一个&#xff0c;下面我们一来看看msvcp140.dll重新安装的解决方法。 一.msvcp140.…

(C++)n阶方阵求逆

文章目录 一、实验目的、内容二、实验程序设计及结构1.需求分析变量函数 2.设计结构或流程图 三、设计过程四、测试分析第一组第二组实验中出现的bug及解决方案 五、设计的特点和结果 一、实验目的、内容 输入是一个 n n n&#xff08; n < 256 n<256 n<256&#xff…

Jenkins 还可以支持钉钉消息通知?一个插件带你搞定!

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…

【C++】入门(一)

前言&#xff1a; 本篇博客将带大家认识C&#xff0c;熟悉基本语法 文章目录 认识CC的诞生与发展C 在行业中的运用 一、命名空间1.1 命名空间的定义1.2 命名空间的使用1.3 命名空间的访问 二、C输入&输出输出操作符 <<输入操作符 >>换行符和刷新输出缓冲区关键…

论文阅读:Vary论文阅读笔记

目录 引言整体结构图数据集构造Vary-tiny部分Document Data数据构造Chart Data构造Negative natural image选取 Vary-base部分 引言 论文&#xff1a;Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models Paper | Github | Demo 许久不精读论文了&#x…

如何查看Linux CPU占有率

目录 1、top 2、htop 3、vmstat 4、mpstat 5、iostat 查看嵌入式设备CPU占有率是评估系统资源使用情况的重要方式。 在Linux系统中&#xff0c;有多种方法可以查看CPU占有率&#xff0c;这里介绍几种常用的命令行工具。 1、top 这是最常用的命令之一&#xff0c;它提供了…

Unity 编辑器篇|(十三)自定义属性绘制器(PropertyDrawer ,PropertyAttribute) (全面总结 | 建议收藏)

目录 1. 前言2. PropertyDrawer2.1 参数总览2.2 两种用途2.3 注意事项2.4 代码样例 3. PropertyDrawer与PropertyAttribute结合使用 1. 前言 在Unity中&#xff0c;PropertyDrawer和PropertyAttribute是两个重要的工具&#xff0c;它们主要用于自定义属性的显示和行为。Proper…