-2

我使用一个程序从收到的数据包中提取源地址。但我不明白 & 运算符在以下代码中的用法:

==> 函数转换地址

struct in_addr {
        unsigned long int s_addr; }

char *inet_ntoa(struct in_addr in);

==> 接收数据包

recvfrom(sockfd, buffer, sizeof(struct iphdr) + sizeof(struct icmphdr), 0, (struct sockaddr *)&connection, &addrlen)) == -1)

===> 显示源地址

struct iphdr* ip_reply;

/*code */

ip_reply   = (struct iphdr*) buffer;

/*code */

printf("RCV ip->daddr = %s \n",inet_ntoa(*((struct in_addr *)&ip_reply->saddr)));

为什么我必须使用&in &ip_reply->saddr

4

2 回答 2

3

这是运算符的地址。它接受操作数并返回操作数的地址,换句话说,它返回一个指向操作数的指针。

在这种情况下,代码将创建一个指向 的指针ip_reply->saddr,将其类型转换为指向 的指针struct in_addr,然后取消引用该指针。这是一种将任意数据从一种类型转换为另一种类型的方法。

于 2013-07-05T10:35:31.857 回答
1

您需要使用 & 运算符(地址),因为 inet_ntoa 需要变量 ip_reply->saddr 的地址,这基本上是您的源 IP 地址。您不能将其作为值传递,而是作为地址传递。在进行 tcp/ip 套接字编程之前,您应该学习一些指针和数据结构。

于 2013-07-05T10:47:45.317 回答