我的套接字服务器正在接收图像的GET请求,该图像为2MB,因此无法容纳在单个send()中,这是我在第一个send()中发送的内容:

std::stringstream wsss;
wsss << "HTTP/1.1 200 OK\r\n"
     << "Connection: keep-alive\r\n"
     << "Content-Type: image/x-icon\r\n"
     << "Content-Length: " << imageSize << "\r\n"
     << "\r\n";
wsss.write(imageData, imageSize);

此图像的每个后续send()是否都需要 header 字段?
我正在发送一个.ico图像,标题字段正确吗?

最佳答案


send()不能保证发送的字节数与您请求发送的字节数相同。它可以发送更少的字节。它的返回值告诉您它实际接受发送的字节数。因此,您应该循环调用send(),直到所有字节都被接受为止。如果将此循环移到其自己的可重用函数中,则还可以让您发送图标数据,而不必先将其复制到std::stringstream中。

尝试这样的事情:

int sendData(int sckt, void *data, int datalen)
{
    unsigned char *pdata = (unsigned char *) data;
    int numSent;

    // send() can send fewer bytes than requested,
    // so call it in a loop until the specified data
    // has been sent in full...

    while (datalen > 0) {
      numSent = send(sckt, pdata, datalen, 0);
      if (numSent == -1) return -1;
      pdata += numSent;
      datalen -= numSent;
    }

    return 0;
}
std::stringstream wsss;
wsss << "HTTP/1.1 200 OK\r\n"
     << "Connection: keep-alive\r\n"
     << "Content-Type: image/x-icon\r\n"
     << "Content-Length: " << imageSize << "\r\n"
     << "\r\n";

// do not append the image data to the stringstream...
//wsss.write(imageData, imageSize);

// send the headers first...
std::string headers = wsss.str();
int res = sendData(TheSocket, headers.c_str(), headers.size());
if (res == -1) ...

// now send the image data...
res = sendData(TheSocket, imageData, imageSize);
if (res == -1) ...



对同一图像的每个HTTP请求的每个HTTP响应都需要发送相同的 header 1。但是任何特定响应的每个send()都不需要重复标题,它们只需发送一次即可。只要继续发送尚未发送的字节即可。这就是为什么您必须注意send()的返回值,以便知道到目前为止已发送了多少字节以及仍然需要发送多少字节的原因。



一般来说,是的。

1:假设之一:

客户端发送了
  • 而不是Connection: close请求 header 的HTTP 1.1请求。
  • 客户端发送了带有Connection: keep-alive请求 header 的HTTP 1.0请求。

  • 否则,您的Connection: keep-alive header 将是错误的,您应该改为发送Connection: close header ,然后在发送完整响应后关闭套接字。

    关于c++ - 使用套接字的http服务器响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36850554/

    10-14 01:20