STDIN和Incoming Socket上的select()

我正在尝试用C编写一个非常基本的聊天客户端,它使用套接字与另一台机器进行通信,而我在理解select时遇到了一些问题。 这是相关代码的快速片段。

while(1) { FD_ZERO(&readfds); FD_ZERO(&writefds); FD_SET(STDIN, &writefds); FD_SET(connectFD, &readfds); select(connectFD+1, &readfds, &writefds, NULL, NULL); if(FD_ISSET(connectFD, &readfds) != 0) { char buf[1024]; memset(buf, 0, sizeof(buf)); int lastBit; lastBit = recv(connectFD, buf, sizeof(buf), 0); if (lastBit > 0 && lastBit < 1024) { buf[lastBit] = '\0'; } else { close(connectFD); break; } printf("%s\n", buf); } else if (FD_ISSET(STDIN, &writefds)) { char msg[1024]; memset(msg, 0, sizeof(msg)); read(STDIN, msg, sizeof(msg)); } } } 

我想要做的是在收到消息后立即处理传入的消息,并且在我按下ENTER后只发送传出消息,但是我现在只处理ENTER而不是立即处理传入的数据。 我假设这是因为read是一个阻塞调用,当缓冲区中有任何数据时,select正在返回,而不仅仅是当有一个换行符时(读取时返回),但我不知道如何处理它。 有什么建议或提示让我走上正确的道路吗?

非常感谢你们!

 FD_SET(STDIN, &writefds); 

你想从STDIN读取所以你应该将STDIN添加到&readfds而不是&writefds 。 写入STDIN几乎总是可行的,因此您的代码有效地获得了可以写入STDIN的信息,但随后尝试从STDIN读取并挂起,直到实际读取成为可能。