关闭。 这个问题是题外话。 它目前不接受的答案。 了解详情 。
想要改善这个问题? 更新的问题,所以这是对话题的堆栈溢出。
我有个问题。 我一直在开发一个在C服务器,可以接受UDP和TCP客户端的连接。 所以我需要知道当一个连接的UDP,当它是一个TCP。 我已经开发了两种情况下分别和他们的工作正常。
我一直在寻找如何做到这一点,一切都指向select()函数,但我不知道如何使用它为这件事情。 谁能告诉我一个例子什么的接受UDP和TCP连接......我真的失去了那里。
非常感谢你...
关闭。 这个问题是题外话。 它目前不接受的答案。 了解详情 。
想要改善这个问题? 更新的问题,所以这是对话题的堆栈溢出。
我有个问题。 我一直在开发一个在C服务器,可以接受UDP和TCP客户端的连接。 所以我需要知道当一个连接的UDP,当它是一个TCP。 我已经开发了两种情况下分别和他们的工作正常。
我一直在寻找如何做到这一点,一切都指向select()函数,但我不知道如何使用它为这件事情。 谁能告诉我一个例子什么的接受UDP和TCP连接......我真的失去了那里。
非常感谢你...
首先,打开每个服务器端套接字。 BSD套接字需要您单独打开的TCP和UDP。 每个插座,因为我假设你已经知道,有一个文件描述符,这是一个小的整数。
一旦你有准备,创造类型的变量fdset
,这是一组文件描述符。 对于小型API fdset
类型包括:
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++){}
低级-数量的插座将不得不在服务的优点。
使用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.