c - IRC 程序不打印最后一条消息

标签 c linux websocket irc berkeley-sockets

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

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(),然后打印缓冲区。 但是当我运行它时,它几乎打印出了除一行之外的所有内容。 最后一行永远不会到达终端(它甚至会进入缓冲区吗?)。 我真的觉得我犯了一个菜鸟错误,但如果我能看到它就好了。 我该如何解决这个问题?

最佳答案

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

关于c - IRC 程序不打印最后一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374055/

相关文章:

c - 从给定数组中删除元素

node.js - Firestore 实时更新 NodeJS 中的连接

linux - 我如何检查进程在等待队列 linux 2.4 中时是否收到信号

java - 如何在Linux环境下为Tomcat实例设置java -Djava.library.path ="\home\path.SomeFile.so"?

django - 不断地从服务器向客户端发送数据

java - WebSocket 安全 Java 配置

c - C中模板内的预处理器关键字

c++ - 将字符缓冲区类型转换为来自套接字的结构

c - 仅使用 MinGW GCC 的 undefined reference

linux - 使用 csh 转义路径名中的变量