【问题标题】:HTTP over TCP/IP?基于 TCP/IP 的 HTTP?
【发布时间】:2015-05-23 10:58:09
【问题描述】:

我正在尝试使用 CPP 和 SDL_Net 来制作 HTTP 客户端。我正在使用 char [] 缓冲区来发送和接收信息。

基本上,我在端口 80 上连接到下面提到的站点:

strcpy(buffer,"GET / HTTP/1.0 \n host: nullfakenothing.freeriderwebhosting.com \n \n");
SDLNet_TCP_Send(sd, (void *)buffer, strlen(buffer)+1);
SDLNet_TCP_Recv(sd, (void *)buffer, 200)>0

但我什么也拿不回来(程序卡在 Recv 上)。是我使用的协议有误,还是整个 TCP/HTML 系统有问题?

【问题讨论】:

  • 你的 HTTP 协议中充满了空格,应该有 \r\n 终结符。

标签: c++ http tcp sdl-net


【解决方案1】:

您的 HTTP 协议包含虚假空格,应该有 \r\n 终止符。这是未经测试的,但 HTTP 应该没问题。您可能需要添加其他标题。

char buffer[1024];

std::strcpy(buffer, "GET / HTTP/1.1\r\n");
std::strcat(buffer, "Host: nullfakenothing.freeriderwebhosting.com\r\n");
std::strcat(buffer, "\r\n");

SDLNet_TCP_Send(sd, (void*) buffer, strlen(buffer));
SDLNet_TCP_Recv(sd, (void*) buffer, sizeof(buffer));

【讨论】:

  • 发送请求类型是正确的,但读取响应却不是。它既不考虑超过 1024 字节的响应正文也不考虑分块编码,也不考虑服务器可能不会在响应完成后立即关闭连接,因为 keep-alive 处于活动状态(隐含在 HTTP/1.1 中)。跨度>
  • @SteffenUllrich 我没有对预期的返回数据做任何假设,只是复制了带有更正的 OPs 代码。它只是一个如何构建 HTTP 字符串的示例。我觉得编写具有完整错误检查和恢复功能的健壮通信代码有点超出了问题的范围。
【解决方案2】:

您发送的不是 HTTP,而是一些看起来有点像 HTTP 的东西,如果您不努力的话。请让自己对规范感到满意(如RFC2616),或者至少查看一些数据包转储或工作代码,以了解您需要做什么。由于很多事情都是错误的,因此指出具体的错误是没有意义的。

【讨论】:

  • 你能给我一些初学者的建议吗?那是你寄给我的一份很长的文件。谢谢!
  • 或者甚至有可能做出我想做的事情吗? (以 char[] 作为缓冲区)
  • @Thornkey 当然有可能,每个人都会这样做。
  • @Thornkey:“……或者至少看看一些数据包转储或工作代码,看看你需要做什么。”。那里有足够的工作代码,它们执行最少的 HTTP,并且很容易进行数据包捕获并查看它。虽然这些小事并不能让您了解全貌,但它们至少是一个开始。简单的 HTTP 事情可以用简单的方式完成,更高级的事情你需要了解更多的标准。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2014-08-04
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多