我遇到客户端服务器聊天程序的客户端实现问题,其中多个客户端连接。问题是,我遇到的是我应该如何发送(聊天消息到另一个客户端)和同时接收(来自另一个客户端的聊天消息)?发生的事情是我总是发送数据而从不阅读。我需要分叉并有一个读取而另一个发送吗?
这是相关代码
客户端
while(1) {
fd_set rfds, wfds;
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(serverSocket, &rfds);
FD_SET(serverSocket, &wfds);
if(select(serverSocket+1, &rfds, &wfds, NULL, NULL) < 0) {
perror("select");
exit(-1);
}
if (FD_ISSET(serverSocket, &rfds)) {
// we got data, read it
}
if (FD_ISSET(serverSocket, &wfds)) {
printf(">");
// read keyboard
sendLen = 0;
while ((cmd[sendLen] = getchar()) != '\n')
sendLen++;
cmd[sendLen] = '\0';
// send the data
}
}
答案 0 :(得分:0)
你应该把文件描述符0(标准输入)放在select中,然后读取chars并缓冲它们,当套接字可用于写入时,复制整个缓冲区。通过这种方式,您可以一直阻止读取标准输入。
添加
FD_SET(0, &rfds);
因此当用户输入内容时,select将返回。
您还必须使用fcntl将stdin设置为非阻塞。 然后每次select都会告诉你stdin上的数据是这样做的:
while(read(0,buffer+filled,1)>0) {}
如果缓冲区已满,请确保放入另一个条件退出循环。
然后当您可以在套接字上写入时,执行一个发送,其大小与缓冲区中的字节数一样,检查是否已写入所有字节,或者在缓冲区的开头移动剩余字节。
while(getchar())阻止你阻止你接收任何消息。