2013-10-27 138 views
1

我用叉子来创建一群孩子,在每个孩子身上,创建一个UDP端口并通过TCP发回给父母,但问题是当孩子的数量增加到9时, getsockname()函数为每个子项返回端口num 0。getsockname返回无效地址

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

您需要初始化slen参数getsockname(),你应该检查返回值 - 因此,如果它失败,您可以得到更多的信息。

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

,如果你想获得对插座的连接只能使用getsockname后,“连接”客户端,“接受”的服务器。你也需要像这样初始化变量len: len = sizeof my addr @nos说。该函数需要len来确定(struct sockaddr *)是多久,因为我们可以传递一个类型为struct sockaddr_in,struct sockaddr_in6或struct sock_storage的变量。这三种类型具有不同的长度。