0

我正在实现一个多线程聊天服务器只是为了学习。我正在通过 netcat 连接客户端。我需要将客户端收到的消息广播给其他连接的客户端。那部分已经完成了。我陷入困境的是,我需要查找客户端是否发送了 EOF,然后从我的数据结构中删除该特定客户端并释放资源。我如何捕获从客户端发送的 EOF?

加上 EOF 意味着 ctrl+D 对吗?

我已经编写了以下代码段来做到这一点。但它不起作用。我哪里出错了。没有 if 段一切正常,除了删除一个客户端。使用 if 段似乎没有任何工作。

char buffer[MAXMSG];

    while (!quit)
    {


        read(connfd,buffer,MAXMSG);//read a message from this client
        if(bufffer==EOF){
            break;
        }
        broadcast_msg(buffer);
    //if EOF quit, otherwise broadcast it using broadcast_msg()
    }
    perror("Client disconnected");
    close(clients[(int)arg]->sd);
    free(clients[(int)arg]);
    checkemptyarray[(int)arg]=0;


return NULL;
4

1 回答 1

0

您需要检查 的返回值read()read()将返回成功时接收到的字节数,如果发送方没有更多数据要发送,则返回 0,如果发生错误,则返回 -1。

ssize_t result = read(connfd,buffer,MAXMSG);
if (result <= 0) {
    if (result < 0) {
        fprintf(stderr, "fd: %d, ", connfd);
        perror("read");
    }
    break;
}

看起来您希望buffer是一个以 NUL 结尾的字符串。您需要在代码中明确执行此操作,因为read()不会为您执行此操作,除非客户端将其作为其发送的数据的一部分包含在内:

buffer[result] = '\0';
broadcast_msg(buffer);
于 2013-05-30T05:47:49.607 回答