【问题标题】:C Sockets recv: connection reset by peerC Sockets recv:对等方重置连接
【发布时间】:2013-07-26 16:20:16
【问题描述】:

我正在尝试使用套接字来获取一个小型 JSON 测试文件,该文件托管在我的网站 (http://a-cstudios.com/text.json) 上。当我这样做时

long numbytes;
char *request = malloc(sizeof(char) * 300);
sprintf(request, "GET %s \r\nHOST:%s \r\n\r\n", restOfURL, baseServer);
// restOfURL = "/text.json" baseServer = "www.a-cstudios.com"
send(sockfd, request, strlen(request) + 1, 0);
char buf[1024];
if ((numbytes = recv(sockfd, buf, 1024-1, 0)) == -1) {
    perror("recv");

}

我收到recv: connection reset by peer。但是如果我使用相同的代码,其中restOfURL/index.html 并且baseServerwww.google.com,这工作正常,buf 将包含index.html 的文本。为什么这不适用于我网站上的文件?

【问题讨论】:

  • GET 请求不是也需要HTTP/1.1(或1.0)结尾吗?
  • 您正在发送无效的 HTTP 并且主机正在关闭连接。你把 HTTP/1.1 放在正确的地方了吗?为什么使用 malloc() 而不是在堆栈上分配数组?
  • @EJP 和 Kninnug 感谢您指出这一点,这确实解决了问题。如果你们中的一个人将其作为答案发布,我会接受。
  • @ChrisLoonam BTW,sizeof(char) 每个定义 == 1。

标签: c sockets


【解决方案1】:

由于您没有发布完整的代码,我将对其进行尝试并做出假设:

您使用restOfURLbaseServer 填充"GET %s \r\nHOST:%s \r\n\r\n" 的格式字符串

但是,在sprintf 调用期间,restOfURL 未初始化,因此您将垃圾数据推送到第一个 %s

要么发布更多代码,要么确保初始化 resOfURL

【讨论】:

  • restOfURL 肯定已初始化。我认为发布其他代码是没有意义的,因为它确实对错误没有影响。
  • @ChrisLoonam,另一个建议是确保 send() 正在发送全部数量,它返回它成功发送的字节数。我没有看到任何明显缺失或不正确的内容。
  • 如果 'restOfURL' 未初始化,它将为 null 并且会产生 SIGSEGV,而不是这种行为。 send() 以阻塞模式发送全部金额。你似乎只是在猜测。
【解决方案2】:

正如@Kninnug 所指出的,您需要在请求的第一行末尾添加 HTTP 版本字段(例如,HTTP/1.1)。我只想指出,您在发送请求时不应包含空终止符。即把send语句改成

send(sockfd, request, strlen(request), 0);

此外,最好始终使用snprintf 而不是sprintf 来防止缓冲区溢出,但为了真正安全,您仍然需要检查截断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多