2024.1.19 网络编程 作业

思维导图

练习题

1> UDP传输实现聊天室

服务器端

#include <myhead.h>
#define SER_IP "192.168.125.151"
#define SER_PORT 9999
typedef struct Msg
{char user[32];   //用户名int type;        //执行操作1.登录、2.发消息、0.退出char text[1024]; //消息内容
} msg_t;
typedef struct List
{struct sockaddr_in cin; //客户端的网络信息结构体struct List *next;      //链表指针,指向下一个
} * list;struct sockaddr_in cin;
//创建头节点
list list_create()
{list p = (list)malloc(sizeof(struct List));if (p == NULL){perror("create list error");}p->next = NULL;p = NULL;
}
//线程函数事件 向所有客户端发送消息
void *task(void *arg)
{int *sockfd = (int *)arg;msg_t msg;strcpy(msg.user, "*system*");while (1){scanf("%s", msg.text);getchar();if (strncmp(msg.text, "quit", 4) == 0){exit(0);}sendto(*sockfd, msg.text, sizeof(msg), 0, (struct sockaddr *)&cin, sizeof(cin));}
}
//登录事件处理
void login(int sockfd, msg_t msg, list p, struct sockaddr_in cin)
{//新客户端插入链表list new = NULL;new = (list)malloc(sizeof(struct List));sprintf(msg.text, "login");while (p->next != NULL){//发送给的其他客户端登录消息p = p->next;sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));printf("[%s:%d]:%s login\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), msg.user);}//新节点的数据域填充新客户端地址结构体,尾插new->cin = cin;p->next = new;new->next = NULL;
}
//接收客户端消息事件处理
void chatmsg(int sockfd, msg_t msg, list p, struct sockaddr_in cin)
{//将客户端发来的消息发送给其他客户端while (p->next != NULL){p = p->next;sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));}
}
//客户端退出消息事件处理
void quit(int sockfd, msg_t msg, list p, struct sockaddr_in cin)
{list del = NULL;sprintf(msg.text, "%s out", msg.user);while (p->next != NULL){//遍历链表找到要退出的客户端地址结构体的前一个if (memcmp(&(p->next->cin), &cin, sizeof(cin)) == 0){del = p->next;p->next = del->next;free(del);del = NULL;}else{p = p->next;sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));}}
}
int main(int argc, char const *argv[])
{msg_t msg;//创建套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1){perror("socket error");return -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);//绑定服务器if (bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}//创建客户端地址结构体struct sockaddr_in cin;//获取客户端地址结构体大小socklen_t socklen = sizeof(cin);//创建链表节点list p = list_create();//创建线程pthread_t tid;if (pthread_create(&tid, NULL, task, &sockfd) == -1){printf("pthread_create error\n");return -1;}//分离线程pthread_detach(tid);//接收客户端消息while (1){//接收客户端发来的消息,返回消息字符个数int res = recvfrom(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&cin, &socklen);if (res < 0){perror("recvfrom error");return -1;}//判断三种客户端状态 1登录 2消息 0退出if (msg.type == 1){login(sockfd, msg, p, cin);}else if (msg.type == 2){chatmsg(sockfd, msg, p, cin);}else if (msg.type == 0){printf("[%s:%d] %s out\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), msg.user);quit(sockfd, msg, p, cin);}}//关闭套接字close(sockfd);return 0;
}

客户端

#include <myhead.h>
#define SER_IP "192.168.125.151"
#define SER_PORT 9999
typedef struct Msg
{char user[32];   //用户名int type;        //执行操作1.登录、2.发消息、0.退出char text[1024]; //消息内容
} msg_t;
int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1){perror("sock error");return -1;}msg_t msg;struct sockaddr_in cin;cin.sin_family = AF_INET;cin.sin_addr.s_addr = inet_addr(SER_IP);cin.sin_port = htons(SER_PORT);socklen_t socklen = sizeof(cin);char buf[128] = "";msg.type = 1;printf("please imput your name:");scanf("%s", msg.user);getchar();sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&cin, socklen);pid_t pid = fork();if (pid < 0){perror("fork error");return -1;}else if (pid == 0) //子进程循环发送消息{while (1){printf("---------------------\n");scanf("%s", msg.text);getchar();if (strncmp(msg.text, "quit", 4) == 0){msg.type = 0;sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&cin, socklen);kill(pid, SIGINT);exit(0);wait(NULL);}else{msg.type = 2;}sendto(sockfd, &msg, sizeof(msg), 0, (struct sockaddr *)&cin, socklen);}}else //父进程循环接受消息{int res;while (1){res = recv(sockfd, &msg, sizeof(msg), 0);if (res == -1){perror("recv error");return -1;}printf("[%s]:%s\n", msg.user, msg.text);}wait(NULL);}close(sockfd);return 0;
}

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

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

相关文章

【Flink-CDC】Flink CDC 介绍和原理概述

【Flink-CDC】Flink CDC 介绍和原理概述 1&#xff09;基于查询的 CDC 和基于日志的 CDC2&#xff09;Flink CDC3&#xff09;Flink CDC原理简述4&#xff09;基于 Flink SQL CDC 的数据同步方案实践4.1.案例 1 : Flink SQL CDC JDBC Connector4.2.案例 2 : CDC Streaming ETL…

在 Python 中检查一个数字是否是同构数

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 同构数&#xff0c;又称为自守数或自同构数&#xff0c;是一类特殊的数字&#xff0c;它们具有一种有趣的性质&#xff1a;将其平方后的数字&#xff0c;可以通过某种方式重新排列得到原来的数字。本文将详细介绍…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

Dockerfile镜像构建

Dockerfile镜像构建 1、部署harbor仓库 #部署docker #解压harbor安装包 rootharbor:~# cd /app/harbor/ rootharbor:/app/harbor# ll total 597560 drwxr-xr-x 3 root root 180 Jan 13 13:17 ./ drwxr-xr-x 4 root root 77 Jan 13 13:14 ../ drwxr-xr-x 3 root …

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉导航

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 VX关注&#xff0c;并留下邮箱可获得每日定时推送 分类: 大语言模型LLM视觉模型VLM扩散模型视觉导航具身智能&#xff0c;机器人强化…

深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

Framework层之输入系统 第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 文章目录 Framework层之输入系统前言一、基础知识1、输入子系统2、INotify 与 Epoll2.1、INotify 机制…

SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换

场景 SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源&#xff1a; SpringBootMybatisPlusdynamic-datasources实现连接Postgresql和mysql多数据源-CSDN博客 上面实现通过注解和配置文件的方式去进行多数据源操作。 如果业务需求&#xff0c;比…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

大模型日报-20240120

这里写目录标题 视觉Mamba来了&#xff1a;速度提升2.8倍&#xff0c;内存能省87%一键实景转动画&#xff0c;清华系初创公司全球首发4D骨骼动画框架&#xff0c;还能生成个性化角色如何利用革命性的蛋白质结构工具来发现药物&#xff1f;AlphaFold 发现了数千种可能的致幻剂扎…

Unity关于纹理图片格式带来的内存问题和对预制体批量格式和大小减半处理

我们经常会遇到内存问题&#xff0c;这次就是遇到很多图片的默认格式被改成了RGB32&#xff0c;导致Android打包后运行内存明显增加。 发生了什么 打包Android后&#xff0c;发现经常崩溃&#xff0c;明显内存可能除了问题&#xff0c;看了内存后发现了问题。 见下图&#xf…

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

【Qt5】QString的成员函数chop

2024年1月19日&#xff0c;周五下午 QString 的 chop 方法用于从字符串的末尾移除指定数量的字符。这个方法会修改原始字符串&#xff0c;并返回 void。 下面是一个简单的示例&#xff1a; #include <QString> #include <QDebug>int main() {QString originalStr…

Jetson AGX Orin安装archiconda、Pytorch

想在Jetson AGX Orin创建一个虚拟环境&#xff0c;然后安装pytorch&#xff0c;过程中遇到了很多的坑&#xff0c;这篇文章主要用于记录过程~因为Orin本身是Arm架构&#xff0c;X86架构可以装Anaconda&#xff0c;对于ARM要装archiconda。 1.安装archiconda 1.1确定操作系统架…

KBP206-ASEMI小功率家用电源KBP206

编辑&#xff1a;ll KBP206-ASEMI小功率家用电源KBP206 型号&#xff1a;KBP206 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;2A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;600V 正向浪涌电流&#xff1a;60A 正向电压&#xff08;V…

BeanUtils工具类简介

BeanUtils工具类 一、简介 ​ BeanUtils 是 Apache commons组件的成员之一&#xff0c;主要用于简化JavaBean封装数据的操作。可以将一个表单提交的所有数据封装到JavaBean中。 二、pom依赖 <dependency><groupId>commons-beanutils</groupId><artifa…

容器技术1-容器与镜像简介

目录 1、容器与虚拟化 2、容器发展历程 3、镜像简介 4、镜像原理 &#xff08;1&#xff09;分层存储 &#xff08;2&#xff09;写时复制 &#xff08;3&#xff09;内容寻址 &#xff08;4&#xff09;联合挂载 1、容器与虚拟化 容器技术在操作系统层面实现了对计算机…

山西电力市场日前价格预测【2024-01-21】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-21&#xff09;山西电力市场全天平均日前电价为266.42元/MWh。其中&#xff0c;最高日前电价为359.17元/MWh&#xff0c;预计出现在08:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

76.网游逆向分析与插件开发-背包的获取-背包地址的逆向分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;75.网游逆向分析与插件开发-背包的获取-背包结构与指针的逆向分析-CSDN博客 通过上一个内容&#xff0c;知道了背包的结构&#xff0c;它是一个指针数组&#xff0c;它里面还记录的背包有多少格。 然…