2024.1.15 网络编程 作业

news2024/11/14 21:43:38

思维导图

练习题

1.实现TCP服务器和客户端之间的通信

server.c

#include <myhead.h>

int main(int argc, char const *argv[])
{
    //创建套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    //端口复用,作用:关闭服务器后再启动不会等待
    int reuse = 1;
    setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
    //填充IP和端口
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(1234);
    sin.sin_addr.s_addr = inet_addr("192.168.124.51");
    //服务器绑定套接字
    bind(sfd, (struct sockaddr *)&sin, sizeof(sin));
    //监听客户端是否发送请求
    listen(sfd, 128);
    //创建用来传递消息的套接字
    socklen_t socklen = sizeof(sin);
    int newfd = accept(sfd, (struct sockaddr *)&sin, &socklen);
    printf("[%s:%d]发来连接请求\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
    //消息的发送与接收
    char buf[128] = "";
    while (1)
    {
        memset(buf, 0, sizeof(buf));
        //接收消息
        int res=recv(newfd, buf, sizeof(buf), 0);
        if (res == 0)
        {
            printf("客户端下线\n");
            break;
        }
        printf("[%s:%d] %s\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), buf);
        //发送消息
        send(newfd, buf, sizeof(buf), 0);
    }
    //关闭服务器
    close(newfd);
    close(sfd);
    return 0;
}

client.c

#include <myhead.h>

int main(int argc, char const *argv[])
{
    //创建套接字
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    //填充客户端IP和端口
    struct sockaddr_in cin;
    cin.sin_family = AF_INET;
    cin.sin_port = htons(4321);
    cin.sin_addr.s_addr = inet_addr("192.168.124.51");
    //服务器绑定,也可以不绑定,不绑定客户端端口号随机
    bind(cfd, (struct sockaddr *)&cin, sizeof(cin));
    //服务器IP和端口
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(1234);
    sin.sin_addr.s_addr = inet_addr("192.168.124.51");
    //连接服务器,向服务器发送请求
    connect(cfd, (struct sockaddr *)&sin, sizeof(sin));
    //消息的发送与接收
    char buf[128] = "";
    while (1)
    {
        memset(buf, 0, sizeof(buf));
        //输入消息
        printf("[%s:%d] 请输入--->", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf) - 1] = '\0';
        //发送消息
        send(cfd, buf, sizeof(buf), 0);
        //接收消息
        recv(cfd, buf, sizeof(buf), 0);
        if (strcmp(buf, "q") == 0)
        {
            printf("下线\n");
            break;
        }
    }
    //关闭客户端    
    close(cfd);
    return 0;
}

2.服务器和客户端通信实现客户端控制服务器端机械臂摆动

#include <myhead.h>
#define SER_IP "192.168.124.19"
#define SER_PORT 8888

int main(int argc, char const *argv[])
{
    //创建套接字
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    //服务器IP和端口
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(1234);
    sin.sin_addr.s_addr = inet_addr("192.168.124.19");
    //连接服务器,向服务器发送请求
    connect(cfd, (struct sockaddr *)&sin, sizeof(sin));

    //循环操作,判断w蓝色左 a红色左 s蓝色右 d红色右
    char arr[5];
    arr[0] = 0xff;
    arr[4] = 0xff;
    arr[1] = 0x02;
    int y = 90;
    int y2 = 0;
    while (1)
    {
        memset(arr, 0, sizeof(arr));
        //获取终端输入的第一个字符
        char key;
        scanf(" %c", &key);
        switch (key)
        {
        case 'w':
            y++;
            arr[2] = 0x01;
            arr[3] = y;
            //向服务器发送消息
            send(cfd, arr, sizeof(arr), 0);
            break;
        case 's':
            y--;
            arr[2] = 0x01;
            arr[3] = y;
            //向服务器发送消息
            send(cfd, arr, sizeof(arr), 0);
            break;
        case 'a':
            y2++;
            arr[2] = 0x00;
            arr[3] = y2;
            //向服务器发送消息
            send(cfd, arr, sizeof(arr), 0);
            break;
        case 'd':
            y2--;
            arr[2] = 0x00;
            arr[3] = y2;
            //向服务器发送消息
            send(cfd, arr, sizeof(arr), 0);
            break;
        default:
            puts("error");
        }
    }
    //关闭客户端
    close(cfd);
    return 0;
}

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

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

相关文章

谷粒商城篇章8 ---- P236-P247 ---- 购物车【分布式高级篇五】

目录 1 环境搭建 1.1 新建购物车服务模块gulimall-cart 1.2 购物车服务相关配置 1.2.1 pom.xml 1.2.2 yml配置 1.2.2.1 application.yml配置 1.2.2.2 bootstrap.yml配置 1.2.3 主类 1.3 SwitchHosts增加配置 1.4 网关配置 1.5 整合SpringSession 1.5.1 session数据…

RPA与通知机器人的完美结合

写在前面 在现代快节奏的工作环境中&#xff0c;我们经常会面临多个任务同时进行的情况&#xff0c;你还在为时间不够用、忙碌而惆怅吗&#xff1f;你还在为时刻盯着电脑流程而烦恼吗&#xff1f;你还在为及时收不到自己的自动化任务进度而焦躁吗&#xff1f;别担心&#xff0…

Elasticsearch:聊天机器人教程(二)

这是继上一篇文章 “Elasticsearch&#xff1a;聊天机器人教程&#xff08;一&#xff09;”的续篇。本教程的这一部分讨论聊天机器人实现中最有趣的方面&#xff0c;以帮助你理解它并对其进行自定义。 数据摄入 在此应用程序中&#xff0c;所有示例文档的摄取都是通过 flask …

教你用五步让千年的兵马俑跳上现代的科目三?

以下是一张我上月去西安拍的兵马俑照片&#xff1a; 使用通义千问&#xff0c;5步就能它舞动起来&#xff0c;跳上现在流行的“科目三”舞蹈。 千年兵马俑跳上科目三 全民舞王 第1步 打开通义千问App&#xff0c;我使用的是华为手机&#xff0c;苹果版的没试&#xff1b; 在…

编译 FastDFS 时报错 fatal error: sf/sf_global.h: No such file or directory 解决办法

编译 FastDFS 时&#xff0c;报错如下 gcc -Wall -D_FILE_OFFSET_BITS64 -D_GNU_SOURCE -g -O1 -DDEBUG_FLAG -c -o ../common/fdfs_global.o ../common/fdfs_global.c -I../common -I/usr/local/include In file included from ../common/fdfs_global.c:21:0: ../common/fdf…

【控制篇 / 分流】(7.4) ❀ 01. 对指定IP网段访问进行分流 ❀ FortiGate 防火墙

【简介】公司有两条宽带&#xff0c;一条ADSL拨号用来上网&#xff0c;一条移动SDWAN&#xff0c;已经连通总部内网服务器&#xff0c;领导要求&#xff0c;只有访问公司服务器IP时走移动SDWAN&#xff0c;其它访问都走ADSL拨号&#xff0c;如果你是管理员&#xff0c;你知道有…

pod 控制器

pod 控制器&#xff1a; pv pvc 动态pv pod控制器&#xff1a;工作负载&#xff0c;workload&#xff0c;用于管理pod的中间层&#xff0c;确保pod资源符号预期的状态。 预期状态&#xff1a; 1&#xff0c;副本数 2&#xff0c;容器的重启策略 3&#xff0c;镜像拉取策略…

【软件测试】前端性能测试工具原理

不同于后端性能测试知识的琐碎、独立&#xff0c;这篇文章为你介绍前端性能测试工具WebPagetest&#xff0c;以一个具体网站为例&#xff0c;和你分析WebPagetest的用法&#xff0c;以及前端性能相关的主要概念与指标。 WebPagetest功能简介 WebPagetest&#xff0c;是前端性…

STM32--7针0.96寸OLED屏幕显示(4线SPI)

本文介绍基于STM32F103C8T60.96寸OLED&#xff08;7针&#xff09;的显示&#xff08;完整程序代码见文末链接&#xff09; 一、简介 OLED&#xff0c;即有机发光二极管&#xff08; Organic Light Emitting Diode&#xff09;。 OLED 由于同时具备自发光&#xff0c;不需背光…

【RL】(task1)绪论、马尔科夫过程、动态规划、DQN(更新中)

note 文章目录 note一、马尔科夫过程二、动态规划DQN算法时间安排Reference 一、马尔科夫过程 递归结构形式的贝尔曼方程计算给定状态下的预期回报&#xff0c;这样的方式使得用逐步迭代的方法就能逼近真实的状态/行动值。 有了Bellman equation就可以计算价值函数了马尔科夫过…

day2·算法-快乐数-有效三角形个数

今天又来更新啦&#xff0c;准备蓝桥杯的小伙伴可以和我一起来刷题&#xff0c;建议大家先看题&#xff0c;整理出思路&#xff0c;再看如何用简单的写法将思路构建出来&#xff0c;然后优化细节&#xff0c;找到解决某些例外出现的方法&#xff0c;从而成功解答这道题。 快乐…

ucloud轻量云(wordpress)配置ssl

ucloud 轻量云(wordpress)配置ssl 1、上传ssl证书到/usr/local/software/apache/conf&#xff0c;这里的文件名和内容与ucloud控制台下载下来的文件名和内容保持一致 2、修改httpd.conf文件 vim /usr/local/software/apache/conf/httpd.conf 找到下面两行&#xff0c;去掉注…

SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用

四、Database MetaData 与 SQL Express Language 的使用 MetaData对象用于描述表结构&#xff0c;SQL Express Language是DBAPI SQL的统一封装器。MetaData 与SQL Express 语句可以在Core层使用&#xff0c;ORM层基于MetaData, SQL Express基础上做了进一步抽象。本章将介绍在…

前端框架前置学习Node.js(2)npm使用,Node.js总结

npm - 软件包管理器 定义 npm是Node.js标准的软件包管理器 npm仓库中包含大量软件包,使其成为世界上最大的单一语言代码仓,并且可以确定几乎可用于一切的软件包 最初是为了下载和管理Node.js包依赖的方式,但其现在已成为前端JavaScript中使用的工具 使用: 1.初始化清单文…

VC++读取ini文件示例2

之前学习过ini文件读写&#xff1b;继续熟悉&#xff1b; CString str1;UINT m1 0;UINT m2 0;TCHAR p1[32];m1 GetPrivateProfileString(_T("mymoney1"), _T("moneyname1"), _T("空"), p1, sizeof(p1), _T("E:\\VCPrj\\VC2015\\cattest\…

免费的域名要不要?

前言 eu.org的免费域名相比于其他免费域名注册服务&#xff0c;eu.org的域名后缀更加独特。同时&#xff0c;eu.org的域名注册也比较简单&#xff0c;只需要填写一些基本信息&#xff0c;就可以获得自己的免费域名。 博客地址 免费的域名要不要&#xff1f;-雪饼前言 eu.org…

FPGA之LUT

由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构。LUT本质上就是一个RAM.它把数据事先写入RAM后,每当输入一个信号就…

【QML COOK】- 009-组件(Components)

组件对于QML来说就如同C的类一样。可以用同一个组件创建多个对象。 组件有两种定义方式&#xff1a; 用独立的.qml文件定义组件在.qml文件中用Component对象定义组件 1. 创建项目&#xff0c;新建文件IndependentComponent.qml import QtQuickRectangle {id : rootText {id…

2.3 数据链路层03

2.3 数据链路层03 2.3.7 以太网交换机 1、以太网交换机的基本功能 以太网交换机是基于以太网传输数据的交换机&#xff0c;以太网交换机通常都有多个接口&#xff0c;每个接口都可以直接与一台主机或另一个以太网交换机相连&#xff0c;一般都工作在全双工方式。 以太网交换…

go中如何进行单元测试案例

一. 基础介绍 1. 创建测试文件 测试文件通常与要测试的代码文件位于同一个包中。测试文件的名称应该以 _test.go 结尾。例如&#xff0c;如果你要测试的文件是 math.go&#xff0c;那么测试文件可以命名为 math_test.go。 2. 编写测试函数 测试函数必须导入 testing 包。每…