2013-05-26 3 views
0

일부 소켓 응용 프로그램을 작성하려고하는데 문제가 있습니다. OS가 내 주소에 대해 임의의 무료 포트 번호를 선택하도록합니다. 그러나 포트 번호 = 0을 수신합니다. 내가 잘못 했나요?bind() 제로 포트를 선택하십시오

struct sockaddr_in addr; 
socklen_t addrLen; 
int fd = socket(AF_INET, SOCK_STREAM, 0); 
if (fd == -1) { 
    ThreadError("Failed to create data channel socket"); 
} 
addr.sin_family = AF_INET; 
addr.sin_port = 0; // pick random free port 
addr.sin_addr.s_addr = srvAddr; // = inet_addr(127.0.0.1) 
if (bind(fd, (const struct sockaddr *)&addr, sizeof(addr)) == -1) { 
    ThreadError("Failed to bind data channel"); 
} 
if (getsockname(fd, (struct sockaddr *)&addr, &addrLen) == -1) { 
    ThreadError("getsockname() failed"); 
} 
if (listen(fd, 1) == -1) { 
    ThreadError("Failed to set socket to listen mode"); 
} 
// addr.sin_port == 0 
+0

@AhmedMasud 제공 한 인용문은 전혀 바인딩되지 않은 소켓에 관한 것입니다. 당신이 혐의했던 것과는 반대로 그렇게해야한다는 것과 그곳에는 당신이 주장한 바없는 제로 항구에 묶을 수 없다는 것 외에는 아무것도 없다는 것은 없습니다. 또한 0 * 주소 (* INADDR_ANY)에 bind() 할 수 있습니다. – EJP

답변

5

당신은 당신이 getsockname를 호출하기 전에 addrlen = sizeof addr를 설정해야합니다.

크기는 in-out 매개 변수입니다. 제공하는 버퍼의 크기를 지정하면 크기를 수정하여 사용 된 버퍼의 용량을 알려줍니다.