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

时间:2014-03-27 14:55:46

标签: c sockets tcp

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

我一直在寻找如何做到这一点,并且一切都指向 select()函数,但我不知道如何使用它来解决这个问题。 任何人都可以告诉我一个接受udp和tcp连接的例子或事情......我真的迷失了。

非常感谢...

2 个答案:

答案 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.