Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不';我不能用C语言的Winsock2程序获取BBC服务器的主网页吗?_C_Server_Winsock2 - Fatal编程技术网

为什么不';我不能用C语言的Winsock2程序获取BBC服务器的主网页吗?

为什么不';我不能用C语言的Winsock2程序获取BBC服务器的主网页吗?,c,server,winsock2,C,Server,Winsock2,我写了一个程序,本来应该打印BBC服务器的主网页。BBC服务器主机名为www.BBC.co.uk,其IP地址为38.160.150.31。当我向服务器发送HTTP GET命令消息时,我没有得到BBC的主网页,而是得到以下内容: HTTP/1.1500内部服务器错误 缓存控制:没有缓存 Pragma:没有缓存 内容类型:text/html;字符集=utf-8 连接:关闭 内容长度:685 设备错误 设备错误(内部错误) 遇到无法恢复的错误:“” 这个问题出乎意料。请使用下面的联系信息获取帮助

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

HTTP/1.1500内部服务器错误
缓存控制:没有缓存
Pragma:没有缓存
内容类型:text/html;字符集=utf-8
连接:关闭
内容长度:685
设备错误

设备错误(内部错误)

遇到无法恢复的错误:“” 这个问题出乎意料。请使用下面的联系信息获取帮助。
如需帮助,请联系您的网络支持团队。
我的代码:

#包括
#包括
#包括
#包括
int main()
{
WSADATA WSADATA;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){
puts(“错误:无法初始化winsock。”);
返回0;
}
SOCKET mainSocket=SOCKET(主机、SOCK流、IPPROTO\u TCP);
if(mainSocket==无效的| | mainSocket==套接字|错误){
puts(“错误:无法创建套接字”);
返回0;
}
主机地址中的SOCKADDR_;
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\u错误){
printf(“无法连接到服务器。错误代码:%d\n”,WSAGetLastError());
返回0;
}
放置(“已连接!”);
char*message=“获取HTTP/1.1\r\n邮件:www.bbc.co.uk\r\n\r\n”;
int retval=send(mainSocket,message,strlen(message),0);
如果(retval==0){
puts(“错误:连接丢失”);
返回0;
}else if(retval<0){
printf(“错误:无法发送任何消息。错误#%d\n”,WSAGetLastError());
返回0;
}
char*serverReply=(char*)malloc(sizeof(char)*1000);
if(serverReply==NULL){
puts(“错误:内存不足”);
返回0;
}
认沽(“已收:”);
而(1){
retval=recv(mainSocket,serverReply,999,0);
如果(返回值在行中

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

因此,代码行应该如下所示:

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永久移动重定向状态响应代码表示所请求的资源已最终移动到位置头给定的URL

位置标题为:

Location: https://www.bbc.co.uk/
请注意
https
协议

因此,要获取BBC网站的内容,您需要发出一个https请求。您可能需要使用一个库来实现这一点,例如,请参见下面这个漂亮的答案:

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

因此,代码行应该如下所示:

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永久移动重定向状态响应代码表示所请求的资源已最终移动到位置头给定的URL

位置标题为:

Location: https://www.bbc.co.uk/
请注意
https
协议

因此,要获取BBC网站的内容,您需要发出https请求。您可能需要使用库来实现此目的,例如,请参阅下面这个漂亮的答案: