【问题标题】:IRC program not printing last messageIRC 程序不打印最后一条消息
【发布时间】:2014-10-15 03:34:23
【问题描述】:

我有一个函数可以从 IRC 服务器接收 512 字节块的数据并将其打印到终端窗口,它是这样的:

int mainLoop(redchan_t *redchan)
{
    int socketDescriptor = redchan->socketDescriptor, i, bytesReceived;
    char workingBuffer[RECVBUFF] = {[0 ... RECVBUFF - 2] = '0', '\0'};

    puts("Recieving data...");

    do
    {
        if ((bytesReceived = recv(
                socketDescriptor,
                workingBuffer,
                RECVBUFF,
                0)) == 0)
            exit(EXIT_FAILURE);

        for (i = 0; i < bytesReceived; ++i)
            printf("%c", workingBuffer[i]);
    }
    while(1);

    return 0;
}

但我想让它更加正交,所以我取出了对 recv 的调用并将其放入它自己的例程中,如下所示:

int redchanRecv(redchan_t *redchan, int size, char *buffer)
{
    int totalBytes = 0, bytesReceived;

    while (totalBytes < size)
    {
        if ((bytesReceived = recv(
                        redchan->socketDescriptor,
                        buffer + totalBytes,
                        size - totalBytes,
                        0)) <= 0)
            cleanup_redchan(redchan, serverInfo);
        totalBytes += bytesReceived;
    }
    return 0;
}

然后,我会在主循环的每次迭代中调用 redchanRecv(),然后打印缓冲区。 但是当我运行它时,它会打印出几乎所有内容,除了一行。 最后一行永远不会到达终端(它甚至会进入缓冲区吗?)。 我真的觉得我犯了一个菜鸟的错误,但如果我能看到它,那就见鬼了。 我该如何解决这个问题?

【问题讨论】:

    标签: c linux websocket irc berkeley-sockets


    【解决方案1】:

    stdout 在您的系统中默认为行缓冲,添加一个fflush(stdout) 调用以打印您的最后一行。

    【讨论】:

    • 如果我错了,请纠正我,但我认为我需要的所有换行符都来自服务器,因为 RFC1459 声明所有 IRC 消息都以 \r\n 终止。我确实尝试过 fflush 但没有骰子。
    • @Red 但是你确定你(你的程序)收到了所有的新行吗?
    • 它应该是(好吧,至少它确实如此),但是当我改变它时,我已经去搞砸了。
    猜你喜欢
    • 2016-07-03
    • 2022-10-18
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2013-07-21
    • 2019-07-04
    相关资源
    最近更新 更多