捕获netcat发送的EOF

时间:2013-05-30 05:16:28

标签: c multithreading eof file-descriptor netcat

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

加EOF意味着ctrl + D对吗?

我写了以下代码段来做到这一点。但它不起作用。哪里出错了没有if段一切正常,除了删除一个client.with 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;

1 个答案:

答案 0 :(得分: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);