我有一个侦听器,它会侦听指定端口号上的localhost,如下所示:
TcpListener listener = new TcpListener(localIP);
listener.Start();
while (true) {
listen:
if (!listener.Pending()) {
Thread.Sleep(100);
goto listen;
}
Socket socket = listener.AcceptSocket();
}
现在,同一个程序应该连接到这个程序的其他实例,如下所示:
TcpClient client = new TcpClient(localIP); //localendpoint should use same port
client.Connect("localhost", remotePort);
正如您所看到的,我为侦听器和客户端绑定了相同的IPEndPoint localIP
。因此,只要程序的另一个实例与此实例有连接,监听器中的套接字就可以给我RemoteEndPoint
。这样我就不会得到系统生成的随机端口号。当然这不起作用,我得到这个错误:
每个套接字地址只有一种用法(协议/网络地址/端口) 通常是允许的
由于侦听器和客户端都绑定到相同的IPEndPoint localIP
。
是否有解决方法以便将侦听器和客户端绑定到同一个EndPoint?因为我想从侦听器中的socket.RemoteEndPoint
获取端口号。此portnumber应该是分配给程序的每个单独实例的portnumber。
答案 0 :(得分:0)
那么,根据问题的评论,最好的解决方案就是发送程序通过套接字连接监听的端口号。
答案 1 :(得分:0)
我建议您切换到WCF进行通讯。它为您提供了许多方便的工具,用于抽象序列化,传输协议,安全性,配置等。最终,WCF可以让您为多样化的客户生态系统构建面向服务的应用程序,而不是自己完成所有的艰苦工作。
WCF提供的功能之一是所谓的Duplex Binding,它可以为您提供所需的内容:连接客户端会立即宣布回调方式。
如果您仍然需要传达网络拓扑,那么您仍然可以使用WCF进行通信;为此我建议实现一个独立的服务接口,专门负责网络拓扑。