服务器用C接受UDP和TCP连接(闭合)(Server in C accepting UDP and

2019-11-03 02:51发布

关闭。 这个问题是题外话。 它目前不接受的答案。 了解详情 。


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

我一直在寻找如何做到这一点,一切都指向select()函数,但我不知道如何使用它为这件事情。 谁能告诉我一个例子什么的接受UDP和TCP连接......我真的失去了那里。

非常感谢你...

Answer 1:

首先,打开每个服务器端套接字。 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++){}低级-数量的插座将不得不在服务的优点。



Answer 2:

使用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.


文章来源: Server in C accepting UDP and TCP connections [closed]