2015-02-05 41 views
-1

如果我不知道服务器正在运行的端口,是否可以发送用于搜索服务器应用程序的广播?或者我必须检查每个端口?用未知端口发送广播

要发送一个简单的广播,我发现在互联网下面的代码:

服务器

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
Console.Write("Running server..." + Environment.NewLine); 
server.Bind(new IPEndPoint(IPAddress.Any, 48000)); 

while (true) 
{ 
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
    EndPoint tempRemoteEP = (EndPoint)sender; 
    byte[] buffer = new byte[1000]; 

    server.ReceiveFrom(buffer, ref tempRemoteEP); 

    Console.Write("Server got '" + buffer[0] + "' from " + tempRemoteEP.ToString() + Environment.NewLine); 

    Console.Write("Sending '2' to " + tempRemoteEP.ToString() + 
    Environment.NewLine); 

    server.SendTo(new byte[] { 2 }, 
    tempRemoteEP); 
} 

客户

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 

IPEndPoint AllEndPoint = new IPEndPoint(IPAddress.Broadcast, 48000); 

//Allow sending broadcast messages 
client.SetSocketOption(SocketOptionLevel.Socket, 
SocketOptionName.Broadcast, 1); 

//Send message to everyone 
client.SendTo(new byte[] { 1 }, AllEndPoint); 
Console.Write("Client send '1' to " + AllEndPoint.ToString() + 
Environment.NewLine); 

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
EndPoint tempRemoteEP = (EndPoint)sender; 
byte[] buffer = new byte[1000]; 

string serverIp; 

try 
{ 
    //Recieve from server. Don't wait more than 3000 milliseconds. 
    client.SetSocketOption(SocketOptionLevel.Socket, 
    SocketOptionName.ReceiveTimeout, 3000); 
    client.ReceiveFrom(buffer, ref tempRemoteEP); 
    Console.Write("Client got '" + buffer[0] + "' from " + 
    tempRemoteEP.ToString() + Environment.NewLine); 

    //Get server IP (ugly) 
    serverIp = tempRemoteEP.ToString().Split(":".ToCharArray(), 2)[0]; 
} 
catch 
{ 
    //Timout. No server answered. 
    serverIp = "?"; 
} 

Console.Write("ServerIp: " + serverIp + Environment.NewLine); 
Console.ReadLine(); 

但我不知道,我的服务器使用端口48000

谢谢!

回答

1

要发送广播:

var port = 123; 
var udp = new UdpClient(); 
var data = new byte[] { 1, 2, 3 }; 
udp.Send(data, data.Length, new IPEndPoint(IPAddress.Any, port)); 

如果您不知道端口,你必须尝试所有端口,这一点我不建议,因为你垃圾邮件的网络。

你想做什么?

+0

谢谢你,我写了一个应用服务器,它将把所有的数据传递给客户端。由于客户自己安装客户端,我想实现一种“服务器搜索”功能,因此他们只需从列表中选择应用程序服务器。 – BendEg 2015-02-06 14:06:06

+1

因此,默认使用端口48000。扫描网络中主机的全部65000个端口可能不仅速度慢,而且可能不会让网络管理员满意,因为此行为会加载网络,并且还可能会警告某些入侵检测系统。 – thomai 2015-02-09 07:08:08