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

我有个问题。 我一直在用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变量。 一个用于保存套接字的完整列表,另一个用于测试读取,写入和exception。 用FD_ZERO()清除它们。
  • 使用FD_SET() ,将套接字添加到完整列表。
  • 在服务器循环中,使用FD_ISSET()FD_SET()将套接字列表从完整列表复制到读取列表(如果需要,还可以复制其他列表)。
  • 调用select() 。 它看起来像select(biggest_socket_fd, readSockets, writeSockets, exceptionSockets, timeout) 。 该调用将关闭未准备好的集合中的所有内容。
  • 循环遍历可能的套接字号,询问FD_ISSET(i,readSockets) 。 希望您跟踪哪个套接字正在使用什么协议,并可以将执行路由到accept()recvfrom()

请注意,为了避免饥饿,您需要确保内部循环跟踪它最后离开的位置。 如果你有一千个套接字并且你做了类似for (i=0;i<1000;i++){}事情for (i=0;i<1000;i++){} ,那么较低数量的套接字将具有服务优势。

使用下面的select()是man select的输出

 select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (eg, input possible). A file descriptor is considered ready if it is possible to perform the corresponding I/O operation (eg, read(2)) without blocking.