【问题标题】:Winsockets - Strange characters before and/or after the bodyWinsockets - 身体之前和/或之后的奇怪字符
【发布时间】:2018-06-18 15:54:58
【问题描述】:

我在我的 C++ 项目中使用了一个简单的 winsocket 代码片段,试图从共享主机 (host-ed.me) 上的文件中提取数据。我的winsocket代码如下:

void write(string file, string text) {
   ofstream os;
   os.open(file, ofstream::app);
   text += "\n";
   os.write(text.c_str(), text.size());
   os.close();
}

bool request() {
   WSADATA wsa;
   SOCKET s;
   struct sockaddr_in server;
   char server_reply[4096];
   int recv_size;
   // initialize winsockets
   if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) {
      write("log.txt", "winsockets initialization - error!");
      return false;
   }
   // open a socket
   if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {
      write("log.txt", "socket opening - error!");
      return false;
   }
   // connect to server
   server.sin_addr.s_addr = inet_addr("46.105.118.169");
   server.sin_family = AF_INET;
   server.sin_port = htons( 80 );
   if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0) {
      write("log.txt", "server connection - error!");
      return false;
   }
   // send data
   string request;
   request += "GET /index.php HTTP/1.1\r\n";
   request += "Host: machines.host-ed.me\r\n";
   request += "Connection: close\r\n";
   request += "\r\n";
   if (send(s, request.c_str(), request.size(), 0) < 0) {
      write("log.txt", "data send - error!");
      return false;
   }
   // receive reply
   if ((recv_size = recv(s, server_reply, 4096, 0)) == SOCKET_ERROR) {
      write("log.txt", "data receive - error!");
      return false;
   }
   server_reply[recv_size] = '\0';
   write("log.txt", string(server_reply));   // gives strange characters
   // close socket
   closesocket(s);
   WSACleanup();
   return true;
}

我说的奇怪字符是什么意思,看看这个回复:

HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 15:02:01 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

9
hello PHP
0

我指的是内容前后的那些90。我在服务器中的 PHP 代码如下所示:

<?php echo "hello PHP"; ?>

我不知道这是否是服务器问题,但如果将文本更改为“hello2 PHP”,那么它会返回到我的 winsock 代码中,如下所示:

a
hello2 PHP

我一无所知

【问题讨论】:

    标签: php c++ winsock2


    【解决方案1】:

    您看到的是 HTTP 1.1 chunked transfer encoding,由服务器在标头中指定

    Transfer-Encoding: chunked
    

    每个块以它嵌入的数据的八位字节数开始,以 ASCII 中的十六进制数字表示,后跟可选参数(块扩展)和终止 CRLF 序列,然后是块数据。该块由 CRLF 终止。

    【讨论】:

    • thanx,所以这些数字只是我得到的大小。它可以更改请求标头(winsock)所以我没有得到分块编码吗?或者如果php上有一个标题?
    • 是的,发送HTTP/1.0 请求而不是HTTP/1.1
    • @user6096479 根据this old answer,如果您声称符合 HTTP/1.1,则必须支持分块编码。
    • 谢谢你们的链接!就是这样。我会在允许的时候接受
    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2017-12-04
    • 2011-05-06
    • 2023-03-12
    相关资源
    最近更新 更多