Я разрабатываю серверное приложение, к которому необходимо подключиться клиенты. Но я не хочу, чтобы мои пользователи, чтобы ввести IP-адрес ... Я хочу, чтобы клиент, чтобы обнаружить все серверы, работающие на порту 4800 (в моем случае)Отправка UDP Broadcast, необходимо принимать сообщения от всех клиентов
Вот мой код сервера:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static ThreadStart ts = new ThreadStart(start_server);
Thread thread = new Thread(ts);
private void Form1_Load(object sender, EventArgs e)
{
thread.Start();
}
private static void start_server()
{
//Start server
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
Console.Write("Running server..." + Environment.NewLine);
server.Bind(new IPEndPoint(IPAddress.Any, 4800));
while (true)
{
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tempRemoteEP = (EndPoint)sender;
byte[] buffer = new byte[1000];
//Recive message from anyone.
server.ReceiveFrom(buffer, ref tempRemoteEP);
Console.Write("Server got '" + Encoding.ASCII.GetString(buffer).TrimEnd(new char[] { (char)0 }) +
"' from " + tempRemoteEP.ToString() +
Environment.NewLine);
string access_code = Encoding.ASCII.GetString(buffer).TrimEnd(new char[] { (char)0 });
if (access_code == "7uz876t5r798qwe12")
{
Console.Write("Sending Response to " + tempRemoteEP.ToString() +
Environment.NewLine);
//Replay to client
server.SendTo(Encoding.ASCII.GetBytes("ACCESS GRANTED"),
tempRemoteEP);
}
else
{
Console.WriteLine("Client Access denied!");
server.SendTo(Encoding.ASCII.GetBytes("ACCESS DENIED"),
tempRemoteEP);
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
Environment.Exit(Environment.ExitCode);
}
}
и вот мой клиент отправки UDP Broadcast:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
private void button1_Click(object sender, EventArgs e)
{
IPEndPoint AllEndPoint = new IPEndPoint(IPAddress.Broadcast, 4800);
//Allow sending broadcast messages
client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Broadcast, 1);
//Send message to everyone
client.SendTo(Encoding.ASCII.GetBytes("7uz876t5r798qwe12"), 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
{
client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveTimeout, 3000);
client.ReceiveFrom(buffer, ref tempRemoteEP);
Console.Write("Client got '" + buffer[0] + "' from " +
tempRemoteEP.ToString() + Environment.NewLine);
MessageBox.Show(Encoding.ASCII.GetString(buffer).TrimEnd(new char[] { (char)0 }));
//Get server IP (ugly)
serverIp = tempRemoteEP.ToString().Split(":".ToCharArray(), 2)[0];
listServer.Items.Add(serverIp);
}
catch (Exception ex)
{
//Timout. No server answered.
MessageBox.Show(ex.Message);
}
// MessageBox.Show(serverIp);
}
}
Все серверы бег Прием вещания, но мой клиент получает только 1 IP адрес. Может быть, первый ответ, который доходит до клиента?
Как я могу обнаружить, что все мои серверы прослушивают мой порт?
UDP не гарантируется. Обычно вы выпускаете трансляцию, и все реагирует. Вы либо берете первый вариант, чтобы не ждать других, либо ждать определенного времени, а получить их, чтобы выбрать тот, который они хотели. – BugFinder