c socket:同时recv和发送数据

时间:2013-02-09 23:18:28

标签: c sockets tcp 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
  }
}

1 个答案:

答案 0 :(得分:0)

你应该把文件描述符0(标准输入)放在select中,然后读取chars并缓冲它们,当套接字可用于写入时,复制整个缓冲区。通过这种方式,您可以一直阻止读取标准输入。

添加

FD_SET(0, &rfds);

因此当用户输入内容时,select将返回。

您还必须使用fcntl将stdin设置为非阻塞。 然后每次select都会告诉你stdin上的数据是这样做的:

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

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

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

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