2013-10-27 183 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的變量。這三種類型具有不同的長度。