2015-10-08 72 views
1

我正在寫一個簡單的客戶端程序,它連接到一個IP地址「172.31.1.34」併發送一條消息。一切正常,但我無法從服務器收到任何消息。錯誤說「沒有路由到主機」。 我的代碼沒有路由到套接字編程中的主機錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

int main() 
{ 
    struct sockaddr_in server,client; 
    int s1,s2,len; 
    int n; 
    char buffer[500]; 

    strcpy(buffer,"GET http://172.31.1.34/ HTTP/1.0\n\n"); 
    bzero((char *)&client,sizeof(client)); 
    client.sin_port = htons(80); 
    client.sin_addr.s_addr = inet_addr("172.31.1.34"); 
    client.sin_family = AF_INET; 
    s2 = socket(AF_INET,SOCK_DGRAM,0); 

    if(connect(s2,(struct sockaddr *)&client,sizeof(client)) == -1) { 
     perror("can't connect\n"); 
     exit(1); 
    } 
    n = send(s2,buffer,strlen(buffer),0); 
    if(n < 0) { 
     perror("message not sent"); 
     exit(1); 
    } 
    while(1) { 
     memset(buffer,0,sizeof(buffer)); 
     n = recv(s2,buffer,500,0); 
     if(n < 0) { 
      perror("coudnot read"); 
      exit(1); 
     } 
     buffer[n] = '\0'; 
     printf("%s",buffer); 
    } 

    close(s2); 
    return 0; 
} 

回答

0

你爲什麼用SOCK_DGRAM?這是針對UDP數據包的。 HTML使用TCP。您應該使用SOCK_STREAM

+0

謝謝你提出錯誤。它現在的作品:) –

0

我只簡要地看着你的代碼,但乍看之下,似乎確定。不過,我會帶有明顯的開始 - 也許有到主機的路由....

假設你是在Linux或其他Unix平臺(包括OSX),我會做到以下幾點:

  • ping 172.31.1.34。請注意,這並不能保證主機不可用,因爲ping可能被阻止。
  • telnet 172.31.1.34。這應該連接,您可以輸入您的HTTP查詢直接
  • tcptraceroute 172.31.1.34 80

如果所有這些失敗,問題是網絡,而不是你的代碼。

在OSX上,您可以從「homebrew」安裝tcptraceroute。在Linux上使用普通的軟件包管理器(或詢問你的系統管理員)。

+0

平,telnet和tcptraceroute所有工作正常。當我使用telnet發送消息時,我收到了一個回覆。 –

0

嘗試下面的代碼來代替:

client.sin_addr.s_addr = inet_addr("172.31.1.34"); 
inet_pton(AF_INET, "172.31.1.34", &client.sin_addr); 
+0

請使用代碼塊格式化您的代碼,而不是突出顯示。 – jdhao

相關問題