我正在尝试构建一个netowrk应用程序。我成功地制作了一个发送和接收包的服务器。到目前为止,测试已在一台指向127.0.0.1的计算机上完成(没有像家一样的地方)。现在我想切换到网络。如何在LAN网络上找到正在侦听我的特定端口的计算机?
答案 0 :(得分:5)
该服务需要在已知端口上监听broadcast messages(如果您希望表现得非常好,可以register the program and port number with the IANA),当它听到广播消息时它会回复服务器的发送方IP以及服务正在侦听传入连接的端口。
以上是上面链接中的一个简单示例,它只是打印到连接的控制台和端口,但您可以使用此信息在两个端点之间建立TCP或UDP连接。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
class RecvBroadcst
{
public static void Main()
{
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind(iep);
EndPoint ep = (EndPoint)iep;
Console.WriteLine("Ready to receive…");
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}",
stringData, ep.ToString());
data = new byte[1024];
recv = sock.ReceiveFrom(data, ref ep);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}",
stringData, ep.ToString());
sock.Close();
}
}
作为一个psudo示例,这里是我将如何做的事件序列。
对于此示例,我们假设我们的网络的IP为192.168.1.0
,子网为255.255.255.0
。我们有两台服务器Server1
位于192.168.1.2
,服务正在端口1234
上侦听,而Server2
位于192.168.1.3
,端口为4567
服务。两者都在端口3000
上列出广播消息。客户端连接将位于IP 192.168.1.4
192.168.1.255:3000
)的广播地址和已知端口。他发送某种有效负载,因此服务器只发回给您的客户,而不是其他碰巧使用相同端口的人。 (假设它发送字符串Send me your info for XYZ app!
)Send me your info for XYZ app!
并将UDP消息Name:Server1 IP:192.168.1.2 Port:1234
发送回发件人源端口和IP组合(192.168.1.4:50123
)Send me your info for XYZ app!
并将UDP消息Name:Server2 IP:192.168.1.3 Port:4567
消息发送回发件人源端口和IP组合(192.168.1.4:50123
)