【问题标题】:Sockets packet forwarding套接字数据包转发
【发布时间】:2013-10-20 05:16:55
【问题描述】:

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

这是我的问题:

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

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

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

【问题讨论】:

    标签: c# python sockets


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 客户端的身份验证是通过服务器上的套接字描述符完成的,没有更高级别的协议。在 1% 的数据包中,我必须进行一些数据库检查,并且我不希望流程中出现任何重大延迟。
    • @your_average_programmer:怎么可能没有更高级别的协议?如果数据没有任何意义,您使用套接字做什么?
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2018-05-23
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多