为什么第一个客户端的源IP似乎是0.0.0.0?

问题描述 投票:0回答:1

我在 Linux 上有一个

client.c
server.c
。我在两者上都初始化了一个套接字:

sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

在服务器中我添加:

listen_addr.sin_family = AF_INET;
listen_addr.sin_port = htons(port);
listen_adrr.sin_addr.s_addr = htonl(INADDR_ANY);

server.c
呼叫(阻塞方式)到
recvform

if (recvfrom(sockfd, buf_get, BUFLEN, 0, (struct sockaddr*)&talker_addr, &slen) == -1)
            err("recvfrom()");

并且

client.c
发送数据包:

if (sendto(sockfd, buf_sent, BUFLEN, 0, (struct sockaddr*)&serv_addr, slen) == -1)
        err("sendto()");
  1. 问题是,在第一次从
    sendto
    调用
    client.c
    ,服务器看到客户端的ip为
    0.0.0.0
    ,之后 在第二个、第三个...调用
    client.c
    获取 ip 并 有合法的ip,例如
    127.0.0.3:3212
  2. 另一个奇怪的事情是,如果我启动第二个新客户端,它就会 ip 从第一次开始。
c linux sockets udp
1个回答
14
投票

在调用 recvfrom 之前,请确保将 slen 设置为 talker_addr 结构的大小。 它将在recvfrom中设置值(这可以解释为什么它在后续调用中起作用),但如果初始值不好,您可能会在第一次调用时得到垃圾。

slen = sizeof(struct sockaddr_in);
© www.soinside.com 2019 - 2024. All rights reserved.