6

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

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. 问题是,在第一次调用sendtofrom client.c时,服务器将客户端的 ip 视为0.0.0.0,然后在第二次、第三次...调用client.cget an ip 并拥有合法 ip,例如127.0.0.3:3212.
  2. 另一个奇怪的事情是,如果我启动第二个新客户端,它会从第一次获得 ip。
4

1 回答 1

13

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

slen = sizeof(struct sockaddr_in);
于 2013-05-13T10:04:19.620 回答