2024.8.19 学习记录 —— 作业

一、TCP机械臂测试

#include <myhead.h>#define SER_PORT 8888          // 与服务器保持一致
#define SER_IP "192.168.0.114" // 服务器ip地址int main(int argc, const char *argv[])
{// 创建文件描述符打开键盘文件int fd = open("/dev/input/event1", O_RDONLY);if (fd == -1){perror("open error");return -1;}// 定义结构体接收键盘文件的数据struct input_event ie;// 创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd); // 连接到服务器// 填充服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                // 通信域sin.sin_port = htons(SER_PORT);          // 服务器端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // 服务器ip地址// 连接服务器if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 准备数据char rbuf[5] = {0xff, 0x02, 0x00, 0x10, 0xff};unsigned char bbuf[5] = {0xff, 0x02, 0x01, 0x10, 0xff};// 发送给服务器,以初始化机械臂send(cfd, rbuf, sizeof(rbuf), 0);sleep(1);send(cfd, bbuf, sizeof(bbuf), 0);printf("%#x\n", rbuf[3]);printf("%#x\n", bbuf[3]);while (1){// 接收键盘文件数据read(fd, &ie, sizeof(ie));switch (ie.code * ie.value){case 32: // d键rbuf[3] += 1;if (rbuf[3] > 90){rbuf[3] = 90;}send(cfd, rbuf, sizeof(rbuf), 0); // 传输数据给机械臂break;case 30: // a键rbuf[3] -= 1;if (rbuf[3] < -90){rbuf[3] = -90;}send(cfd, rbuf, sizeof(rbuf), 0); // 传输数据给机械臂break;case 31: // s键bbuf[3] -= 1;if (bbuf[3] <= 0){bbuf[3] = 0;}send(cfd, bbuf, sizeof(bbuf), 0); // 传输数据给机械臂break;case 17: // w键bbuf[3] += 1;if (bbuf[3] > 180){bbuf[3] = 180;}if (bbuf[3] < 0){bbuf[3] = 0;}send(cfd, bbuf, sizeof(bbuf), 0); // 传输数据给机械臂break;default:break;}/*if (buf == 'd') // 红机械臂右移一度{rbuf[3] = rbuf[3] + 1; // 修改角度printf("%#x\n", rbuf[3]);send(cfd, rbuf, sizeof(rbuf), 0); // 传输结果}if (buf == 'a') // 红机械臂左移一度{rbuf[3] = rbuf[3] - 1;printf("%#x\n", rbuf[3]);send(cfd, rbuf, sizeof(rbuf), 0);}if (buf == 's') // 蓝机械臂上移一度{bbuf[3] = bbuf[3] + 1;printf("%#x\n", bbuf[3]);send(cfd, bbuf, sizeof(bbuf), 0);}if (buf == 'w') // 蓝机械臂下移一度{bbuf[3] = bbuf[3] - 1;printf("%#x\n", bbuf[3]);send(cfd, bbuf, sizeof(bbuf), 0);}if (buf == 'q') // 直接设置{int val = 0;printf("红机械臂增减角度:");scanf("%d", &val);        // 获取增减角度rbuf[3] = rbuf[3] + val;  // 修改角度printf("%#x\n", rbuf[3]); // 传输结果getchar();printf("蓝机械臂增减角度:");scanf("%d", &val);bbuf[3] = bbuf[3] + val;printf("%#x\n", bbuf[3]);getchar();send(cfd, rbuf, sizeof(rbuf), 0);usleep(100);send(cfd, bbuf, sizeof(bbuf), 0);}buf = 0;*/}// 5、关闭套接字close(cfd);return 0;
}

二、基于UDP的TFTP文件传输

#include <myhead.h>
int main(int argc, char const *argv[])
{int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1){perror("socket error");return -1;}// 下载请求包char buf[516] = "";short *p1 = (short *)buf; // 操作码*p1 = htons(1);char *p2 = buf + 2; // 文件名strcpy(p2, "5.png");char *p4 = p2 + strlen(p2) + 1; // 模式位strcpy(p4, "octet");int size = 2 + strlen(p2) + strlen(p4) + 2; // 请求包总长// 服务器地址信息struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(69);sin.sin_addr.s_addr = inet_addr("192.168.0.114");// 向服务器发送a下载请求sendto(sfd, buf, size, 0, (struct sockaddr *)&sin, sizeof(sin));int newfd = 0;if ((newfd = open("./5.png", O_WRONLY | O_CREAT | O_APPEND | O_TRUNC, 0664)) == -1){perror("open error");return -1;}while (1){socklen_t size_sin = sizeof(sin);bzero(buf, sizeof(buf)); // 清空bufint res = 0; // 接收服务器发送的数据if ((res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr *)&sin, &size_sin)) == -1){perror("recvform error");return -1;}if (res <516){write(newfd, buf + 4, res - 4);*p1 = htons(4);sendto(sfd, buf, 4, 0, (struct sockaddr *)&sin, sizeof(sin));printf("下载结束\n");break;}write(newfd, buf + 4, res - 4);                               // 写入数据*p1 = htons(4);                                               // 操作码置位 4sendto(sfd, buf, 4, 0, (struct sockaddr *)&sin, sizeof(sin)); // 发送ACK}close(sfd);close(newfd);return 0;
}

 三、基于UDP的聊天室

1、服务器端

#include <myhead.h>
#define SER_PORT 6666            // 服务器端口号
#define SER_IP "192.168.179.128" // 服务器ip地址
// 定义结构体用于存储客服端的信息
struct MSG
{char type; // 信息类型 'L'表示登录 'T'表示群聊 'Q'表示退出 'S'表示系统消息char name[20];char msg[256];
};// 定义链表用于存储不同的客服端信息
struct ADDR
{struct sockaddr_in cin;struct ADDR *next;
};// 登录操作的函数
void do_login(int sfd, struct MSG buf, struct ADDR *addr, struct sockaddr_in cin)
{// 先遍历链表 将新用户加入群聊的消息发给所有人struct ADDR *tmp = addr; // 记录链表头节点while (tmp->next != NULL){tmp = tmp->next;if (-1 == sendto(sfd, &buf, sizeof(buf), 0, (struct sockaddr *)&(tmp->cin), sizeof(tmp->cin))){perror("sendto error");}}// 将新用户的网络信息结构体 头插入链表struct ADDR *pnew = NULL;if (NULL == (pnew = (struct ADDR *)malloc(sizeof(struct ADDR)))){printf("malloc error\n");return;}pnew->cin = cin;pnew->next = addr->next;addr->next = pnew;return;
}// 群聊操作的函数
void do_chat(int sfd, struct MSG buf, struct ADDR *addr, struct sockaddr_in cin)
{// 遍历链表,将群聊消息发给除了自己之外的所有人struct ADDR *ptmp = addr;while (ptmp->next != NULL){ptmp = ptmp->next;if (memcmp(&cin, &(ptmp->cin), sizeof(cin))){// 不是自己 就发送数据sendto(sfd, &buf, sizeof(buf), 0, (struct sockaddr *)&(ptmp->cin), sizeof(ptmp->cin));}}return;
}// 退出操作的函数
void do_quit(int sfd, struct MSG buf, struct ADDR *addr, struct sockaddr_in cin)
{// 遍历链表 是自己就将自己在链表中删除// 不是自己 就发送 退出群聊的数据struct ADDR *ptmp = addr;struct ADDR *del = NULL;while (ptmp->next != NULL){if (memcmp(&(ptmp->next->cin), &cin, sizeof(cin))){// 不是自己ptmp = ptmp->next;strcat(buf.name,"-系统接管");sendto(sfd, &buf, sizeof(buf), 0, (struct sockaddr *)&(ptmp->cin), sizeof(ptmp->cin));}else{// 是自己del = ptmp->next;ptmp->next = del->next;free(del);del = NULL;}}return;
}int main(int argc, char const *argv[])
{// 1、创建用于通信的套接字文件描述符int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd == -1){perror("scoket error");return -1;}printf("sfd = %d\n", sfd); // 3// 2、绑定ip地址和端口号//  2.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); // ip地址// 2.2、 绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");// 3、数据接收struct MSG buf; // 定义用于信息接收的变量// 定义用于接收客服端网络信息的变量struct sockaddr_in cin;          // 接收对端地址信息socklen_t addrlen = sizeof(cin); // 接收地址长度// 4、创建父子进程用于不同功能pid_t pid = 0;if (-1 == (pid = fork())){perror("fork error");return -1;}if (0 == pid) // 子进程,用于信息的处理{// 创建保存客户端信息的链表头节点struct ADDR *addr;if (NULL == (addr = (struct ADDR *)malloc(sizeof(struct ADDR)))){printf("malloc error\n");return -1;}memset(addr, 0, sizeof(addr));addr->next = NULL;while (1){ // 循环收发数据// 清空容器,确保信息准确memset(&buf, 0, sizeof(buf));memset(&cin, 0, sizeof(cin));// 接收客户端发送的消息,存放在msg中if (-1 == recvfrom(sfd, &buf, sizeof(buf), 0, (struct sockaddr *)&cin, &addrlen)){perror("recvfrom error");return -1;}switch (buf.type){         // 判断消息中的操作码,根据操作码执行对应操作case 'L': // 登录操作do_login(sfd, buf, addr, cin);break;case 'T': // 群聊操作do_chat(sfd, buf, addr, cin);break;case 'Q': // 退出操作do_quit(sfd, buf, addr, cin);break;}}}else // 父进程,用于发送系统信息{strcpy(buf.name, "系统消息");buf.type = 'T';while (1) // 循环在终端接收消息{memset(buf.msg, 0, sizeof(buf.msg));printf("输入信息:");fgets(buf.msg, 256, stdin);buf.msg[strlen(buf.msg) - 1] = 0;sendto(sfd, &buf, sizeof(buf), 0, (struct sockaddr *)&sin, addrlen);// 向子进程发送信息}}// 4、关闭文件描述符close(sfd);return 0;
}

2、客服端

#include <myhead.h>
#define SER_PORT 6666            // 与服务器保持一致
#define SER_IP "192.168.179.128" // 服务器ip地址// 用于信息发送的结构体
struct msgTyp
{char type;     // 信息类型 L-》注册名 T-》聊天信息 Q-》退出char name[20]; // 注册名char msg[256]; // 聊天信息
};int main(int argc, char const *argv[])
{// 1、 创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_DGRAM, 0);if (cfd == -1){perror("socket error");return -1;}printf("cfd = %d\n", cfd);// 2、信息发送// 2.1数据结构体定义struct msgTyp buf;bzero(&buf, 0);// 2.2 填充服务器地址信息结构体struct sockaddr_in sin;                  // 接收对端地址信息sin.sin_family = AF_INET;                // 服务器的通信域sin.sin_port = htons(SER_PORT);          // 服务器的端口号sin.sin_addr.s_addr = inet_addr(SER_IP); // 服务器的ip地址socklen_t seraddr_len = sizeof(sin);     // 服务器信息结构体大小// 2.3 注册buf.type = 'L'; // 指定消息类型printf("注册用户名:");fgets(buf.name, sizeof(buf.name), stdin);buf.name[strlen(buf.name) - 1] = 0;strcpy(buf.msg, "登录");// 向服务器发送登录信息sendto(cfd, &buf, sizeof(buf), 0, (struct sockaddr *)&sin, seraddr_len);// 3 创建父子进程用于处理不同工作pid_t pid = 0;if (-1 == (pid = fork())){perror("fork error");return -1;}// 子进程,用于接收信息if (0 == pid){while (1){if (-1 == recvfrom(cfd, &buf, sizeof(buf), 0, NULL, NULL)){perror("recvfrom error");return -1;}// 打印接收到的信息printf("[%s]:%s\n", buf.name, buf.msg);}}else if (0 < pid) // 父进程,用于向其他客服端发送信息{while (1){bzero(&buf, 0); // 清空容器,以保证信息的准确性printf("输入信息:");fgets(buf.msg, 256, stdin);buf.msg[strlen(buf.msg) - 1] = 0;if (!strcmp(buf.msg, "quit")){buf.type = 'Q';strcpy(buf.msg, "退出群聊");sendto(cfd, &buf, sizeof(buf), 0, (struct sockaddr *)&sin, seraddr_len);break;}else{buf.type = 'T';// 发送信息sendto(cfd, &buf, sizeof(buf), 0, (struct sockaddr *)&sin, seraddr_len);}}// 退出子进程kill(pid, SIGKILL);wait(NULL); // 阻塞回收子进程资源}// 3、关闭套接字close(cfd);return 0;
}

 

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

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

相关文章

【数学建模】趣味数模问题——舰艇追击问题

问题描述 某缉私舰位于走私船以东 d 10 km&#xff0c;走私船以匀速 u 8 km/h 向北沿直线行驶。缉私舰立即以速度 v 12 km/h 追赶。缉私舰使用雷达进行跟踪&#xff0c;保持瞬时速度方向始终指向走私船。求解缉私舰的追逐路线和追上走私船所需的时间。 方法 理论求解&…

NIO中的异步—ChannelFuture、CloseFuture以及异步提升在NIO中的应用

ChannelFuture 客户端调用connect后返回值为ChannelFuture对象&#xff0c;我们可以利用ChannelFuture中的channel()方法获取到Channel对象。 由于上述代为为客户端实现&#xff0c;若想启动客户端实现连接操作&#xff0c;必须编写服务端代码&#xff0c;实现如下&#xff1a;…

python中的randint如何使用

python中的randint用来生成随机数&#xff0c;在使用randint之前&#xff0c;需要调用random库。random.randint()是随机生成指定范围内的整数&#xff0c;其有两个参数&#xff0c;一个是范围上限&#xff0c;一个是范围下限。 具体用法如下&#xff1a; import random print…

USB3.2 摘录(四)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; 文章目录 系列文章目录8 协议层&#xff08;Protocol Layer&#xff09;8.8 三个参数地址信息&…

苍穹外卖项目DAY07

苍穹外卖项目Day07 1、缓存菜品 1.1、问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 1.2、实现思路 通过Redis来缓存菜品的数据&#xff0c;减少数据库查询操作 缓存逻辑分析&#xff…

未来视界,触手可及:揭秘数字透明屏的奇幻之旅

在这个日新月异的科技时代&#xff0c;每一项创新都如同星辰般璀璨&#xff0c;引领着我们向更加智能、更加梦幻的未来迈进。今天&#xff0c;就让我们一起揭开一项颠覆传统视觉体验的前沿科技——数字透明屏的神秘面纱&#xff0c;探索它如何将未来视界&#xff0c;化为触手可…

IDEA:如何在idea中设置自动导包

这里使用的是idea2020版本,但是不同版本操作不会有较大的差别. 在Editer中展开General之后,选中Auto Import,最后勾选中Add unambiguous imports on the fly.

微信视频号评论如何快速采集?三种高效实用的方法

本文将深入探讨如何高效地采集微信视频号评论&#xff0c;通过揭秘三种实用方法&#xff0c;助您迅速掌握这一营销利器。从自动化工具到智能策略&#xff0c;每一步都旨在提升您的市场分析效率&#xff0c;让您在竞争激烈的社交媒体领域中脱颖而出。 一、引言&#xff1a;为何…

探索顶级PDF水印API:PDFBlocks(2024年更新)

引言 在一个敏感信息常常面临风险的时代&#xff0c;能够轻松高效地保护文档的能力至关重要。PDF水印已成为企业和个人寻求保护其知识产权、确保文件保密性的基本工具。 PDFBlocks 文字水印 API是什么&#xff1f; PDFBlocks API 提供了一个强大的解决方案&#xff0c;用于在…

day06——前后端交互

一、计算属性 计算属性就是基于现有的数据推算出来的新属性&#xff0c;只要依赖的数据变化&#xff0c;新属性就会自动更新&#xff0c;而且计算属性多次调用的情况下只会计算一次&#xff0c;效率非常高 简化写法 const app new Vue({ el: #app, data: {}, methods: {//跟da…

记录一次生产jvm问题的排查

记录一次生产问题的排查 第一天晚上 现象 1、前援反馈页面有接口陆续出现请求超时 2、登录后台服务器top命令查看发现java进程发生高cpu占用情况 3、查看对应业务日志&#xff0c;报数据库连接等待超时-数据库连接池连接无空闲 对应处理 1、临时调大数据库连接池最大连接数限…

Chat App 项目之解析(三)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

【三维重建汇总】NeRF和GS重建中,如何排除干扰物?(提升质量)

汇总最近NeRF与GS提升质量的论文 文章目录 前言一、NeRF On-the-go&#xff1a;利用不确定性落地真实世界&#xff08;CVPR24&#xff09;摘要1.DINOv2特征的不确定性预测2.NeRF中干扰物去除的不确定性3.优化4. Dilated Patch 扩大采样5.实验结果 二、Pixel-GS:像素感知的梯度密…

unity程序简易框架

1. 框架基本结构 2. 单例模式基类模块 2.1 BaseManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager<T> where T:new() {private static T instance;public static T GetInstance(){if (instance == …

高防服务器配置要素

高防服务器配置通常包括硬件资源、网络资源、防护能力、弹性防护、清洗能力和业务支持等方面。下面将详细介绍高防服务器的配置要素&#xff0c;rak部落小编为您整理发布。 高防服务器是设计用来抵御各种网络攻击&#xff0c;特别是分布式拒绝服务(DDoS)攻击的服务器配置。这些…

伊朗通过 ChatGPT 试图影响美国大选, OpenAI 封禁多个账户|TodayAI

OpenAI 近日宣布&#xff0c;他们已经封禁了一系列与伊朗影响行动有关的 ChatGPT 账户&#xff0c;这些账户涉嫌利用该 AI 工具生成并传播与美国总统选举、以色列 – 哈马斯战争以及奥运会等相关的内容。 OpenAI 表示&#xff0c;这些账户与一个名为 “Storm-2035” 的秘密伊朗…

技术速递|Python in Visual Studio Code 2024年8月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2024 年 8 月发布&#xff01; 此版本包括以下公告&#xff1a; 使用 python-environment-tools 改进了 Python 发现源代码中显示的内联变量值对 Python 的 VS Code Native RE…

CentOS7下制作openssl1.1.1i RPM包并升级

OpenSSL最新漏洞 OpenSSL官方发布了拒绝服务漏洞风险通告&#xff0c;漏洞编号为CVE-2020-1971 漏洞详情 OpenSSL是一个开放源代码的软件库包&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&#xff0c;同时确认另一端连接者的身份。这个包广泛被应…

LangChain深度解析:模型调用的艺术与实践

Model I/O 概述 LangChain的模型是框架中的核心&#xff0c;基于语言模型构建&#xff0c;用于开发LangChain应用。通过API调用大模型来解决问题是LangChain应用开发的关键过程。 可以把对模型的使用过程拆解成三块: 输入提示(Format)、调用模型(Predict)、输出解析(Parse) 1.…

【Kubernetes中如何对etcd进行备份和还原】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…