2012-06-13 3 views
0

제공하는 주소에 연결하는 간단한 클라이언트를 구현하려고합니다. 내가 sockaddr_in 구조체에 넣은 후에 주어진 주소와 IP 주소와 포트를 출력하고 있음을 알 수있을 것이다. 동일한 주소 여야하지만 두 개의 다른 주소가 있습니다.sockaddr_in이 잘못된 IP 주소를 가져옵니다. cpp

여기 내 코드입니다 :

int createConnection(char * address, char * port) { 
    cout << address << " " << port << endl; 
    struct sockaddr_in server; 
    server.sin_family = AF_INET; 
    server.sin_port = htons(atoi(port)); 
    inet_aton(address,&(server.sin_addr)); 
    memset(&(server.sin_zero), '\0', 8); 
    if ((sockFd = socket(PF_INET,SOCK_STREAM,0)) == -1) { 
     perror("client: socket"); 
    } 
    if (connect(sockFd,(const sockaddr *)&server,sizeof(struct sockaddr_in)) == -1) { 
     close(sockFd); 
     perror("client: connect"); 
    } 

    char s[INET_ADDRSTRLEN]; 
    inet_ntop(AF_INET, (struct sockaddr *)&server, s, sizeof s); 
    printf("client: connecting to %s, %i\n", s, server.sin_port); 
    printf("connected"); 
    return 0; 
} 

그리고 출력은

132.65.151.39 3000 
client: connecting to 2.0.11.184, 47115 

내 질문입니다 :

  1. 는 왜 두 개의 서로 다른 주소를 볼 수 있습니까?
  2. 어떻게 연결이 실패하지 않습니까?

나중에 내 프로그램이 recv()에서 차단되므로 나중에 원하는 위치에 연결하지 못했다고 생각됩니다. 감사!

당신이 inet_ntop()에 잘못된 일을 전달하는 것 같습니다

답변

2

:

inet_ntop(AF_INET, (struct sockaddr *)&server, s, sizeof s); 

당신은 아마 .sin_addr을 통과해야한다 : 전화를해야하기 때문에 포트의

inet_ntop(AF_INET, &server.sin_addr, s, sizeof s); 

, 그것은 잘못 인쇄 호스트 바이트 순서로 다시 변환하려면 ntohs() :

printf("client: connecting to %s, %i\n", s, ntohs(server.sin_port)); 

주소가 인 경우이 실제로 설정 되었기 때문에 연결이 작동합니다.

+0

감사! 다른 포트 번호를 남겨 둡니다. 어떤 아이디어? – yotamoo

+0

동일합니다. 이제 서버에서 아무것도 얻지 못하는 이유를 알 수 없습니다. 감사합니다! – yotamoo

관련 문제