C++ 具有多个客户端的服务器-使用select()写入

C++ 具有多个客户端的服务器-使用select()写入,c++,sockets,asynchronous,C++,Sockets,Asynchronous,我正在尝试编写一个一次处理多个客户端的服务器。显然我应该用select。我已经找到了很多教程,但没有一本是关于写作的 我知道我应该如何读入数据,但有什么。。在我的“循环”中处理回写客户机的适当方法 提前感谢。如果您有要发送到特定套接字的数据,则需要选择在该套接字的输出缓冲区中有可用空间时返回。告诉select执行此操作的方法与使用select just for read类似,不同之处在于,您还可以对第二个FD_集对象执行FD_集 int socks[10] = {... some client

我正在尝试编写一个一次处理多个客户端的服务器。显然我应该用select。我已经找到了很多教程,但没有一本是关于写作的

我知道我应该如何读入数据,但有什么。。在我的“循环”中处理回写客户机的适当方法


提前感谢。

如果您有要发送到特定套接字的数据,则需要选择在该套接字的输出缓冲区中有可用空间时返回。告诉select执行此操作的方法与使用select just for read类似,不同之处在于,您还可以对第二个FD_集对象执行FD_集

int socks[10] = {... some client sockets...}

while(1)
{
   fd_set readSet, writeSet;

   FD_ZERO(&readSet);
   FD_ZERO(&writeSet);

   int maxSock = -1;
   for (int i=0; i<10; i++)
   {
      FD_SET(socks[i], &readSet);
      if (socks[i] > maxSock) maxSock = socks[i];

      if (IHaveDataToSendToThisSocket(i))  // implement this function as appropriate to your program
      {
         FD_SET(socks[i], &writeSet);
         if (socks[i] > maxSock) maxSock = socks[i];
      }
   }

   int ret = select(maxSock+1, &readSet, &writeSet, NULL, NULL);
   if (ret < 0)
   {
      perror("select() failed");
      break;
   }

   // Do I/O for sockets that are ready
   for (int i=0; i<10; i++)
   {
      if (FD_ISSET(socks[i], &readSet))
      {
         // there is data to read on this socket, so call recv() on it
      }

      if (FD_ISSET(socks[i], &writeSet))
      {
         // this socket has space available to write data to, so call send() on it
      }
   }
}

事实上,我认为你想使用民意调查而不是选择,但这不是重点。要写入多个客户端,您需要确保不使用阻塞写入。您可能不需要检测特定的数据是否可以消化更多的数据,因此在编写时可能不需要使用poll或select。但是,如果您希望为以不同速度使用数据的客户端做好准备,您可能希望在客户端可以消化更多数据时接收通知


除此之外,poll或select可以通知读缓冲区中可用的数据或写缓冲区中可用的空间。用法基本相同,只是需要设置不同的标志。

非常感谢。我感到困惑的是,在阅读时,我所要做的就是等待数据并读入。对于写作,我如何判断是否有数据要写?我应该像一个全局向量一样存储它吗?我需要根据发送给我的内容向客户回信。当我收到信号告诉我可以再次写入时,我将如何访问读取的数据?是否有要写入套接字的数据取决于应用程序的操作。对于您的情况:如果您想让服务器通过在同一套接字上发送其他数据来响应接收到的数据,那么对于每个套接字,您都应该具有表示该套接字对话状态的数据结构。例如,如果您知道服务器的响应总是小于100字节,您可以为每个套接字设置一个100个字符的数组,一个整数表示该数组的偏移量设置为零,一个整数表示数组中的有效字节数也设置为零。然后,当您从套接字获取一些数据时,将响应字节放入套接字的数组中,并将该套接字的有效字节数整数设置为您放置的字节数。如果偏移整数小于有效字节数,则实现IHaveDataToSendToThisSocket以返回true。。。。最后,当FD_ISSETsocks[i]、&writeSet返回true时,您将从缓冲区发送尽可能多的剩余有效字节,并按发送的字节数递增偏移量。当偏移量值等于有效字节数值时,您就知道已经发送了整个响应。