我在多个客户端连接的客户端服务器聊天程序的客户端实现上遇到问题。问题是我遇到的问题是我应该如何同时发送(聊天消息到另一个客户端)和接收(来自另一个客户端的聊天消息)?发生的情况是我总是发送数据但从不读取。我需要 fork 并让一个读取另一个发送吗?
这是相关代码
客户端
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(标准输入)放入 select 中,然后读取字符并缓冲它们,当套接字可用于写入时,将整个缓冲区复制到其上。这样你就可以一直阻止对标准输入的读取。
添加
FD_SET(0, &rfds);
因此当用户输入内容时 select 也会返回。
您还必须使用 fcntl 将 stdin 设置为非阻塞。 然后每次 select 都会告诉您 stdin 上有数据,请执行类似的操作:
while(read(0,buffer+filled,1)>0) {}
如果缓冲区已满,请确保设置另一个条件来退出循环。
然后,当您可以在套接字上写入时,请发送缓冲区中字节数的大小,检查是否已全部写入,或将剩余字节移动到缓冲区的开头。
while(getchar()) 会阻止您接收任何消息。
关于c套接字: recv and send data simultaneously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14792741/