Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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/C++;Posix BSD套接字-HTTP请求始终返回状态400 我正在学习在OC X机上使用C和C++的本机套接字。从以前的项目,我已经建立了一个非常简单的网页在。这个网页几乎什么都不做了,所以我不介意分享真实的URL_C_Sockets_Http - Fatal编程技术网

C/C++;Posix BSD套接字-HTTP请求始终返回状态400 我正在学习在OC X机上使用C和C++的本机套接字。从以前的项目,我已经建立了一个非常简单的网页在。这个网页几乎什么都不做了,所以我不介意分享真实的URL

C/C++;Posix BSD套接字-HTTP请求始终返回状态400 我正在学习在OC X机上使用C和C++的本机套接字。从以前的项目,我已经建立了一个非常简单的网页在。这个网页几乎什么都不做了,所以我不介意分享真实的URL,c,sockets,http,C,Sockets,Http,基本上,我的问题是所有HTTP请求都返回400个错误请求。我知道我用于此练习的网页已启动并正在运行,我可以通过浏览器访问它。这让我相信,我没有正确地实现HTTP协议,但我不知道哪里出了问题 下面是我通过套接字请求此页面时使用的所有代码 #include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <netdb.h> #include <string.h>

基本上,我的问题是所有HTTP请求都返回400个错误请求。我知道我用于此练习的网页已启动并正在运行,我可以通过浏览器访问它。这让我相信,我没有正确地实现HTTP协议,但我不知道哪里出了问题

下面是我通过套接字请求此页面时使用的所有代码

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>

int main(int argc, const char * argv[]) {

//  create the request
const char * request = "GET /index.html HTTP/1.1\nAccept: */*\n\n";
size_t length = strlen(request);
printf("request:\n\n%s", request);

//  get the destination address
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
struct addrinfo * address;
getaddrinfo("castifyreceiver.com", "http", &hints, &address);

//  create a socket
int sfd = socket(address->ai_family, address->ai_socktype, address->ai_protocol);
int result = connect(sfd, address->ai_addr, address->ai_addrlen);
if (result != 0) {
    printf("connection failed: %i\n", result);
    freeaddrinfo(address);
    close(sfd);
    return 0;
} else {
    printf("connected\n");
}

//  write to socket
ssize_t written = write(sfd, request, length);
printf("wrote %lu of %lu expected\n", written, length);

//  read from socket and cleanup
char response[4096];
ssize_t readed = read(sfd, response, 4096);
printf("read %lu of 4096 possible\n", readed);
close(sfd);
freeaddrinfo(address);

//  display response message
response[readed] = '\0';
printf("response:\n\n%s\n", response);

return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]{
//创建请求
const char*request=“GET/index.html HTTP/1.1\n接受:*/*\n\n”;
尺寸长度=strlen(请求);
printf(“请求:\n\n%s”,请求);
//获取目标地址
结构addrinfo提示;
memset(&hints,0,sizeof(hints));
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_流;
hits.ai_flags=ai_被动;
结构addrinfo*地址;
getaddrinfo(“castifyreceiver.com”、“http”、“提示”和“地址”);
//创建一个套接字
int sfd=socket(地址->ai_系列,地址->ai_socktype,地址->ai_协议);
int result=connect(sfd,地址->人工智能地址,地址->人工智能地址);
如果(结果!=0){
printf(“连接失败:%i\n”,结果);
freeaddrinfo(地址);
关闭(sfd);
返回0;
}否则{
printf(“已连接的”);
}
//写入套接字
ssize_t write=写入(sfd、请求、长度);
printf(“已写入%lu,预期为%lu\n”,已写入,长度);
//从套接字读取并清除
字符响应[4096];
ssize_t readed=读取(sfd,响应,4096);
printf(“读取4096可能的%lu\n”,已读取);
关闭(sfd);
freeaddrinfo(地址);
//显示响应消息
响应[readed]='\0';
printf(“响应:\n\n%s\n”,响应);
返回0;
}
该程序始终输出类似于以下内容的内容:

request:

GET /index.html HTTP/1.1
Accept: */*

connected
wrote 38 of 38 expected
read 590 of 4096 possible
response:

HTTP/1.1 400 Bad Request
Date: Thu, 05 Nov 2015 18:24:08 GMT
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips    mod_bwlimited/1.4
Content-Length: 357
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>
<hr>
<address>Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 Server at 108.167.131.50 Port 80</address>
</body></html>
请求:
GET/index.html HTTP/1.1
接受:*/*
有联系的
38人中有38人预计
可能的话,请阅读4096页中的590页
答复:
HTTP/1.1400错误请求
日期:2015年11月5日星期四18:24:08 GMT
服务器:Apache/2.2.31(Unix)mod_ssl/2.2.31 OpenSSL/1.0.1e-fips mod_bwlimited/1.4
内容长度:357
连接:关闭
内容类型:text/html;字符集=iso-8859-1
400错误请求
错误的请求
您的浏览器发送了此服务器无法理解的请求


我仍然找不到我做错了什么。感谢您的帮助。

两件事:

  • 您必须发送
    主机
    标题,参见RFC 2616 p。129:

    客户端必须在所有HTTP/1.1请求中包含主机头字段 信息。如果请求的URI不包括Internet主机 要请求的服务的名称,则必须输入主机标头字段 将以空值给出

  • 使用
    \r\n
    在HTTP中终止您的行,而不仅仅是
    \n
    ,参见RFC 2616 p。16:

    HTTP/1.1将序列CR LF定义为所有 除实体实体之外的协议要素(参见附录19.3 容错应用程序)。图元主体内的线端点标记 如第3.7节所述,由其相关媒体类型定义

如果你改变这一点,它应该会起作用