使用winsock获取localhost的内容

时间:2009-04-16 15:30:27

标签: c winsock

喂!我正在尝试连接到我的localhost和我在那里的索引页面。但每次我尝试我都会得到:

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>

这是我的代码:

#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 个答案:

答案 0 :(得分:1)

HTTP 1.1需要Host: localhost标头 - 要么添加此标头,要么使用HTTP 1.0

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

答案 1 :(得分:0)

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

    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工作)。

答案 2 :(得分:0)

尝试使用HTTP / 1.0可能更容易,您不需要指定额外的值:

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

应该到处工作......

答案 3 :(得分:0)

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

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

[作为一个老式的网络人,我厌恶这些设备 - 他们实际上已经严重执行了路由器]

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

[注意:我在微软工作]