2013-10-27 6 views
1

Я использовал fork для создания группы дочерних элементов в каждом дочернем элементе, создав 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 после «Connect» для клиента, «принять» для сервера, если вы хотите, чтобы получить сокет пару соединения. Вам также необходимо инициализировать переменную len следующим образом: len = sizeof my addr как @nos сказал. Функция нужна len, чтобы определить, сколько времени (struct sockaddr *), потому что мы можем передать переменную с типом структуры sockaddr_in, struct sockaddr_in6 или struct sock_storage. Эти три типа типов имеют разную длину.

Смежные вопросы