使用 C 语言编写的带有套接字的聊天服务器

标签 c sockets

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

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

最佳答案

处理多个客户端有两种方法:使用非阻塞 IO 和使用线程。对于诸如聊天之类的小事情,我宁愿使用非阻塞,因为我不必担心锁和线程。检查selectpoll功能。

主循环会执行如下操作:

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

关于使用 C 语言编写的带有套接字的聊天服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711667/

相关文章:

c++ - 如何读取/重定向 dos 命令的输出到 C/C++ 中的程序变量?

c - 为多线程 UDP 客户端执行 'close ()' 时套接字描述符未释放

Android DatagramSocket接收缓冲区大小

python - 为什么我的 Python 套接字网络服务器代码失败?

python - 为什么协议(protocol)必须以大端顺序发送到套接字函数而其余参数则不是?

c - 如何用 C 编写一个显示网页的程序?

c++ - 位移位及其逻辑运算符

c - 默认情况下,读取输入缓冲区中的哪个字符会使 scanf() 停止读取字符串?

c - 函数指针类型转换

iPhone Objective-C 套接字通信与 Socket.IO