我正在使用第三方设备打开一个只允许一次连接的tcp端口。如果我的应用程序连接到端口,则拒绝所有其他连接。
我想找一个基本上连接到这个端口的应用程序,然后允许其他人在不同的端口上连接它。 然后,从设备端口发出的任何数据都会重新广播到任何连接的客户端。
我知道如何编写这样的应用程序,但似乎这是其他人已经想到并编写它的东西。分享,我可以避免花时间写它。
基本代码将是:
1)启动一个tcp套接字服务器,绑定到TO_PORT(客户端连接到此) 2)作为客户端连接到DEVICE_IP:DEVICE_PORT 3)当数据从DEVICE_IP:DEVICE_PORT读入缓冲区时,缓冲区内容将重新发送到每个连接的客户端。 4)使其成为一个稳定的工作程序的其他一切。
这适用于Windows,我更喜欢它不需要安装java。
我的谷歌技能让我失望了。
有人知道这样的应用吗?
答案 0 :(得分:1)
不是一个完整的解决方案,但可能很有趣,但
http://www.codeproject.com/KB/IP/serversocket.aspx
http://www.codeproject.com/KB/IP/UniversalTCPSocketClass.aspx
答案 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并对其进行了一些修改。
它的工作是打开一个端口,接受连接,然后执行以下操作:
我会忽略其余的无聊细节,但说这不是“太难”,最后我只能自己动手。
命令行用法: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;
}