【问题标题】:Buffer is not reading in string properly缓冲区未正确读取字符串
【发布时间】:2014-05-22 05:21:26
【问题描述】:
void download(char *file)
{
    int size = getsize(file);
    printf("Got size %d\n", size);
    sprintf(buff, "GET %s\n", file);
    send(sockfd, buff, strlen(buff), 0);
    rsize = recv(sockfd, buff, 1000, 0);
    sscanf(buff, "%d", &resultcode);
    printf("%s",  buff);
    if (strcmp(buff, "+OK\n") != 0)
    {
        printf("download failed\n");
    }
    FILE *dlfile = NULL;
    if ((dlfile = fopen(file, "r")) != NULL)
    {
        dlfile = fopen(file, "w");
        do
        {
            rsize = recv(sockfd, buff, 1000, 0);
            for (int i = 0; i < rsize; i++)
            {
                fprintf(dlfile, "%c", buff[i]);
            }
            size = size - rsize;
        } while (size != 0);
    }
    fclose(dlfile);
}

我正在尝试让下载功能打印出用户键入的文件内容,然后将其保存到他们的当前目录。我做了一个调试行printf("%s", buff);,它打印出+OK\n(filename)。它应该打印出+OK\n。它还会打印出download failed,然后是segmentation fault 错误。我错过了什么?

【问题讨论】:

  • 您是否将+OK\n(filename) 与“+OK\n”进行比较?他们是不平等的。你在找strstr吗?
  • 当您阅读它时,您假设该套接字上的所有内容都是“OK\n”。我认为发件人在他们抛出响应后立即填充它。尽管世上一切美好,请检查您的函数调用返回值。。只有鲁莽的在Henry Spencer's Sixth Commandment for C Programmers的脸上吐口水

标签: c file sockets networking buffer


【解决方案1】:

这里发生了几件事。首先,recv 和 send 基本上对字节数组进行操作,因此它们不知道行尾等。另请注意,recv 不能保证填充缓冲区 - 它通常会读取可用的内容,直到缓冲区的限制。对于针对“+OK\n”的strcmp,您可以使用长度为4 的strncmp,但这有点直接(见下文)。接下来请注意,buff 字符串不是由 recv 终止的 null,因此您的 printf 很容易崩溃。

当您进入循环时,缓冲区中已经包含了其余 I/O 的一部分。可能包括文件的其他字段或部分。你也需要处理它。我不清楚 getsize 是做什么的——但使用那个大小来驱动你的循环似乎是错误的。此外,您对 fprintf 值的循环可以通过调用 fwrite 来替换。

总体而言,您需要正确缓冲然后解析传入的数据流。如果你想自己做,你可以查看 fdopen 来获取一个 FILE 对象。

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 2021-03-04
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多