TCPListener用于多个端口

时间:2012-08-07 10:41:15

标签: .net multithreading sockets tcplistener

我需要针对以下问题提供一些指导(工作示例会很精彩)。我是套接字编程的新手,虽然不是.net,不介意在VB或c#中有任何帮助。

我有一个'客户'系统,它会每隔几个(比如说10秒)吐出常规的数据块(实际上是ascii)。数据的大小可能小于1K,我可以将每个输出分隔为特定的序列(比如<EoM>)。这个“客户端”将输出到几个(超过1个,少于5个)不同的端口。

我需要编写一个服务器,它将打开所需数量的端口,监听它们到达的数据。当一个消息到达其中一个端口时,最后使用<EoM>分隔符,我希望能够获取该数据然后对其进行一些处理(解析并输入数据库)信息)。并继续听取下一条数据的到来。这需要针对定义的所有端口进行。如果客户端应该断开连接,我希望端口能够等待并监听重新连接,然后像以前一样继续处理。但是作为一个将要进行通信的单个客户端,我可以假设,如果1个端口断开连接,则可以重新启动服务器进程,如果这比断开连接后再次监听更容易。

很抱歉这个冗长而且非常精确的问题,就像我说的,我是套接字编程的新手,所以任何有关如何做到这一点的实际例子都会非常感激。理想情况下,最终结果将是一个Windows服务,但我希望将其作为一个表单应用程序启动,直到我将其全部工作以便于调试。

欢呼任何帮助。

2 个答案:

答案 0 :(得分:0)

TCPListener一次只侦听一个端口。如果要侦听多个端口,则需要创建许多TCPListener实例。

由于您希望每个端口上的侦听器执行不同的操作,您需要在每个端口上接受客户端,并处理您在那里收到的数据。

上面的链接提供了有关如何接受客户端和侦听数据的基本初学者示例。虽然异步方法的性能要好得多,但这个同步代码更简单,可以让您轻松上手。

答案 1 :(得分:0)

您可以使用TAP / TUN驱动程序安装自己的网络接口(Windows和Linux),从而可以访问原始以太网帧。这样,您就可以对帧执行自己的过滤,找到相关的IP和端口,并转发到您自己的TCP / IP软件堆栈进行维护。

虽然这样可行,但也存在一些缺点:

  1. TAP / TUN驱动程序往往是10Mbps
  2. 低级别数据包的用户模式处理是CPU密集型的,有时会丢弃数据包
  3. 必须构建或使用TCP / IP库将帧摘要为TCP协议,包括维护TCP会话状态。
  4. TAP / TUN非常适合安全筛选和UDP专长,但TCP / IP是另一个层次。

    虽然这是一个可行的答案,但我会推荐@ nunespascal的回答。异步编程并不是那么难,如果你只是在说5个听众是合理的。即使是数百个休眠的异步侦听器也应该是合理的。