2015-10-08 55 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

相关问题