Нужна помощь с обнаружением многоадресного udp-сервера на c#
Вопрос
В качестве своего рода продолжения этот вопрос Я получил решение, работающее на моем локальном компьютере, но не на компьютере в сети.
Я не слишком много знаю о сокетах, кроме этих основ, так что потерпите меня.Цель состоит в том, чтобы клиент искал сервер в локальной сети, и это является результатом некоторого вырезания / вставки / редактирования кода.
Это клиентский код:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
byte[] data = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
string welcome = "What's your IP?";
data = Encoding.ASCII.GetBytes(welcome);
client.SendTo(data, data.Length, SocketFlags.None, ipep);
IPEndPoint server = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)server;
data = new byte[1024];
int recv = client.ReceiveFrom(data, ref tmpRemote);
this.IP.Text = ((IPEndPoint)tmpRemote).Address.ToString(); //set textbox
this.Port.Text = Encoding.ASCII.GetString(data, 0, recv); //set textbox
client.Close();
}
Это серверный код:
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 10294);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
newsock.Bind(ipep);
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any,IPAddress.Parse("127.0.0.1")));
while (true)
{
Console.WriteLine("Waiting for a client...");
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)(sender);
data = new byte[1024];
recv = newsock.ReceiveFrom(data, ref tmpRemote);
Console.WriteLine("Message received from {0}:", tmpRemote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
string welcome = "7010";
data = Encoding.ASCII.GetBytes(welcome);
newsock.SendTo(data, data.Length, SocketFlags.None, tmpRemote);
}
Это работает на моем локальном компьютере (как на сервере, так и на клиенте), но когда я пробую другой компьютер в той же сети, я получаю сообщение "Существующее соединение было принудительно закрыто удаленным хостом".
Я понимаю, что мне нужно добавить много try / catch, но я просто пытаюсь сначала разобраться в том, как это работает.
Решение
Я должен начать с того, что ничего не знаю о C #, но ...
Глядя на определение ipep
в клиентском коде, похоже, что вы пытаетесь отправить свои данные себе, а не транслировать их (как было предложено в другом вопросе) , Мое внимание привлекло то, что «127.0.0.1» является адресом "localhost".
Это объясняет, почему он работает хорошо, когда вы запускаете клиент и сервер на одной машине, поскольку он будет отправлять самому себе.
Я ожидал бы, что правильной конечной точкой будет широковещательный адрес (например, "255.255.255.255"), хотя вы также можете выбрать широковещательный адрес локальной сети, в которой вы находитесь, в зависимости от того, насколько широко вы хочу транслировать.
Другие советы
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10294);
Должно стать:
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 10294);
И
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("127.0.0.1")));
Должно Стать
newsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Any, IPAddress.Parse("255.255.255.255")));
Я думаю.
Ладно, это не работает, значит, что-то все-таки не так.