1

我需要制作一个如下图所示的桥梁。它只是一个 UDP 服务器,它接收来自客户端的数据包,并将其转发到另一台服务器。该图将很好地理解该场景。

+--------+sendto()  recvfrom()+-----------+                    
| client |------------------->|           |                         +-------------+  
|        |        1           | bridge    |sendto()      recvfrom() |             |
|        |                    |           |------------------------>|    duty     |
|        |                    |           |           2             |   server    | 
|        |                    |           |recvfrom()      sendto() | processing  |   
|        |                    |           |<------------------------|             |
|        |recvfrom()  sendto()|           |            3            |             |
|        |<-------------------|           |                         +-------------+  
+--------+         4          +-----------+                     

这里发送和接收数据的函数写在设备的侧面。通信过程由箭头符号下的数字 1、2、3 和 4 标识。我试图以一种可以代表时间线的方式绘制图形:从上到下。

现在进入正题。当我只有一个客户需要管理时,这很容易做到。但是让我们假设客户数量可以很多。假设客户端是使用拨号器连接到互联网的电话,而服务器是运行 Asterisk/Freeswitch 或类似设备的 SIP 服务器。在这种情况下,可能会出现许多客户端。我不想将桥接服务器用作代理服务器(运行 kamailio 和 rtpproxy),以便通信高效。

我知道 Asterisk 或 SIP 服务器可以管理 udp 会话。但怎么能过桥。由于 udp 没有会话,我该如何完成第四步。如何识别值班服务器对客户的回复?应该编写什么类型的软件(当然是为了效率而轻量级,我自己需要编写)来处理会话。如果有人可以通过 udp 给我一个会话管理的想法,那将对我非常有帮助。我搜索了很多,但没有找到任何合适的答案。

提前致谢。

4

1 回答 1

1

这是我在 TCP/UDP 流量的通用代理实现中使用的算法:

程序模块:

一个连接创建者和多个代理工作者

它们被实现为自包含线程。

流动:

Creator 模块负责接受和处理新的连接。它通知并将初始数据传递给工作人员,该工作人员将从该点开始处理该连接的所有 I/O,同时它将打开到另一端的连接(也可以在工作人员中完成)。

工作人员将获得连接并在其生命周期内对其负责。

一些技术要点:

UDP 连接由 IP 和 PORT(SRC 和 DEST)确定。

Creator 可能会等待来自所有来源的消息,而 worker 可能会等待来自特定来源的消息(通过绑定 UDP 套接字)。

为了性能,worker 应该适合系统拥有的内核数量,并允许每个内核处理异步套接字。另外,如果一个worker处理多个socket,当Creator/Boss分配新的连接时,需要放置一个算法来在worker之间进行负载均衡。

于 2012-04-18T16:50:08.060 回答