当前位置: 首页 > news >正文

华清远见25072班网络编程学习day3

作业:

项目1-->机械臂:

程序源码:

#include<25072head.h>
#define SER_IP "192.168.109.15"    //服务器ip地址
#define SER_PORT 8888               //服务器端口号
#define CLI_IP "192.168.153.128"     //客户端ip地址
#define CLI_PORT 7777               //客户端端口号


int main(int argc, const char *argv[])
{
//1.创建用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_STREAM, 0);
if(cfd == -1)
{
perror("socket error");
return -1;
}

    //将套接字重新设置属性,让端口号快速重用
int reuse = 1;
if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1)
{
perror("setsockopt error");
return -1;
}
printf("端口号已经快速重用\n");
//延迟关闭从而能重新运行
struct linger reuse1 = {1,0};
if(setsockopt(cfd, SOL_SOCKET, SO_LINGER, &reuse1, sizeof(reuse1))==-1)
{
perror("setsockopt error");
return -1;
}
printf("延迟关闭已经使用\n");


//2.给客户端套接字绑定ip地址和端口号(可选)
//2.1 填充地址信息结构体
struct sockaddr_in cin;
cin.sin_family = AF_INET; 
cin.sin_addr.s_addr = inet_addr(CLI_IP);
cin.sin_port = htons(CLI_PORT);
//2.2 绑定
if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin))==-1)
{
perror("bind error");
return -1;
}
//3.连接服务器
//3.1 组装对端地址信息结构体
struct sockaddr_in sin;
sin.sin_family = AF_INET;    //通信域
sin.sin_addr.s_addr = inet_addr(SER_IP);   //要连接的服务器ip
sin.sin_port = htons(SER_PORT);     //服务器的端口号
//3.2 连接操作
if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin))==-1)
{
perror("connect error");
close(cfd);
return -1;
}

    char rbuf[5] = {0xff, 0x02, 0x00, 0x10, 0xff};             //红色臂初始角度
unsigned char bbuf[5] = {0xff, 0x02, 0x01, 0x10, 0xff};     //蓝色臂初始角度

    //将上面的数据分别发送给服务器
send(cfd, rbuf, sizeof(rbuf), 0);
send(cfd, bbuf, sizeof(bbuf), 0);

    //4.数据通信
char buf[128] = "";
while(1)
{
//从终端输入要发送的消息
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;
//判断输入内容
if(strcmp(buf,"w")==0)
{
rbuf[3]+=10;
send(cfd, rbuf, sizeof(rbuf), 0);
}
if(strcmp(buf,"s")==0)
{
rbuf[3]-=10;
send(cfd, rbuf, sizeof(rbuf), 0);
}
if(strcmp(buf,"a")==0)
{
bbuf[3]-=10;
send(cfd, bbuf, sizeof(bbuf), 0);
}
if(strcmp(buf,"d")==0)
{
bbuf[3]+=10;
send(cfd, bbuf, sizeof(bbuf), 0);
}
if(strcmp(buf,"quit")==0)
{
break;
}

    }
//5.关闭套接字
close(cfd);

return 0;
}

项目2-->基于UDP的TFTP文件传输:

程序源码:

#include<25072head.h>

#define SER_IP "192.168.109.15"    //服务器ip
#define SER_PORT 69          //服务器端口号
#define CLI_IP "192.168.153.128"     //客户端ip
#define CLI_PORT 6666 //客户端端口号


int main(int argc, const char *argv[])
{
//1、创建一个用于通信的套接字文件描述符
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if(cfd == -1)
{
perror("socket error");
return -1;
}


/*2、绑定ip和端口号(可选)
struct sockaddr_in cin;
cin.sin_family = AF_INET;
cin.sin_addr.s_addr = inet_addr(CLI_IP);
cin.sin_port = htons(CLI_PORT);
if(bind(cfd, (struct sockaddr*)&cin, sizeof(cin))==-1)
{
perror("bind error");
return -1;
}*/

    
//3、数据收发
struct sockaddr_in sin;     //目标地址
sin.sin_family = AF_INET;
sin.sin_port = htons(SER_PORT);
sin.sin_addr.s_addr = inet_addr(SER_IP);
socklen_t addrlen = sizeof(sin);


//向服务器发送一个下载请求
char msgbuf[516] = "";

    //组装协议
//1、组装操作码,下载请求的操作码为1
short *p1 = (short *)msgbuf;
*p1 = htons(1);           //网络字节序,因为是2字节无符号整数

    //2、将要下载的文件名放入
char filename[20] = "";
printf("请输入要下载的文件名:");
fgets(filename, sizeof(filename), stdin);
filename[strlen(filename)-1] = 0;

    //封装到协议中
char *p2 = msgbuf+2;         //跳过前两个字节
strcpy(p2, filename);

    //3、将传输模式放入协议中
char *p4 = p2+strlen(p2)+1;
strcpy(p4, "octet");

    int size = 2+strlen(p2)+strlen(p4)+2;

    //将请求数据包发送给服务器
sendto(cfd, msgbuf, size, 0, (struct sockaddr*)&sin, sizeof(sin));    


//以只写的形式打开一个名为filename的文件
int fd=-1;
if((fd=open(filename,O_CREAT|O_WRONLY,0664))==-1)
{
perror("open error");
return -1;
}

    while(1)
{
//通过recvfrom接受服务器传来的消息包
int len;
if((len=recvfrom(cfd,msgbuf,sizeof(msgbuf),0,(struct sockaddr*)&sin,&addrlen))==-1)
{
perror("recvfrom error");
return -1;
}
//解析传来的消息报中的前两字节
short x=ntohs(*(short*)msgbuf);
//判断如果前两字节的值为5,说明传过来的是错误消息包
if(x==5)
{
printf("[error-%d]:%s\n",ntohs(*(msgbuf+2)),msgbuf+4);
}

        //如果前两字节的值为3,则说明传来的是数据信息
else if(x==3)
{
//判断消息包的四个字节后的数据长度是否为512
//如果是将消息包的4个字节后的数据,写入到文件中
if(len==516)
{
write(fd,msgbuf+4,512);
//并回复一个:确认包

                //判断消息包的4字节后的数据长度是否为512,如果是
//将消息包的4字节后的数据,写入到文件中
//并且回复一个4字节确认包
short *p = (short *)msgbuf;
*p = htons(4);
sendto(cfd, msgbuf, 4, 0, (struct sockaddr*)&sin, sizeof(sin));    
}

            //如果消息包的4字节后的长度为小于512
if(len<516)
{
//将最后的数据写入到文件中,回复一个确认包,结束循环
write(fd,msgbuf+4,len-4);
short *p=(short *)msgbuf;
*p=htons(4);
sendto(cfd,msgbuf,4,0,(struct sockaddr*)&sin,sizeof(sin));
printf("文件下载完成\n");
break;
}
}
}
//4、关闭套接字
close(cfd);
close(fd);
return 0;
}


文章转载自:

http://pdTNAQ3p.cjqcx.cn
http://neLYzuAo.cjqcx.cn
http://ZDzmdWUh.cjqcx.cn
http://IcGzgLA5.cjqcx.cn
http://0TuDqITQ.cjqcx.cn
http://gHU2X2bN.cjqcx.cn
http://4Ew0pqIA.cjqcx.cn
http://JQNLGdv7.cjqcx.cn
http://ZkpckoF0.cjqcx.cn
http://hFpEWBFb.cjqcx.cn
http://5Edzv4ef.cjqcx.cn
http://sZO3z0OX.cjqcx.cn
http://RFlJF9zm.cjqcx.cn
http://EqaQIIyE.cjqcx.cn
http://LkeomlNt.cjqcx.cn
http://gEr8g5dJ.cjqcx.cn
http://TrxOxDcd.cjqcx.cn
http://gIAqA1rQ.cjqcx.cn
http://uaWOaUYd.cjqcx.cn
http://YrcgSK1b.cjqcx.cn
http://mawav4KM.cjqcx.cn
http://CPrluh7j.cjqcx.cn
http://DPLyL2Wd.cjqcx.cn
http://f6ZapjfF.cjqcx.cn
http://s0sGqN9J.cjqcx.cn
http://0HYRgXie.cjqcx.cn
http://S8DPX8aR.cjqcx.cn
http://tZ9i2qRV.cjqcx.cn
http://ZzLwINE2.cjqcx.cn
http://wEPlgPWl.cjqcx.cn
http://www.dtcms.com/a/377411.html

相关文章:

  • QT(3)
  • 具有区域引导参考和基础的大型语言模型,用于生成 CT 报告
  • 【QT】-怎么实现瀑布图
  • 【Leetcode hot 100】94.二叉树的中序遍历
  • 渗透测试真的能发现系统漏洞吗
  • 【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】
  • Android App瘦身方法介绍
  • MySQL修改字段类型避坑指南:如何应对数据截断与转换错误?
  • Linux权限以及常用热键集合
  • 成品油加油站综合监管迈入 “云时代”!智慧物联网涉税数据采集平台推行工作全面推进
  • c primer plus 第五章复习题和练习题
  • C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
  • Spring 统一功能处理
  • ES6基础入门教程(80问答)
  • 第3讲 机器学习入门指南
  • InnoDB 逻辑存储结构:好似 “小区管理” 得层级结构
  • copyparty 是一款使用单个 Python 文件实现的内网文件共享工具,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景
  • C# 哈希查找算法实操
  • 一个C#开发的Windows驱动程序管理工具!
  • 环境变量
  • Codeforces Round 1049 (Div. 2)
  • Eclipse下载安装图文教程(非常详细,适合新手)
  • vue2迁移到vite[保姆级教程]
  • 基于webpack的场景解决
  • Vite 中的 import.meta.env 与通用 process.env.NODE_ENV 的区别与最佳实践
  • 除了Webpack,还有哪些构建工具可以实现不同环境使用不同API地址?
  • sklearn聚类
  • I.MX6UL:汇编LED驱动实验
  • 计算机毕设 java 高校机房综合管控系统 基于 SSM+Vue 的高校机房管理平台 Java+MySQL 的设备与预约全流程系统
  • 设计模式-建造者观察者抽象工厂状态