为什么第一个客户端看到源IP为0.0.0.0?

时间:2013-05-13 09:36:57

标签: c linux sockets udp

我在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. 问题在于第一次呼叫sendtoclient.c,服务器将客户端的IP视为0.0.0.0 在第二个,第三个,...调用client.c得到一个IP和 拥有合法的IP,例如127.0.0.3:3212
  2. 另一个奇怪的事情是,如果我开始第二个新客户端,它就会得到 从第一次开始。

1 个答案:

答案 0 :(得分:9)

在调用recvfrom之前,请确保将slen设置为talker_addr结构的大小。它将在recvfrom中设置值(这可以解释它在后续调用中的工作原理)但如果初始值不正确,则第一次调用时可能会出现垃圾。

slen = sizeof(struct sockaddr_in);