繁体   English   中英

为什么我没有在 C 中获得带有 Winsock2 程序的 BBC 服务器的主要 web 页面?

[英]Why don't i get the main web page of BBC server with Winsock2 program in C?

我编写了一个程序,该程序应该打印 BBC 服务器的主要 web 页面。 BBC 服务器主机名为www.bbc.co.uk ,其 IP 地址为38.160.150.31 当我向服务器发送 HTTP GET 命令消息时,我没有得到 BBC 的主要 web 页面,而是得到以下信息:

HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Connection: close
Content-Length: 685

<HTML><HEAD>
<TITLE>Appliance Error</TITLE>
</HEAD>
<BODY>
<FONT face="Helvetica">
<big><strong></strong></big><BR>
</FONT>
<blockquote>
<TABLE border=0 cellPadding=1 width="80%">
<TR><TD>
<FONT face="Helvetica">
<big>Appliance Error (internal_error)</big>
<BR>
<BR>
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica">
An unrecoverable error was encountered: ""
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica">
This problem is unexpected. Please use the contact information below to obtain assistance.
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica" SIZE=2>
<BR>
For assistance, contact your network support team.
</FONT>
</TD></TR>
</TABLE>
</blockquote>
</FONT>
</BODY></HTML>

我的代码:

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

int main()
{
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        puts("Error: Cannot initialize winsock.");
        return 0;
    }
    SOCKET mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (mainSocket == INVALID_SOCKET || mainSocket == SOCKET_ERROR) {
        puts("Error: Cannot create socket.");
        return 0;
    }

    SOCKADDR_IN hostAddress;
    hostAddress.sin_family = AF_INET;
    hostAddress.sin_port = htons(80);
    hostAddress.sin_addr.S_un.S_addr = inet_addr("38.160.150.31");

    if (connect(mainSocket, (SOCKADDR*) &hostAddress, sizeof(hostAddress)) == SOCKET_ERROR) {
        printf("Cannot connect to the server. Error Code: %d\n", WSAGetLastError());
        return 0;
    }
    puts("Connected!");

    char *message = "GET HTTP/1.1\r\nHost: www.bbc.co.uk\r\n\r\n";
    int retval = send(mainSocket, message, strlen(message), 0);
    if (retval == 0) {
        puts("Error: Connection lost.");
        return 0;
    } else if (retval < 0) {
        printf("Error: Cannot send any message. Err #%d\n", WSAGetLastError());
        return 0;
    }
    char *serverReply = (char*) malloc(sizeof(char)*1000);
    if (serverReply == NULL) {
        puts("Error: Out of memory.");
        return 0;
    }
    puts("Recieved:");
    while (1) {
        retval = recv(mainSocket, serverReply, 999, 0);
        if (retval <= 0) break;
        serverReply[retval] = '\0';
        printf("%s", serverReply);
    }
    closesocket(mainSocket);
    puts("\nConnection closed.");
    WSACleanup();
    free(serverReply);
    return 1;
}

我的代码有什么问题?

在行

char *message = "GET HTTP/1.1\r\nHost: www.bbc.co.uk\r\n\r\n";

缺少请求目标。

3.1.1。 请求行

请求行以方法标记开头,后跟一个空格 (SP)、请求目标、另一个空格 (SP)、协议版本,并以 CRLF 结尾。

 request-line = method SP request-target SP HTTP-version CRLF

https://tools.ietf.org/html/rfc7230#section-3.1.1

因此代码行应如下所示:

char* message = "GET / HTTP/1.1\r\nHost: www.bbc.co.uk\r\n\r\n";

注意 GET 之后的/

旁注

nslookup www.bbc.co.uk为我返回一个不同的 IP 地址。 据推测,IP 地址对于某些用户来说是不同的,这可能取决于他们的地理位置或负载平衡系统等。

程序执行时返回一个HTTP状态码301,表示

超文本传输协议 (HTTP) 301 Moved Permanently redirect 状态响应代码表示请求的资源已明确移动到 Location 标头给出的 URL。

请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301

位置 header 是:

Location: https://www.bbc.co.uk/

请注意https协议。

因此,要获取 BBC 网站的内容,您需要发出 https 请求。 您可能想为此使用一个库,例如,请参阅这个不错的答案: https://stackoverflow.com/a/16255486/2331445

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM