硬汉嵌入式论坛

 找回密码
 立即注册
查看: 403|回复: 7
收起左侧

[以太网] 关于NetX Duo中recvmsg函数

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2025-9-2 09:33:45 | 显示全部楼层 |阅读模式
recvmsg函数传递的第二个参数是该结构体,但是该好像并没有把msg_control中填充数据,每次都是NULL,请问一下有使用该函数的朋友吗,msg参数应该如何填写
struct msghdr {    void         *msg_name;       /* optional address */    socklen_t     msg_namelen;    /* size of address */    struct iovec *msg_iov;        /* scatter/gather array */    size_t        msg_iovlen;     /* # elements in msg_iov */    void         *msg_control;    /* ancillary data, see below */    size_t        msg_controllen; /* ancillary data buffer len */    int           msg_flags;      /* flags on received message */};

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-3 09:38:02 | 显示全部楼层
3243.png


[C] 纯文本查看 复制代码
void Server_Thread (void *arg) {
  SOCKADDR_IN addr;
  IN_ADDR     dst_ip;
  MSGHDR  msg;
  IOVEC   iov;
  union {
    CMSGHDR  cm;
    uint8_t  raw[32];
  } control_un;
  CMSGHDR *cmsg;
  int32_t sock, res;
  char dbuf[4];
  char enable;
 
  while (1) {
    sock = socket (AF_INET, SOCK_DGRAM, 0);
 
    addr.sin_family      = AF_INET;
    addr.sin_port        = htons(PORT_NUM);
    addr.sin_addr.s_addr = INADDR_ANY;
    bind (sock, (SOCKADDR *)&addr, sizeof(addr));
 
    // Enable receiving destination IPv4 address
    enable = 1;
    setsockopt (sock, IPPROTO_IP, IP_RECVDSTADDR, &enable, sizeof(enable));
 
    // Specify receive IO buffer
    iov.iov_base    = &dbuf[0];
    iov.iov_len     = sizeof(dbuf);
 
    // Construct message header
    msg.msg_iov         = &iov;
    msg.msg_iovlen      = 1;
    msg.msg_name        = &addr;
    msg.msg_namelen     = sizeof(addr);
    msg.msg_control     = &control_un.cm;
    msg.msg_controllen  = sizeof(control_un);
 
    while (1) {
      res = recvmsg (sock, &msg, 0);
      if (res <= 0) {
        break;
      }
 
      // Process control data
      for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
        if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR) {
          IN_ADDR *pia = (IN_ADDR *)CMSG_DATA(cmsg);
          dst_ip.sin_addr.s_addr = pia->s_addr;
        }
      }
 
      // Process normal data
      procrec ((uint8_t *)dbuf);
      printf ("Remote IP:   %s\n", inet_ntoa(addr.sin_addr));
      printf ("Remote port: %d\n", ntohs (addr.sin_port));
    }
    closesocket (sock);
  }
}

回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2025-9-4 09:52:31 | 显示全部楼层
屏幕截图 2025-09-04 094948.png 请问一下,这个NetXDuo是那个版本我在6.4.3并没有搜到这个CMSG相关的宏或函数
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-4 11:01:02 | 显示全部楼层
dd6500 发表于 2025-9-4 09:52
请问一下,这个NetXDuo是那个版本我在6.4.3并没有搜到这个CMSG相关的宏或函数

找到函数nx bsd recvmsg,看看他的是怎么个定义方式
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2025-9-5 11:12:47 | 显示全部楼层
eric2013 发表于 2025-9-4 11:01
找到函数nx bsd recvmsg,看看他的是怎么个定义方式

看了,好像这个NetX Duo压根没实现这个msg_control相关的内容
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-6 10:15:57 | 显示全部楼层
dd6500 发表于 2025-9-5 11:12
看了,好像这个NetX Duo压根没实现这个msg_control相关的内容

那有可能确实没有,我检索了下,也没找到。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2025-9-10 10:04:33 | 显示全部楼层
eric2013 发表于 2025-9-6 10:15
那有可能确实没有,我检索了下,也没找到。

只能说这个NetX Duo实现的太不完全了,各种不支持啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118335
QQ
发表于 2025-9-11 10:00:54 | 显示全部楼层
dd6500 发表于 2025-9-10 10:04
只能说这个NetX Duo实现的太不完全了,各种不支持啊

GitHub上给他们发消息,增加新函数支持。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 18:22 , Processed in 0.050110 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表