Лишь один UdpClient получает сообщение C#
Всем добрый день. Недавно я создал сырой мессенджер в консольном приложении, работающий только по локальной сети, но свою основную функцию он выполняет, к сожалению, лишь наполовину. При запуске нескольких клиентов лишь один имеет возможность получать сообщения от остальных, но не может их отправлять, тогда как с другими ситуация абсолютно обратная. Я пробовал также запускать программу с разных устройств и всё оставалось неизменным. Опишите, пожалуйста, в чём может быть проблема?
using System.Net.Sockets;
using System.Net;
using System.Text;
int Port = 8001;
IPAddress brodcastAddress = IPAddress.Parse("235.5.5.11");
Console.Write("Имя пользователя: ");
string? username = Console.ReadLine();
Task.Run(ReceiveMessageAsync);
await SendMessageAsync();
async Task SendMessageAsync()
{
using var user = new UdpClient();
while (true)
{
string? message = Console.ReadLine();
if (string.IsNullOrWhiteSpace(message)) break;
message = $"{username}: {message}";
byte[] data = Encoding.UTF8.GetBytes(message);
await user.SendAsync(data, new IPEndPoint(brodcastAddress, Port));
}
}
async Task ReceiveMessageAsync()
{
using var receiver = new UdpClient(Port);
receiver.JoinMulticastGroup(brodcastAddress);
while (true)
{
var result = await receiver.ReceiveAsync();
string message = Encoding.UTF8.GetString(result.Buffer);
Console.WriteLine(message);
}
}
Ответы (1 шт):
Проблема была решена. Как оказалось, нельзя было отдавать общий порт клиенту в конструктор, иначе он забирал его себе и становился на место общего сервера для отправки сообщений. Вот изменённый кусочек кода:
async Task ReceiveMessageAsync()
{
using var user_receive = new UdpClient();
user_receive.ExclusiveAddressUse = false;
var end_point = new IPEndPoint(IPAddress.Any, 8001);
user_receive.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
user_receive.ExclusiveAddressUse = false;
user_receive.Client.Bind(end_point);
user_receive.JoinMulticastGroup(brodcastAddress);
//Console.WriteLine($"{name} вошёл в чат.");
while (true)
{
var result = await user_receive.ReceiveAsync();
string str = Encoding.UTF8.GetString(result.Buffer);
Console.WriteLine(str);
}
}