为TcpListener和TcpClient绑定相同的EndPoint

时间:2013-10-13 16:21:15

标签: c# tcp

我有一个侦听器,它会侦听指定端口号上的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。

2 个答案:

答案 0 :(得分:0)

那么,根据问题的评论,最好的解决方案就是发送程序通过套接字连接监听的端口号。

答案 1 :(得分:0)

我建议您切换到WCF进行通讯。它为您提供了许多方便的工具,用于抽象序列化,传输协议,安全性,配置等。最终,WCF可以让您为多样化的客户生态系统构建面向服务的应用程序,而不是自己完成所有的艰苦工作。

WCF提供的功能之一是所谓的Duplex Binding,它可以为您提供所需的内容:连接客户端会立即宣布回调方式。

如果您仍然需要传达网络拓扑,那么您仍然可以使用WCF进行通信;为此我建议实现一个独立的服务接口,专门负责网络拓扑。

可以找到关于WCF入门的教程+示例,创建干净的代码herehere