使用winsock获取本地主机的内容

使用winsock获取本地主机的内容,c,winsock,C,Winsock,嘿!我正在尝试连接到我的本地主机和那里的索引页。但每次我尝试时,我都会得到: 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 HT

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

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>
Dados->HTTP/1.1400错误请求日期:2009年4月16日星期四15:25:41 GMT服务器:Apache/2.2.10(Win32)PHP/5.2.8内容长度:226连接:关闭内容类型:text/html;字符集=iso-8859-1
400错误请求错误请求您的浏览器发送了一个此服务器无法理解的请求。

以下是我的代码:

#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;
}
#定义WIN32_LEAN_和_MEAN
#包括
#包括
#包括
int main()
{
WSADATA WsaDat;
if(WSAStartup(MAKEWORD(2,0),&WsaDat)!=0)
{
printf(“Winsock错误-Winsock初始化失败\r\n”);
WSACleanup();
系统(“暂停”);
返回0;
}
SOCKET SOCKET=SOCKET(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
if(Socket==无效的_Socket)
{
printf(“Winsock错误-套接字创建失败!\r\n”);
WSACleanup();
系统(“暂停”);
返回0;
}
结构主机*主机;
if((host=gethostbyname(“localhost”))==NULL)
{
printf(“解析主机名失败。\r\n”);
WSACleanup();
返回0;
}
printf(“解析主机名\r\n”);
SOCKADDR_在SOCKADDR中;
SockAddr.sinu端口=htons(80);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=*((无符号长*)主机->h_addr);
if(connect(Socket,(SOCKADDR*)(&SOCKADDR),sizeof(SOCKADDR))!=0)
{
printf(“未能与服务器建立连接\r\n”);
WSACleanup();
系统(“暂停”);
返回0;
}
char get[]={
“获取/HTTP/1.1\n”
“发件人:bla@ble\n“
“用户代理:HTTPTool/1.0\n”
“\n”
};
发送(Socket,get,strlen(get),0);
printf(“Ligou se\r\n”);
字符缓冲区[1000];
int nDataLength=recv(插座,缓冲器,1000,0);
printf(“护墙板->%s”,缓冲区);
关机(插座、SD_发送);
插座;
WSACleanup();
返回0;
}
有什么东西不见了吗?我遵循一个教程,这基本上是他们那里的代码

谢谢

需要
主机:本地主机
头-添加此头或使用HTTP 1.0


此外,标头由
\r\n
分隔,而不仅仅是像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"
            };

如果您连接到本地主机以外的其他站点,则必须更新“主机”字段(通常是主机名、IP地址或www工作)。

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

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


应该可以在任何地方工作…

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

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

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

类似地,您可能希望在某一天将服务器切换到https;为了处理这个问题,您需要花很长时间更新套接字代码,但是WinInet会帮您完成这项工作


[注意:我在微软工作]

谢谢!它适用于本地主机,但不适用于其他站点(如本站点),我们将尝试阅读更多关于http的内容。