【问题标题】:getsockname return invalid addressgetsockname 返回无效地址
【发布时间】:2013-10-27 17:24:12
【问题描述】:

我用fork创建了一堆children,在每个children中,创建一个UDP端口通过TCP发回给parent,但是问题是当children增加到9个时,getsockname()函数为每个孩子返回端口号 0。

int udp_sockfd;
struct sockaddr_in their_addr, my_addr;
socklen_t slen;//used in getsockname()
if((udp_sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
        perror("socket");
        exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(0);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), sizeof(my_addr.sin_zero));
if(bind(udp_sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
    perror("bind");
    exit(1);
}

getsockname(udp_sockfd,(struct sockaddr*)&my_addr,&slen);
printf("client %d: my port number: %d\n",i,my_addr.sin_port);

当有8个孩子时,结果正确

【问题讨论】:

    标签: port


    【解决方案1】:

    您需要将 slen 参数初始化为 getsockname() ,并且您应该检查它的返回值 - 这样您就可以在失败时获得更多信息。

    slen = sizeof my_addr;
    if (getsockname(udp_sockfd,(struct sockaddr*)&my_addr,&slen) != 0) {
       perror("getsockname");
    }
    

    【讨论】:

      【解决方案2】:

      如果你想获取连接的套接字对,你只能在'connect'之后使用getsockname客户端,'accept'用于服务器。您还需要像这样初始化变量 len: len = sizeof my addr 正如@nos 所说。该函数需要 len 来确定 (struct sockaddr*) 的长度,因为我们可以传递一个类型为 struct sockaddr_in、struct sockaddr_in6 或 struct sock_storage 的变量。这三种类型的长度不同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        • 2013-04-25
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        相关资源
        最近更新 更多