gpt4 book ai didi

c - 如何正确填充套接字地址?

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

我在 iOS 中通过套接字发送 ICMP 数据包:

struct sockaddr         hostAddress;

self->hostAddress.sa_family = AF_INET;
inet_pton(AF_INET, "173.194.67.93", &self->hostAddress.sa_data);

然后,我打开套接字并发送数据包:

bytesSent = sendto(
CFSocketGetNative(self->_socket),
[packet bytes],
[packet length],
0,
&self->hostAddress,
sizeof(self->hostAddress)
);

当我在 WireShark 中看到数据包时,它被发送到“67.93.0.0”,而不是“173.194.67.93”。

问题出在哪里?

最佳答案

inet_pton(AF_INET, ...);

应该将 struct in_addr 作为第三个参数(参见 docs)。

你给它sa_data,来自

struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};

真正被视为:

struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};

因此,前 16 位进入端口,IPV4 地址的后 16 位实际上进入 sin_addr,其余似乎被零初始化。


应该这样做(为了清楚起见,我会加入大量的转换)

struct sockaddr *addr = &self->hostAddress; // generic address
struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr; // downcast to ipv4
inet_pton(AF_INET, "173.194.67.93", &ipv4->sin_addr);

关于c - 如何正确填充套接字地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13014801/

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