【问题标题】:Chat Server with sockets in CC语言中带有套接字的聊天服务器
【发布时间】:2011-04-12 07:38:30
【问题描述】:

我正在尝试用 C 语言编写一个聊天服务器,它允许两个客户端之间使用 POSIX 套接字进行通信。我不确定我是否很好地掌握了这个概念,或者我应该如何设置客户端和服务器之间的通信协议。

我知道我需要一个到bind() 服务器端口的套接字,以便我可以接受来自客户端的传入连接,但是为了同时连接两个客户端,我需要为这些客户端中的每一个创建一个套接字当我accept() 或者我应该accept() 一个客户然后fork() 这样我可以让另一个客户接受?我还不担心并发聊天,它更像是一种乒乓方式,客户需要在send() 之后等待recv(),然后才能输入新消息。

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    您有两种处理多个客户端的方法:使用非阻塞 IO 和使用线程。对于像聊天这样的小事情,我宁愿使用非阻塞,因为我不必担心锁和线程。检查select 和poll 函数。

    主循环会做这样的事情:

    1. 用你想听的所有 fd 建立一个集合
    2. 等待select返回
    3. 使用FD_ISSET 检查您的主fd 上的传入连接(您传递给监听的那个)。然后您可以accept() 并将新的 fd 保存在您的连接列表中。
    4. 处理您感兴趣的 fd 的其余部分(使用 FD_ISSET 循环遍历列表以检查活动套接字)。

    【讨论】:

      【解决方案2】:

      当您accept 为该客户端返回一个新套接字时,您可以在该点生成一个线程来处理该客户端。在该线程中,您可以 recv 和 send 到新返回的套接字与您连接的客户端对话。

      您应该继续accept 使用之前的套接字。

      您定义的协议应该规定谁以什么顺序发送消息。

      【讨论】:

        【解决方案3】:

        当您一次使用多个套接字时(即在三向聊天中),处理套接字的最简单方法是在 select() 或 poll() 中阻塞,只要数据变为至少在其中一个插座上可用。然后,您可以使用 FD_ISSET() 来确定哪些套接字已准备好读取数据,并在它们上调用 recv()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-25
          • 2014-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多