C 语言客户端/服务器程序

标签 c sockets client-server

我是 C 套接字编程新手。我知道如何将 TCP 和 UDP 编写为不同的程序。 但只有一台服务器应该处理这两个客户端。

谁能告诉我如何编写一个同时处理 TCP 和 UDP 客户端的服务器?

最佳答案

您无法使用 1 个服务器套接字监听 TCP 和 UDP 客户端。不过,您可以创建 2 个服务器套接字(一个 TCP 服务器和一个 UDP 服务器)。请注意,为两者提供一台服务器甚至没有意义:UDP 是无连接的,因此当您尝试在服务器套接字上执行 accept 时,就会出现第一个问题(因为它是一个假设的混合版本,什么是)应该接受吗?)。

无论如何,我假设您希望在同一个事件循环中使用两个服务器(如果您不知道它是什么,那么将其视为您的主要功能就足够了)。由于 C 套接字默认情况下是阻塞的,因此您无法立即运行两个服务器。

您可以使用选择(Google)。如果你不知道它是什么,我建议先用 Python 尝试一下。在 Python 中,它相当简单,它会让您对这个概念有一些了解。基本上你要做的是:创建多个服务器套接字,而不是在这些套接字之间“切换”,查看哪些套接字已读取事件(无论是新连接还是消息),然后处理这些事件。

我可以推荐libuv 。它是一个最初为 Node.js 构建的 C 库。在 libuv 之前,他们使用依赖于平台的事件循环实现 (libev)。 Libuv 最初是为了创建一个用于非阻塞 IO(TCP、UDP、fs 等)的多平台库。然而,即使您不想编写多平台代码,它也提供了一个很棒的 AP​​I 来创建服务器套接字并在同一事件循环中监听多个套接字。

关于C 语言客户端/服务器程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406429/

相关文章:

c - 学习C编程基础知识,可以消除我对数组和字符串的疑惑

java - Java 7 异步 NIO2 服务器上的连接被拒绝

c - 如何创建自己的数据包以通过 UDP 发送?

python - 如何判断python中的连接是否已死

c - 处理多个客户端时,pthread_join 无法 fork TCP 服务器

c# - 使用 Console.Write 字符串格式化

c - 未显式初始化的全局 union 变量的哪个成员将隐式初始化为 0?

c - GtkButton 发出 GDK_KEY_PRESS

c - C结构序列化中的结构填充影响(保存到文件)

c - 运行客户端时为 "address not supported by protocol"