2012-06-13 65 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()中被阻塞,所以我認爲它沒有連接到我想要的地方。謝謝!

回答

2

它看起來像你傳遞了錯誤的事情inet_ntop()

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