[英]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.