0

我在客户端实现多个客户端连接的客户端服务器聊天程序时遇到问题。问题是我遇到的是我应该如何同时发送(聊天消息到另一个客户端)和接收(来自另一个客户端的聊天消息)?发生的事情是我总是在发送数据而从不阅读。我是否需要分叉并读取另一个发送?

这是相关代码

客户端

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
  }
}
4

1 回答 1

1

您也应该将文件描述符 0(标准输入)放在 select 中,然后读取字符并缓冲它们,当套接字可用于写入时,将整个缓冲区复制到上面。这样,您就一直阻止读取标准输入。

添加

FD_SET(0, &rfds);

所以当用户输入某些内容时,select 也会返回。

您还必须使用 fcntl 将 stdin 设置为非阻塞。然后每次 select 都会告诉您 stdin 上有数据,请执行以下操作:

while(read(0,buffer+filled,1)>0) {}

如果缓冲区已满,请确保设置另一个条件以退出循环。

然后,当您可以在套接字上写入时,发送缓冲区中字节数的大小,检查是否所有字节都已写入,或者将剩余字节移动到缓冲区的开头。

while(getchar()) 阻止您接收任何消息。

于 2013-02-09T23:47:44.333 回答