1

我正在寻找一种位于服务器和客户端之间的网关。所谓的网关应该是过滤客户端发送的一些数据包并转发其中的99%。

以下是我的问题:

  1. 客户端打开一个到网关的新套接字,我从网关打开一个到服务器的套接字并将其存储在一个列表中以供进一步使用。但是,在一种情况下,所有连接都来自同一个 IP,因此我在选择应该将数据包转发到服务器的套接字方面的选择有限。如何区分打开的套接字?

  2. 从以前的情况来看,我预计每秒大约有 500 个客户端发送一个数据包。性能方面,我应该使用多线程模型,还是坚持使用单线程应用程序?

  3. 仍然是一个性能问题:我必须在 C# 和 Python 之间进行选择。哪一个应该提供更好的性能?

4

1 回答 1

1

套接字地址是主机和端口,而不仅仅是主机。来自同一主机的不同连接将始终具有不同的端口。(我在这里假设 TCP,而不是 UDP。)

或者,更简单地说,您可以只比较文件描述符(或者,在 Python 中,套接字对象本身)而不是它们的对等地址。

同时,就性能而言,在大多数平台上,500 已接近您可以使用线程执行的操作的极限,但尚未超过极限,因此您可以这样做。但是我认为使用单线程反应器或带有小线程池的前摄器会更好。特别是如果您可以使用像 twisted 或 gevents 这样的现有框架来为您完成困难的部分。

至于语言,对于只是转发或过滤数据包,你的套接字多路复用的性能将是最重要的,所以使用 Python 没有问题。从任一语言中选择一个您喜欢的框架,然后使用该语言。

最后一些评论:您确实意识到 TCP 数据包不会与您的更高级别协议中的消息匹配,对吗?此外,如果将 Linux 或 BSD 机器设置为路由器,那么整个事情可能会更容易完成,效率更高,因此除了过滤器之外您无需编写任何内容。

于 2013-10-19T20:34:34.663 回答