我有问题。我一直在用C开发一个可以接受UDP和TCP客户端连接的服务器。所以我需要知道什么时候连接是UDP,什么时候是TCP。 我已经分别开发了这两种情况,并且它们可以正常工作。
我一直在寻找如何做到这一点,并且一切都指向 select()函数,但我不知道如何使用它来解决这个问题。 任何人都可以告诉我一个接受udp和tcp连接的例子或事情......我真的迷失了。
非常感谢...
答案 0 :(得分:1)
首先,打开每个服务器端套接字。 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)
。希望您跟踪哪个套接字正在使用什么协议,并可以将执行路由到accept()
或recvfrom()
。请注意,为了避免饥饿,您需要确保内循环跟踪最后离开的位置。如果你有一千个套接字并且你做了类似for (i=0;i<1000;i++){}
的事情,那么较低数量的套接字将具有服务优势。
答案 1 :(得分:0)
使用下面的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 (e.g., input possible). A file
descriptor is considered ready if it is possible to perform the corresponding I/O operation (e.g.,
read(2)) without blocking.