getsockname返回无效地址

时间:2013-10-27 17:24:13

标签: port

我使用fork来创建一堆子节点,在每个子节点中创建一个UDP端口并通过TCP将其发送回父节点,但问题是当子节点数增加到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个孩子时,结果是正确的

2 个答案:

答案 0 :(得分:2)

您需要将slen参数初始化为getsockname(),并且应检查其返回值 - 以便在失败时获取更多信息。

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

答案 1 :(得分:0)

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