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.