套接字编程中没有主机错误的路由

时间:2015-10-08 11:20:48

标签: c sockets

我正在编写一个简单的客户端程序,它连接到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;
}

3 个答案:

答案 0 :(得分:0)

我只是简单地查看了你的代码,但乍一看似乎没问题。但是我会从显而易见的开始 - 也许没有通往主持人的路线......

假设您使用的是Linux或其他Unix平台(包括OSX),我会执行以下操作:

  • ping 172.31.1.34。请注意,这并不能保证主机不可用,因为ping可能会被阻止。
  • telnet 172.31.1.34。这应该连接,您可以直接输入您的HTTP查询
  • tcptraceroute 172.31.1.34 80

如果所有这些都失败了,那就是网络,而不是你的代码。

在OSX上,您可以从&#34; homebrew&#34;安装tcptraceroute。在Linux上使用您的普通包管理器(或询问您的系统管理员)。

答案 1 :(得分:0)

您为什么使用SOCK_DGRAM?那是UDP数据包。 HTML使用TCP。您应该使用SOCK_STREAM

答案 2 :(得分:0)

请尝试以下代码:

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