gpt4 book ai didi

c - 使用我自己的结构在套接字编程中填充 UDP 负载?

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:55 25 4
gpt4 key购买 nike

我想使用 sendto() 通过 udp 套接字发送自定义结构变量。此结构包含 UDP 负载。当我搜索一下时,我发现可以在创建套接字时使用标志 SOCK_RAW 在 c 中创建原始套接字。但我认为,那么我将不得不填充 ip header 以及 udp header 。我想避免这种情况。

但是,当我尝试如上所述通过套接字发送自定义结构时,在使用 wireshark 嗅探时,我收到了不同的数据(不是结构内容)。请帮忙。

我尝试将结构更改为普通的 uint32_t 变量,并使用移位操作来填充该变量。我确认此变量完全包含我打算添加到其中的内容。

但同样,我也无法通过套接字发送它。 Wireshark 显示不同的内容。是不是因为在 sendto() 中,我们提供了缓冲区的地址而不是它的值?

uint32_t disc_req[1];

//disc_req is populated with bit shift operations in the following function
create_discovery_req(disc_req);

//now disc_req has exactly the required binary format - I confirmed this

// But the following sendto() sends different data. Confirmed over wireshark.
sendto(sockfd, &disc_req, sizeof(disc_req),
MSG_CONFIRM, (const struct sockaddr *) &servaddr,
sizeof(servaddr));

预期输出是通过 socket 发送的 disc_req 的值和在 wireshark 上捕获的相同值。但 disc_req 的实际值有所不同。

最佳答案

您观察到的不同内容可能是由于发送方和接收方具有不同的字节顺序(主机与网络)。如果是这样,您将希望在处理多字节值时使用 hton...()ntoh...()

通常,当您通过 UDP 发送数组或结构时,将其视为字节数组。

创建 UDP 套接字,而不是 RAW 套接字:

sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

使用您喜欢的方法设置您的目标地址(即 gethostbyname() )

然后发送负载:

sendto( sockfd, ( char* ) &disc_req[0], sizeof( disc_req ), MSG_CONFIRM, (const struct sockaddr *) &servaddr, sizeof(servaddr));

接收负载:

recvfrom( sockfd, ( char* ) &disc_req[0], sizeof( disc_req ), 0, (const struct sockaddr *) &servaddr, sizeof(servaddr) );

下面是一个使用UDP发送NTP数据包的完整例子:

https://lettier.github.io/posts/2016-04-26-lets-make-a-ntp-client-in-c.html

关于c - 使用我自己的结构在套接字编程中填充 UDP 负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57375198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com