gpt4 book ai didi

c - C 中的服务器接受 UDP 和 TCP 连接

转载 作者:行者123 更新时间:2023-11-30 15:36:04 25 4
gpt4 key购买 nike

我有一个问题。我一直在用 C 语言开发一个服务器,它可以接受 UDP 和 TCP 客户端连接。所以我需要知道什么时候连接是UDP,什么时候是TCP。我已经分别开发了这两个案例,并且它们工作正常。

我一直在寻找如何做到这一点,所有内容都指向 select() 函数,但我不知道如何使用它来解决这个问题。任何人都可以向我展示一个接受 udp 和 tcp 连接的示例或内容...我真的迷失了方向。

非常感谢...

最佳答案

首先,打开每个服务器端套接字。 BSD 套接字要求您分别打开 TCP 和 UDP。我假设您已经知道,每个套接字都有一个文件描述符,它是一个小整数。

准备好后,创建一个 fdset 类型的变量,这是一组文件描述符。 fdset 的迷你 API类型包括:

  • FD_ZERO(set) ,这会清除集合。
  • FD_SET(socket,set) ,它将套接字的描述符添加到集合中(转动整数上的位)。
  • FD_CLR(socket,set) ,这会从集合中删除套接字。
  • FD_ISSET(socket,set) ,如果套接字在集合中,则返回非零。

所以,你要做的是:

  • 创建四个 fdset变量。一个用于保存完整的套接字列表,三个暂存空间用于测试读取、写入和异常。使用 FD_ZERO() 清除它们.
  • FD_SET() ,将您的套接字添加到完整列表中。
  • 在您的服务器循环中,使用 FD_ISSET()FD_SET()将套接字列表从完整列表复制到读取列表(以及其他列表,如果需要的话)。
  • 调用 select() 。它看起来像 select(biggest_socket_fd, readSockets, writeSockets, exceptionSockets, timeout) 。该调用将关闭集合中未准备就绪的所有内容。
  • 循环遍历可能的套接字号,询问 FD_ISSET(i,readSockets) 。希望您能够跟踪哪个套接字正在使用什么协议(protocol),并且可以将执行路由到 accept()recvfrom() .

请注意,为了避免饥饿,您需要确保内部循环跟踪它上次停止的位置。如果你有一千个套接字并且你执行类似 for (i=0;i<1000;i++){} 的操作,较少数量的套接字将在服务中具有优势。

关于c - C 中的服务器接受 UDP 和 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com