我正在实施一个多线程聊天服务器,只是为了学习。我通过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;
答案 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);