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

网站域名怎么购买奉化建设网站

网站域名怎么购买,奉化建设网站,37网游官网,宜昌市住房和城乡建设厅网站前面我们已经实现了UDP的回环客户端和回环服务器的简单应用#xff0c;接下来我们实现一个基于UDP的简单文件传输协议TFTP。 1、TFTP协议简介 TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议#xff0c;提供不复杂、开销不大的文件传输服务。端…前面我们已经实现了UDP的回环客户端和回环服务器的简单应用接下来我们实现一个基于UDP的简单文件传输协议TFTP。 1、TFTP协议简介 TFTP是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议提供不复杂、开销不大的文件传输服务。端口号为69 TFTP是一种简单的文件传输协议。目标是在UDP之上上建立一个类似于FTP的但仅支持文件上传和下载功能的传输协议所以它不包含FTP协议中的目录操作和用户权限等内容。 TFTP报文的头两个字节表示操作码共有5中操作码如下表 读请求和写请求功能码的数据报文格式是一样的所以TFTP报文又可表述为4种形式。对于读请求或者写请求文件名字段说明客户要读或写的位于服务器的上的文件并以0字节作为结束模式字段是一个ASCII码串同样以0字节结束。读请求和写请求的报文格式 其次是数据包起包括2个字节的块编号以及0-512个字节的数据信息。数据包相对比较简单其报文格式 再者为确认包。确认包也有2个字节的块编号。其数据格式 最后一种TFTP报文类型是差错报文它的操作码为5.它用于服务器不能处理读请求或者写请求的情况。在文件传输的过程中的读和写也会导致传送这种报文接着停止传输。错误包的报文格式 TFTP的工作过程很像停止等待协议发送完一个文件块后就等待对方的确认确认时应指明所确认的块号。发送完数据后在规定时间内收不到确认就要重发数据PDU发送确认PDU的一方若在规定时间内收不到下一个文件块也要重发确认PDU。这样保证文件的传送不致因某一个数据报的丢失而告失败。 2、TFTP协议栈设计 前面我们简单的介绍了TFTP协议接下来我们看看该如何实现其编程。它有5种操作码我们要做的就是实现对这5种操作码的响应。 2.1、读请求实现 所谓读请求就是客户端请求从服务器获取文件那么服务器需要做的自然是响应客户端的请求。但我们并没有文件所以不管它请求什么文件我们均给它返回内容和大小相同的测试文件。 /* TFTP读请求处理*/ int TftpReadProcess(struct udp_pcb *upcb, const ip_addr_t *to, int to_port, char* FileName) {tftp_connection_args *args NULL;/* 这个函数在回调函数中被调用因此中断被禁用因此我们可以使用常规的malloc */args mem_malloc(sizeof(tftp_connection_args));if (!args){/* 内存分配失败 */SendTftpErrorMessage(upcb, to, to_port, TFTP_ERR_NOTDEFINED);CleanTftpConnection(upcb, args);return 0;}/* i初始化连接结构体 */args-op TFTP_RRQ;args-remote_port to_port;args-block 1;/* 块号从1开始 */args-tot_bytes 10*1024*1024;/* 注册回调函数 */udp_recv(upcb, RrqReceiveCallback, args);/* 通过发送第一个块来建立连接后续块在收到ACK后发送*/SendNextBlock(upcb, args, to, to_port);return 1; } 2.2、写请求实现 写请求就是客户端希望向服务器传送文件在这里我们只是实现TFTP服务器的功能没必要将收到的文件真正保存到一个地方所以只是做接收文件的过程并不将其写到存储器简单的说就是只在内存中而不会写入Flash等。 /* TFTP写请求处理 */ int TftpWriteProcess(struct udp_pcb *upcb, const ip_addr_t *to, int to_port, char *FileName) {tftp_connection_args *args NULL;/* 这个函数在回调函数中被调用因此中断被禁用因此我们可以使用常规的malloc */args mem_malloc(sizeof(tftp_connection_args));if (!args){SendTftpErrorMessage(upcb, to, to_port, TFTP_ERR_NOTDEFINED);CleanTftpConnection(upcb, args);return 0;}args-op TFTP_WRQ;args-remote_port to_port;args-block 0; //WRQ响应的块号为0args-tot_bytes 0;/* 为控制块注册回调函数 */udp_recv(upcb, WrqReceiveCallback, args);/* 通过发送第一个ack来发起写事务 */SendTftpAckPacket(upcb, to, to_port, args-block); return 0; } 2.3、数据包操作 无论是读请求还是写请求最终的目的无非是要传送数据所以数据包自然也是我们需要构造和传送的。其对应的就是数据包操作码我们设计程序如下 /* 构造并且传送数据包 */ static int SendTftpDataPacket(struct udp_pcb *upcb, const ip_addr_t *to, int to_port, int block,char *buf, int buflen) {/* 将开始的2个字节设置为功能码 */SetTftpOpCode(buf, TFTP_DATA);/* 将后续2个字节设置为块号 */SetTftpBlockNumber(buf, block);/* 在后续设置n各字节的数据 *//* 发送数据包 */return SendTftpMessage(upcb, to, to_port, buf, buflen 4); } 2.4、确认包操作 在传送数据包后收到没收到发送方是不知道的怎么办呢这时候接受方接收到后会给出一个确认包。其对应的就是确认操作码那么我们还需实现确认包的构造和发送。 /*构造并发送确认包*/ int SendTftpAckPacket(struct udp_pcb *upcb,const ip_addr_t *to, int to_port, int block) {/* 创建一个TFTP ACK包 */char packet[TFTP_ACK_PKT_LEN];/* 将开始的2个字节设置为功能码 */SetTftpOpCode(packet, TFTP_ACK);/* 制定ACK的块号 */SetTftpBlockNumber(packet, block);return SendTftpMessage(upcb, to, to_port, packet, TFTP_ACK_PKT_LEN); } 2.5、错误包操作 在包传送的过程中有没有可能出现错误呢当然是有的这就需要所谓的错误包操作码。在服务器不能处理读请求或者写请求的情况下。在文件传输的过程中的读和写也会导致传送这种报文接着停止传输。我们也需要开发构造和传送错误包的函数。 /* 构造并向客户端发送一条错误消息 */ static int SendTftpErrorMessage(struct udp_pcb *upcb, const ip_addr_t *to, int to_port, tftp_errorcode err) {char buf[512];int error_len;error_len ConstructTftpErrorMessage(buf, err);return SendTftpMessage(upcb, to, to_port, buf, error_len); } 3、TFTP服务器实现 我们已经实现了UDP服务器而且也实现了简单的TFTP协议栈接下来的工作就是在UDP基础上实现TFTP服务器功能。前面我们已经提到过复杂的服务器应用只是回到函数的功能不一样所以开发的过程并无区别。 首先我们来实现初始化部分。创建新的UDP控制块。绑定到制定的服务器端口我们要实现TFTP服务器而TFTP协议的端口号为69所以我们将其绑定到该端口。最后注册TFTP服务器的回调函数。 /* 初始化TFTP服务器 */ void Tftp_Server_Initialization(void) {err_t err;struct udp_pcb *tftp_server_pcb NULL;/* 生成新的 UDP PCB控制块 */tftp_server_pcb udp_new();/* 判断UDP控制块是否正确生成 */if (NULL tftp_server_pcb){return;}/* 绑定PCB控制块到指定端口 */err udp_bind(tftp_server_pcb, IP_ADDR_ANY, UDP_TFTP_SERVER_PORT);if (err ! ERR_OK){udp_remove(tftp_server_pcb);return;}/* 注册TFTP服务器处理函数 */udp_recv(tftp_server_pcb, TftpServerCallback, NULL); } 在初始化中注册了回调函数所以我们还要实现TFTP服务器的回调函数。这部分出于结构清晰的考虑我们分成两个函数来写。 /* TFTP服务器回调函数 */ static void TftpServerCallback(void *arg, struct udp_pcb *upcb, struct pbuf *p,const ip_addr_t *addr, u16_t port) {/* 处理新的连接请求 */ProcessTftpRequest(p, addr, port);pbuf_free(p); } /* 从每一个来自addr:port的新请求创建一个新的端口来服务响应并启动响应过程 */ static void ProcessTftpRequest(struct pbuf *pkt_buf, const ip_addr_t *addr, u16_t port) {tftp_opcode op ExtractTftpOpcode(pkt_buf-payload);char FileName[50] {0};struct udp_pcb *upcb NULL;err_t err;/* 生成新的UDP PCB控制块 */upcb udp_new();if (!upcb){return;}/* 连接 */err udp_connect(upcb, addr, port);if (err ! ERR_OK){return;}ExtractTftpFilename(FileName, pkt_buf-payload);switch (op){case TFTP_RRQ:{TftpReadProcess(upcb, addr, port, FileName);break;}case TFTP_WRQ:{/* 启动TFTP写模式 */TftpWriteProcess(upcb, addr, port, FileName);break;}default:{/* 异常发送错误消息 */SendTftpErrorMessage(upcb, addr, port, TFTP_ERR_ACCESS_VIOLATION);udp_remove(upcb);break;}} } 在回调函数中我们实现了对TFTP读请求和写请求的响应但这足以验证我们想要实现的TFTP服务器的功能。 4、结论 本篇我们基于LwIP的UDP实现了一个简单的FTP服务器。这个FTP服务器只是实现FTP协议的功能具体的应用可根据需要添加。我们使用了TFTP客户端工具对这一服务器进行了基本测试最终结果符合我们的预期。 欢迎关注
http://www.zqtcl.cn/news/381262/

相关文章:

  • wordpress函数教程十堰seo优化哪家公司好
  • 直播app开发哪家好东莞整站优化火速公司
  • 平江高端网站建设wordpress如何添加广告
  • 网站建设得多钱搜索引擎推广网站
  • 建立网站的流程多少钱网站建设不用备案的
  • 广州城市建设档案网站扬州工程建设招标网
  • 邦策网站建设dedecms医院网站wap模板(橙色)4512345
  • 阿里云空间可以做网站吗专业的传媒行业网站开发
  • 网站制作新报价橄榄树网站建设
  • 网站建设及服务合同小程序代码教程
  • 晋城网站建设公司淘宝店铺网站建设
  • 赣州网站建设流程上海重大新闻
  • html网站架设ui设计用的软件有哪些
  • 有没有做培养基的网站58同城淄博网站建设
  • 承德做网站的公司专业平台建设网站关了吗
  • 自己做网站的成本要哪些东西wordpress resize
  • 网站建设总体流程wordpress 浮窗音乐
  • 福州网站建设公司哪个网站可以做前端项目
  • 十二冶金建设集团有限公司网站wordpress安装在哪里
  • 怎么做网站源码wordpress的rss
  • wordpress能不能做企业网站软件技术和计算机网络技术哪个好
  • 甘肃省住房和城乡建设部网站首页ip怎么做网站
  • 怎么开一家网站开发公司百度推广一年大概需要多少钱
  • 小破站下载h5企业模板网站
  • 服务器怎么设置ip做网站凌云seo博客
  • 莱芜四大金刚是谁啊镇江网站优化推广
  • 上海门户网站开发企业号码查询系统
  • 西安做网站设计的公司golang 网站开发 教程
  • 做网站哪些公司专业做app软件开发公司
  • 蒙特网站建设湖北省建设厅网站上岗证查询