C++ 使用套接字编程的奇怪HTTP响应

C++ 使用套接字编程的奇怪HTTP响应,c++,sockets,http,C++,Sockets,Http,我一直在尝试使用套接字编程实现持久HTTP。一旦建立了连接,我就开始按顺序请求每个对象。但是一旦我获得了第一个对象,我就开始得到第二个对象的奇怪HTTP响应(在头中) sprintf(临时缓冲区,“头%s HTTP/1.1\r\n”,objURL); strcpy(请求缓冲区、临时缓冲区); sprintf(临时缓冲区,“主机:%s\r\n”,主机); strcat(请求缓冲区、临时缓冲区); sprintf(临时缓冲区“\r\n”); strcat(请求缓冲区、临时缓冲区); if(发送(so

我一直在尝试使用套接字编程实现持久HTTP。一旦建立了连接,我就开始按顺序请求每个对象。但是一旦我获得了第一个对象,我就开始得到第二个对象的奇怪HTTP响应(在头中)

sprintf(临时缓冲区,“头%s HTTP/1.1\r\n”,objURL);
strcpy(请求缓冲区、临时缓冲区);
sprintf(临时缓冲区,“主机:%s\r\n”,主机);
strcat(请求缓冲区、临时缓冲区);
sprintf(临时缓冲区“\r\n”);
strcat(请求缓冲区、临时缓冲区);
if(发送(sockId,请求缓冲区,strlen(请求缓冲区),0)<0)
{
printf(“发送失败\n”);
返回false;
}
字符接收缓冲区[len];
int isRecvd=recv(sockId,receiveBuffer,sizeof(receiveBuffer),0);
如果(isRecvd<0)
{

cout也许您没有显示完整的代码,但是否可能您没有完全读取第一个响应?服务器将为您提供一个内容长度或一个分块响应,您需要计算在该响应完成之前要读取多少。如果您确实在读取固定数量的字节
len
,那么t您认为您的第二个响应可能只是第一个响应中的更多内容。希望这会有所帮助。

为什么您要对HTTP请求使用带有
char[]
缓冲区的C样式字符串处理,而不是使用
std::string
?和
char receiveBuffer[len]不有效C++,除非<代码> LeN/COD>是编译时常量,否则它是不可移植的扩展。如果需要动态大小数组,请使用<代码> STD::vector < /代码>。无论哪种方式,使用<代码> LeN<代码>代替<代码> sieOf(接收缓冲区)< /C> >调用<代码> ReVo()
,但无论如何,您都没有正确读取服务器的响应,甚至没有关闭。我建议您阅读详细信息。另外,
sockId
连接到哪个端口?80(HTTP),443(HTTPS),或其他?您好,我使用80作为端口号。我认为问题在于我使用此代码请求pdf文件。pdf中可能有一些无法显示的字符。其他文件工作正常。当请求任何文件时,无论是否为二进制文件,您都会在文件数据之前收到服务器的文本响应头,但您显示的输出是无效的没有显示。您没有显示您实际收到的所有内容吗?
sprintf(temp_buffer, "HEAD %s HTTP/1.1\r\n", objURL);
strcpy(req_buffer, temp_buffer);
sprintf(temp_buffer, "HOST: %s\r\n", host);
strcat(req_buffer, temp_buffer);
sprintf(temp_buffer, "\r\n");
strcat(req_buffer, temp_buffer);  

if (send(sockId, req_buffer, strlen(req_buffer), 0) < 0) 
{
    printf("send failed\n");
    return false;
}

char receiveBuffer[len];

int isRecvd = recv(sockId, receiveBuffer, sizeof(receiveBuffer), 0);

if (isRecvd < 0 ) 
{
    cout << "Cant recieve !!" << endl;
    return false;
}

//Now to extract info from the Response
cout << isRecvd<<"\n";
receiveBuffer[isRecvd] = '\0';
string response = receiveBuffer ;
cout<<"the response is "<<endl;
cout << response <<endl;