任何现成的应用程序重新广播TCP包?

时间:2011-08-31 17:18:23

标签: sockets tcp

我正在使用第三方设备打开一个只允许一次连接的tcp端口。如果我的应用程序连接到端口,则拒绝所有其他连接。

我想找一个基本上连接到这个端口的应用程序,然后允许其他人在不同的端口上连接它。 然后,从设备端口发出的任何数据都会重新广播到任何连接的客户端。

我知道如何编写这样的应用程序,但似乎这是其他人已经想到并编写它的东西。分享,我可以避免花时间写它。

基本代码将是:

1)启动一个tcp套接字服务器,绑定到TO_PORT(客户端连接到此) 2)作为客户端连接到DEVICE_IP:DEVICE_PORT 3)当数据从DEVICE_IP:DEVICE_PORT读入缓冲区时,缓冲区内容将重新发送到每个连接的客户端。 4)使其成为一个稳定的工作程序的其他一切。

这适用于Windows,我更喜欢它不需要安装java。

我的谷歌技能让我失望了。

有人知道这样的应用吗?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

猜猜我会回答我自己的问题。

我自己实施了解决方案。

我的解决方案的关键点:

一个名为IPClient的类,它包装了一个TcpClient实例,它使用调用TcpClient.BeginConnect,BeginRead等的异步模型。它有一个Timer,用于在失去连接时重新连接。 这是连接到设备的类。

它的公共界面看起来像这样:

public class IPClient{

    public event EventHandler<MyConnectedArgs> Connected;   
    public event EventHandler<MyDisconnectedArgs>Disconnected;
    public event EventHandler<MyDataReceivedArgs> DataReceived;

    public bool Connect(string address, int port){...}
    public bool Disconnect() {...}
  }    

要打开允许其他客户端连接的端口,我使用了这个库:http://codeproject.com/KB/IP/BasicTcpServer.aspx并对其进行了一些修改。

它的工作是打开一个端口,接受连接,然后执行以下操作:

       
  1. 在Connected处理程序中,启动侦听端口
  2.    
  3. 在Disconnected处理程序中,停止侦听端口
  4.    
  5. 在DataReceived处理程序中,将数据广播到任何连接的客户端。
  6. 我会忽略其余的无聊细节,但说这不是“太难”,最后我只能自己动手。

    命令行用法:myapp.exe remote_addr remote_port listen_port

    psuedocode /我的程序主要的主要想法:

    static int Main(string[] args){
    
      //SetConsoleCtrlHandler(my callback re: ctrl+C,etc)
    
      //get command line params
    
      var ipClient = new IPClient();
      var myprovider = MyTcpServiceProvider();
      var server = new TcpServer(myProvider, listenPort);
    
      ipClient.Connected += (sender, e) => server.Start();
      ipClient.Disconnected += (sender,e) => server.Stop();
      ipClient.DataReceived += (sender,e)=> provider.BroadcastToClients(e.Data);
    
      ipClient.Connect(remoteAddress,  remotePort);
    
      //wait for Ctrl+C or program exit
      //shutdown code,etc
      return 0;
    }