2012-08-07 76 views
0

我需要一些指针(工作的例子将是美好的)在以下问题。我是套接字编程的新手,虽然不是.net,但不介意在VB或c#中有任何帮助。TCPListener多个端口

我有一个“客户”系统,它会吐出数据的常规块(其实际上是ASCII)每几个(让说,10)秒。数据的尺寸很小,可能小于1K,我可以让每个输出按特定顺序分隔(如<EoM>)。这个“客户端”将输出到多个(多于1个,少于5个)不同的端口。

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

很抱歉的长期并不十分确切的问题,就像我说的,是新的Socket编程,所以如何做到这一点任何实际的例子,将不胜感激。最终的结果理想情况下是一个Windows服务,但是我希望将它作为一个表单应用程序启动,直到我将它全部用于调试。

干杯任何帮助。

+1

你要求的不是你想要的。所有的客户端都应该连接到同一个服务器端口,如果发生断开,客户端应该重新连接。应该不需要重新启动任何进程 - 这对服务进程来说会有些不便:) – 2012-08-07 10:55:32

+0

TCP/IP不处理消息,只是一个字节流。期望从任意点点滴滴中重新组合你的“大块数据”。 [This](http://stackoverflow.com/questions/11804131/asynchronous-tcp-socket-bytes-merging/11804312#11804312)可能会有所帮助。 – HABO 2012-08-07 10:59:42

+0

通常,应用程序在端口上侦听连接请求。收到请求后,会打开另一个端口与新客户端通信。原始端口可以继续侦听其他连接请求。根据您的应用程序,您可能想要监听单个端口号并接受客户端的多个连接。连接后每个客户端都可以识别自己。您的应用程序将管理与您所期望的设置有关的重复或丢失客户端的任何问题。 – HABO 2012-08-07 11:06:55

回答

0

一个TCPListener同时侦听只有一个端口。如果您想在多个端口上侦听,则需要创建TCPListener的许多实例。

既然你希望每个端口上监听到执行不同的操作,您将需要接受每个端口上的客户端,并处理您收到有数据。

上面的链接提供了一个基本的初学者示例如何接受客户端和侦听数据。虽然异步方法执行得更好,但此同步代码更简单,并且可以让您轻松启动。

0

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

虽然这会工作,也有缺点:

  1. TAP/TUN司机往往是低级别的数据包的10Mbps的
  2. 用户模式处理是CPU密集型和包有时丢弃
  3. 说完就构建或使用TCP/IP库将帧消解到TCP协议中,包括维护TCP会话状态。

TAP/TUN非常适合安全筛选,也可能是UDP专长,但TCP/IP是另一个级别。

虽然这是一个可行的答案,我会推荐@ nunespascal的答案。异步编程并不困难,如果你只是在谈论5个合理的听众。即使是数百个休眠的异步收听者也应该是合理的。