首页 > 其他分享 >BUG: udp的"addrlen"由局部变量改为全局变量,udp的数据包就无法发送到目标地址。

BUG: udp的"addrlen"由局部变量改为全局变量,udp的数据包就无法发送到目标地址。

时间:2024-11-19 14:42:12浏览次数:1  
标签:udp addr netbuf sin addrlen DEBUG 数据包 port struct

一.BUG描述

项目上要用到LWIP的UDP协议传输数据,然后弄了一个了UDP的demo;跑通了之后就对这个demo重新封装。我把套接字长度变量(addrlen)由局部改为全局之后,服务器的UDP就只能接收,不能发送数据了。


二.BUG原因

点击查看代码
/*
*sockfd:套接字文件描述符
*buf:接收缓冲区
*len:接收数据长度
*flags:标识
*src_addr:对端套接字地址
*addrlen:对端套接字地址长度,也就是src_addr这个结构体的大小,IPV4网络为16个字节
*/
int  lwip_recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)

1.全局变量存储在BSS段,若全局变量没有初始化赋值,则默认为0值;而局部变量保存在栈种,若没有初始化赋值,则局部变量为随机值。
2.在recvfrom()函数中,若addrlen的初始化值大于对端的地址长度;则会被重置为16个字节,若小于对端的地址长度,则直接读对端的地址信息,导致对端地址信息不全,也就无法发送。代码如下:

点击查看代码
int lwip_recvfrom(int s, void *mem, size_t len, int flags,struct sockaddr *from, socklen_t *fromlen)
{
    ...
    ...
    /* Check to see from where the data was.*/
    if (done) {
      ip_addr_t fromaddr;
      if (from && fromlen) {
        struct sockaddr_in sin;

        if (netconn_type(sock->conn) == NETCONN_TCP) {
          addr = &fromaddr;
          netconn_getaddr(sock->conn, addr, &port, 0);
        } else {
          addr = netbuf_fromaddr((struct netbuf *)buf);
          port = netbuf_fromport((struct netbuf *)buf);
        }

        memset(&sin, 0, sizeof(sin));
        sin.sin_len = sizeof(sin);
        sin.sin_family = AF_INET;
        sin.sin_port = htons(port);
        inet_addr_from_ipaddr(&sin.sin_addr, addr);

        if (*fromlen > sizeof(sin)) {      //sizeof(sin)是ipv4套接字地址的长度
          *fromlen = sizeof(sin);
        }

        MEMCPY(from, &sin, *fromlen);      //拷贝对端地址到本地。

        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
        ip_addr_debug_print(SOCKETS_DEBUG, addr);
        LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, off));
      } else {
#if SOCKETS_DEBUG
        if (netconn_type(sock->conn) == NETCONN_TCP) {
          addr = &fromaddr;
          netconn_getaddr(sock->conn, addr, &port, 0);
        } else {
          addr = netbuf_fromaddr((struct netbuf *)buf);
          port = netbuf_fromport((struct netbuf *)buf);
        }

        LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
        ip_addr_debug_print(SOCKETS_DEBUG, addr);
        LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, off));
#endif /*  SOCKETS_DEBUG */
      }
    }

    
  ...
  ...


三.解决办法

因采用IPv4网络进行通信,它的套接字地址长度就是16,所以初始化的时候令addrlen = 16即可。

点击查看代码
static struct udp_net_socket udp_socket = {
    .sock = -1,
    .seraddr = 0,
    .addrlen = sizeof(struct sockaddr_in),
};

标签:udp,addr,netbuf,sin,addrlen,DEBUG,数据包,port,struct
From: https://www.cnblogs.com/Charles-Hui/p/18554827

相关文章

  • Linux 下网络套接字(Socket) 与udp和tcp 相关接口
    文章目录1.socket常见API2sockaddr结构体及其子类1.sockaddr结构体定义(基类)2.子类sockaddr_in结构体用于(IPv4)3子类sockaddr_un(Unix域套接字)4.总结画出其结构体3.实现一个简单的tcpEcho服务器和客户端(cpp)3.1客户端3.2服务器3.3测试结果1.socket常......
  • 网络编程-002-UDP通信
    1.UDP通信的简单介绍1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高1.2包大小有限制,不发大于路径MTU的数据包1.3容易丢包1.4可以实现一对多,多对多2.客户端与服务端=发送端与接收端代码框架收数据方一般都是客户端/接收端3.头文件#include<arpa/ine......
  • 基于UDP协议的千兆以太网红外视频传输模块设计与实现
    系列文章目录1.非制冷红外探测器片上非均匀校正(on-chipoffsetcalibrationOOC)技术应用分析2.非制冷红外探测器驱动模块设计与实现文章目录一、前言二、基于Zynq的总体架构设计三、红外视频传输处理软件设计四、红外视频传输存储设计五、PS端软件设计总结前言 ......
  • icloudpd
    icloudpd介绍:每天定时同步icloud照片下载到本地。https://github.com/boredazfcuk/docker-icloudpddocker启动后​chmod-R777iCloud​,意思是赋予iCloud文件夹最高权限执行sync-icloud.sh--Initialise​有效期默认为90天,过期之后就会停止同步,这也算苹果的一个安全......
  • TCP_UDP
    TCP,UDPFlood攻击原理TCPFlood攻击配置环境WindowsServer2016配置服务器管理器,创建一个Web服务器并开启该服务器功能kali配置vim/etc/network/interfacesifupeth0开启网络查看Kaliip信息:修改路由器信息:拓扑关系如下所示:GNS3中修改路由器R......
  • 基于UDP的tftp传输服务的客户端
    效果图下载上传:代码:#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>#include<string.h>#include<unistd.h>#include<netinet/in.h>#include<stdlib.h>#include<......
  • Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件
    本文将介绍一种手动的轻量级的方式,还原HTTP/TLS协议中传输的文件,为流量数据包中的文件分析提供帮助。如果捕获的数据包中存在非文本类文件,例如png,jpg等图片文件,或者word,Excel等office文件异或是其他类型的二进制文件或者编码文件。如果想要了解这些非文本文件中的内容,往往......
  • UDP协议和TCP协议之间有什么具体区别?
    UDP(UserDatagramProtocol)和TCP(TransmissionControlProtocol)是两种常见的网络传输协议,它们在数据传输中有着显著的区别和适用场景。理解它们的区别对于网络工程师、软件开发人员以及网络安全专家都是至关重要的。本文会针对关于UDP和TCP之间区别的做出详细解释。一、协议概......
  • UDP 协议 - 学习笔记
    摘要:本文原创,转载请注明地址https://www.cnblogs.com/baokang/p/18543885一、UDP是什么UDP(UserDatagramProtocol)用户数据报协议是运输层协议的一种,是一种无连接的数据传输协议二、UDP协议的特点(1)UDP是无连接的,发送数据前不需要建立连接,因此减少的发生数据量和发送数据......
  • 基于surging 的木舟平台如何通过Tcp或者UDP网络组件接入设备
    一、概述     上篇文章介绍了木舟通过HTTP网络组件接入设备,那么此篇文章将介绍如何利用Tcp或者UDP网络组件接入设备.     木舟(Kayak)是什么?      木舟(Kayak)是基于.NET6.0软件环境下的surging微服务引擎进行开发的,平台包含了微服务和物联网平台。支......