【问题标题】:How can I make my server have open connections to multiple clients at the same time?如何让我的服务器同时打开与多个客户端的连接?
【发布时间】:2010-09-25 11:28:10
【问题描述】:

我想在 MacOS 机器上用 C 语言编写我自己的小型聊天服务器。现在我想连接到所有在线并打开连接的客户端,以便能够接收和发送消息。问题是我只知道如何一次打开一个套接字连接。所以到目前为止只有一个客户可以连接,这样聊天有点无聊;)

【问题讨论】:

    标签: c multithreading unix networking


    【解决方案1】:

    对于小型聊天服务器,最简单的解决方案可能是使用 select() 或 pselect()。

    看看优秀的Beej's Guide to Network Programming。在他的select() tutorial 中,他构建了一个小型聊天服务器。

    【讨论】:

      【解决方案2】:

      一种选择是使用pthreads 库的多线程。另一种选择是使用带有select(2) 调用的异步I/O。使用select(2),您打开一堆套接字,然后您可以轮询每个套接字以查看它是否有数据。如果它有数据,则读取它,否则继续下一个套接字。

      【讨论】:

      • 请注意,这两个选项并不相互排斥。您可以让一个线程监听和选择(),将作业分派给其他线程。
      【解决方案3】:

      由于 Mac OS X 是基于 FreeBSD 的,为了获得最佳和最高效的程序,您应该使用kqueue

      【讨论】:

        【解决方案4】:

        基本上你需要在你选择的端口上有一个监听套接字。一旦与侦听套接字建立连接,您需要在不同的端口号上打开一个新套接字并将客户端移交给这个新套接字。最好尝试使用预先编写的套接字库,因为在这里滚动您自己的套接字库将是一个复杂的过程。

        尝试在http://sourceforge.net 中搜索一些示例库。

        【讨论】:

        • 如果操作正确,您应该只需要一个端口号。在一个客户端连接到它之后,它仍然可以接受来自另一个客户端的另一个连接。
        • 是的,BCS - 这是使用我上面描述的方法实现的。
        • 连接未在监听套接字上建立。要建立连接,您需要在不同的套接字上接受()它。
        • Bork,你说的不是不清楚就是不正确。您写的内容对我来说仍然听起来像是您在说您需要为每个客户端接受不同端口号上的连接,我知道这是错误的。
        【解决方案5】:

        在一个程序中有多个连接的socket是没有问题的,你也不需要乱搞多线程。只需像以前一样保持打开连接即可。如果您的所有客户端都连接到同一个侦听器,请不要在 accept() 之后关闭侦听器 - 它会继续侦听更多传入连接。

        使用select()poll() 检查所有打开的套接字上的传入数据。不要忘记将侦听套接字包含在 select() 的描述符列表中 - 传入连接是 select() 检测到的事件。

        这真的很简单。没有火箭科学。

        【讨论】:

          【解决方案6】:

          你也可以使用 fork-on-accept,像这样:

          int listen_fd, new_fd;
          
          while ((new_fd = accept(listen_fd, NULL, NULL)) != -1) {
              if (fork())
                  close(new_fd);
              else
                  // handle client connection
          }
          

          【讨论】:

            【解决方案7】:

            看看select, pselectpoll

            我自己从来没有使用过它们,但我怀疑它们是为了你想做的事情。

            【讨论】:

              猜你喜欢
              • 2019-05-03
              • 1970-01-01
              • 2016-12-26
              • 2018-12-14
              • 1970-01-01
              • 2012-06-10
              • 2015-05-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多