2013-04-21 34 views
0

我对套接字编程完全陌生,我想在C中编写一个组合的TCP/UDP-Server套接字,但我不知道如何将这两者结合起来。因此,目前我确实知道TCP和UDP-Server/-Client是如何工作的,而且我已经为客户端编写了TCP和UDP编码。我也知道我必须以某种方式使用select()函数,但我不知道该怎么做。如何在单个服务器中结合使用TCP和UDP?

我必须读取两个数字,它们通过TCP-或UDP-客户端发送到TCP-/UDP-服务器,然后用这些数字进行一些计算,然后在服务器上打印结果。

有没有人知道该教程或示例代码或可以帮助我呢?

或至少对select()函数的一个很好的解释。

回答

4

基本上,使用事件循环。它的工作原理是这样的:

  1. 我现在需要做什么吗?如果是这样,那就做吧。

  2. 计算多久,直到我下一个需要做的事情。

  3. 调用select指定我愿意从读集中读取的所有套接字以及我试图在写集中写入的所有套接字。

  4. 如果我们发现任何可以读取的套接字,请阅读它们。

  5. 如果我们发现任何可以写入的套接字,请尝试写入它们。如果我们写了所有需要写入的内容,请将它们从写入集中删除。

  6. 转到步骤1

一般来说,写一个插座,你按照这个逻辑:

  1. 难道我已经试图写入此套接字?如果是这样,只需将其添加到队列中,我们就完成了。

  2. 尝试将数据写入套接字。如果我们发送了所有内容,我们就完成了。

  3. 保存队列中的剩余物并将此套接字添加到我们的写入集中。

三件事情要记住:

  1. 您必须设置所有插座无阻塞。

  2. 确保你把它们传递给select之前因为select修改它们复制你的文件描述符集。

  3. 对于TCP连接,您可能需要您自己的写入队列。

0

这个想法是在你的服务器内部混合一个TCP部分和一个UDP部分。

然后您复用输入。您可以使用旧的select(2)复用呼叫,但它有限制(谷歌为C10K problem)。使用poll(2) 多路复用呼叫是优选的。

您可能需要使用一些事件循环的库,例如libev(使用selectpoll或者一些发烧友机制,例如epoll)。顺便说一下,图形化工具包(例如GTK或Qt)也提供它们自己的偶数循环机制。

阅读一些很好的Linux编程书籍,如Advanced Linux Programming 书(可以在线获得),它有关于多路复用系统调用和事件循环的好章节。这些过于复杂,不能在几分钟内解答得很好。书籍更好地解释它们。

0

1)简单的写一个tcp/udp服务器的代码,当接收到这个消息时,就把它打印出来。 2)将打印代码替换为process_message()函数。

然后,您已成功地将TCP和UDP服务器组合到相同的过程。

小心你的处理程序,它应该应付相互执行。