2014-04-22 6 views
0

일부 programm의 포트 번호를 생성해야합니다. Google은 제로 포트 생성과 바인딩하면 사용되지 않는 포트를 바인딩합니다. 제로 포트를 바인딩하고 포트 번호를 기억하고 싶습니다. 이걸하려고? 하지만 netstat 내 programm 포트를 볼 수 없습니다. 내가 다른 오류가 표시되지 않는,보다bind (0)를 사용하여 고유 한 IP 포트 생성

bind(sfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) 

기타 : 리눅스 2.6.27는

int sfd; 
struct sockaddr_in my_addr; 

sfd = socket(PF_INET , SOCK_STREAM, 0); 
if (sfd == -1) 
{ 
    printf("socket error\n"); 
    return -1; 
} 

memset(&my_addr, 0, sizeof(struct sockaddr_in)); 
my_addr.sin_family = AF_INET; 
my_addr.sin_addr.s_addr = INADDR_ANY; 
my_addr.sin_port = 0; 

if (bind(sfd, (struct sockaddr_in *) &my_addr, 
     sizeof(struct sockaddr_in)) == -1) 
    printf("bind error\n"); 

if (listen(sfd, LISTEN_BACKLOG) == -1) 
    printf("listen error\n"); 
+0

가 왜? 몇 밀리 초 후에 사용 가능하지 않을 수도 있습니다. 임의의 포트를 원한다면, 필요할 때마다 이전 포트가 아닌 이전 포트를 사용하십시오. – EJP

+0

바인드는 2ms 동안 동일한 포트를 생성하지 않습니다. 타사 프로그램에서 포트 번호를 필요로 함 –

답변

1

bind()sockaddr* 아닌 sockaddr_in*을 기대하고있다. 포트 0에 바인드하는 것은 사용 가능한 임의의 포트에 바인드하는 올바른 방법입니다. bind()listen()이 실패를보고하지 않으면 netstat에 열린 포트가 표시되어야합니다. 실제로 선택 bind()있는 포트를 찾아 getsockname()를 사용하여 예를 들면 : ". 나는 제로 포트를 바인딩이 번호, 가까운 포트의 기억하고 싶은"

int sfd = socket(PF_INET , SOCK_STREAM, 0); 
if (sfd == -1) 
{ 
    printf("socket error: %d\n", errno); 
    return -1; 
} 

struct sockaddr_in my_addr; 
memset(&my_addr, 0, sizeof(my_addr)); 
my_addr.sin_family = AF_INET; 
my_addr.sin_addr.s_addr = INADDR_ANY; 
my_addr.sin_port = 0; 

if (bind(sfd, (struct sockaddr *) &my_addr, sizeof(my_addr)) == -1) 
{ 
    printf("bind error: %d\n", errno); 
    close(sfd); 
    return -1; 
} 

if (listen(sfd, LISTEN_BACKLOG) == -1) 
{ 
    printf("listen error: %d\n", errno); 
    close(sfd); 
    return -1; 
} 

memset(&my_addr, 0, sizeof(my_addr)); 
socklen_t my_addrlen = sizeof(my_addr); 

if (getsockname(sfd, (struct sockaddr *) &my_addr, &my_addrlen) == -1) 
{ 
    printf("getsockname error: %d\n", errno); 
    close(sfd); 
    return -1; 
} 

printf("listening on port: %hu\n", ntohs(my_addr.sin_port));