开发者

Any off the shelf app to rebroadcast tcp packets?

开发者 https://www.devze.com 2023-03-31 21:26 出处:网络
I am working with a 3rd party device which opens a tcp port that only allows one connection at a time. If my app connects to the port, all other connections are denied.

I am working with a 3rd party device which opens a tcp port that only allows one connection at a time. If my app connects to the port, all other connections are denied.

I'd like to find an app that basically connects to this port, then allows others to connect to it on a different port. Any data sent out of the device's port is then rebroadcast to any connected client.

I know how to write such an app, but it seems like it would be something someone else has already thought off and written it & shared, and I could avoid taking the time to write it.

basicaly code would be:

1) start a tcp socket server, binding to TO_PORT (clients connect to this) 2) connect as a client to DEVICE_IP:DEVICE_PORT 3)开发者_C百科 when data is read into a buffer from DEVICE_IP:DEVICE_PORT, the buffer content is resent to each connected client. 4) everything else that makes it a stable, working program.

This is for windows, and I'd prefer it not require a java install.

My google skills have failed me.

Anyone know of such an app?


Not a complete solution for you, but might be interesting, though

http://www.codeproject.com/KB/IP/serversocket.aspx

http://www.codeproject.com/KB/IP/UniversalTCPSocketClass.aspx


Guess I'll answer my own question.

I implemented the solution my self.

Key points to my solution:

A class named IPClient which wraps up a TcpClient instance, uses async model of calling TcpClient.BeginConnect, BeginRead, etc. It has a Timer used for reconnecting if it loses connection. This is the class that connects to the device.

It's public interface would look something like this:

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() {...}
  }    

To open the port that would allow other clients to connect, I used this library: http://codeproject.com/KB/IP/BasicTcpServer.aspx and modified it a bit.

It's job was to open a port, accept connections, and do the following:

  1. in the Connected handler, start the listening port
  2. in the Disconnected handler, stop the listening port
  3. in the DataReceived handler, broadcast the data to any connected clients.

I'll leave out the rest of the boring details, but say it wasn't "too hard", and eventually I just had to roll my own.

command line usage: myapp.exe remote_addr remote_port listen_port

psuedocode/main idea of my program main:

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;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消