0

嘿!我正在尝试连接到我的本地主机和那里的索引页面。但每次我尝试我都会得到:

Dados -> HTTP/1.1 400 Bad Request Date: Thu, 16 Apr 2009 15:25:41 GMT Server: Apache/2.2.10 (Win32) PHP/5.2.8 Content-Length: 226 Connection: close Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> </body></html>

☺</p>

这是我的代码:

#define WIN32_LEAN_AND_MEAN


#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main()
{
    WSADATA WsaDat;

    if(WSAStartup(MAKEWORD(2,0),&WsaDat)!=0)
    {
        printf("Winsock error - Winsock initialization failed\r\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    SOCKET Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    if(Socket==INVALID_SOCKET)
    {
        printf("Winsock error - Socket creation Failed!\r\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }


    struct hostent *host;
    if((host=gethostbyname("localhost"))==NULL)      
    {
        printf("Failed to resolve hostname.\r\n");
        WSACleanup();
        return 0;
    }

    printf("Resolveu o hostname\r\n");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port= htons(80);
    SockAddr.sin_family= AF_INET;
    SockAddr.sin_addr.s_addr= *((unsigned long*)host->h_addr);

    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr))!=0)
    {
        printf("Failed to establish connection with server\r\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    char get[] = {
                    "GET / HTTP/1.1\n"
                    "From: bla@ble\n"
                    "User-Agent: HTTPTool/1.0\n"
                    "\n"
                };
    send(Socket,get, strlen(get),0);


    printf("Ligou-se\r\n");
    char buffer[1000];
    int nDataLength = recv(Socket,buffer,1000,0);
    printf("Dados -> %s",buffer);


    shutdown(socket,SD_SEND);


    closesocket(socket);

    WSACleanup();



    return 0;
}

有什么遗漏吗?我正在关注一个教程,这基本上就是他们那里的代码。

谢谢

4

4 回答 4

1

HTTP 1.1需要一个Host: localhost标头 - 添加此标头或使用 HTTP 1.0

此外,标题由 分隔\r\n,而不仅仅是\n.

于 2009-04-16T15:33:18.510 回答
0

It might be easier to try just using HTTP/1.0, which you don't need to specify the extra values:

char get[] = { "GET / HTTP/1.0\r\n" };

Should work everywhere...

于 2009-05-13T22:15:58.407 回答
0

正如 RoBorg 所说,您的 get 字符串应该是:

    char get[] = {
                "GET / HTTP/1.1\r\n"
                "Host: localhost\r\n"
                "From: bla@ble\r\n"
                "User-Agent: HTTPTool/1.0\r\n"
                "\r\n"
            };

如果您要连接到除 localhost 之外的其他站点,则必须更新“主机”字段(通常是主机名、IP 地址或 www 有效)。

于 2009-04-16T23:54:24.313 回答
0

您可能还想尝试使用WinInet来满足您的客户端 Http 需求,而不仅仅是套接字。

许多人通过代理连接到网络服务——也就是说,他们自己的计算机无法访问网络,但它可以访问附近的计算机(代理)来转发请求。您的套接字代码不处理代理,但 WinInet API 会自动为您处理。

[作为一个老式的网络人,我讨厌这些设备——它们基本上没有很好地实现路由器]

同样,您可能希望有一天将您的服务器切换到 https:你会花很多时间更新你的套接字代码来处理这个问题,但是 WinInet 再次为你做这件事。

[注:我在微软工作]

于 2009-06-17T14:49:36.910 回答