0

我有一个监听器,它在分配的端口号上监听 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 localIPlistenerclient绑定了相同的内容。因此,每当程序的另一个实例与这个程序有连接时,侦听器中的套接字就可以给我它的RemoteEndPoint. 这样我就不会得到系统生成的随机端口号。当然这不起作用,我得到这个错误:

每个套接字地址(协议/网络地址/端口)通常只允许使用一次

由于侦听器和客户端都绑定到同一个IPEndPoint localIP.

是否有解决方法,以便我可以将侦听器和客户端绑定到同一个端点?因为我想从socket.RemoteEndPoint监听器中获取端口号。此端口号应该是分配给程序的每个单独实例的端口号。

4

2 回答 2

0

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

WCF 必须提供的功能之一是所谓的Duplex Binding,它应该可以满足您的需求:连接的客户端会立即宣布一种被回调的方式。

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

可以在此处此处找到有关 WCF 入门创建干净代码的教程 + 示例。

于 2013-10-14T08:00:30.150 回答
0

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

于 2013-10-13T18:46:18.377 回答