2009-04-16 56 views
0

嘿!我試圖連接到我的本地主機和我在那裏的索引頁面。但每次我嘗試我的時間只是得到:使用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 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: [email protected]\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; 
} 

有缺什麼?我正在學習一個教程,這基本上是他們在那裏的代碼。

由於

回答

1

HTTP 1.1需要Host: localhost頭 - 無論是添加此或使用HTTP 1.0

此外,標頭由\r\n只是\n分離,而不是。

+0

謝謝!它爲本地主機工作,但不適用於其他網站(比如本地主機)要嘗試閱讀更多關於http的內容。 – AntonioCS 2009-04-16 23:10:41

0

正如RoBorg說你的GET字符串應該是:

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

如果要連接到其他網站,除了本地主機的「主機」字段將不得不進行更新(通常是主機名,IP地址,或www作品) 。

0

可能更容易嘗試只使用HTTP/1.0,你不需要指定額外的值:

焦炭得到[] = { 「GET/HTTP/1.0 \ r \ n」 };

應該到處...

0

您還可能要使用的WinInet爲您的客戶端的HTTP需求,而不是隻插座試一試。

很多人通過代理連接到Web服務 - 也就是說,他們自己的計算機無法訪問Web,但它可以到達將轉發請求的附近計算機(代理)。您的套接字代碼不處理代理,但WinInet API將自動爲您執行。

[作爲一個老式的網絡人,我不願意這些設備 - 他們已經基本上實施嚴重路由器]

同樣,您可能希望你的服務器切換到https:有一天;您將需要更新套接字代碼來處理此問題,但WinInet再次爲您提供。

[注:我在微軟工作]