Подключение двух UDP-клиентов к одному порту (отправка и получение)
я попробовал предложение от этот вопрос С очень маленьким успехом.
пожалуйста... любая помощь будет очень признательна!
вот мой код:
static void Main(string[] args)
{
IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000);
UdpClient udpServer = new UdpClient(localpt);
udpServer.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
UdpClient udpServer2 = new UdpClient();
udpServer2.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer2.Client.Bind(localpt); // <<---------- Exception here
}
4 ответов
вы должны установить параметр сокета перед переплетом.
static void Main(string[] args)
{
IPEndPoint localpt = new IPEndPoint(IPAddress.Any, 6000);
UdpClient udpServer = new UdpClient();
udpServer.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer.Client.Bind(localpt);
UdpClient udpServer2 = new UdpClient();
udpServer2.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer2.Client.Bind(localpt); // <<---------- No Exception here
Console.WriteLine("Finished.");
Console.ReadLine();
}
или более наглядный пример:
static void Main(string[] args)
{
IPEndPoint localpt = new IPEndPoint(IPAddress.Loopback, 6000);
ThreadPool.QueueUserWorkItem(delegate
{
UdpClient udpServer = new UdpClient();
udpServer.ExclusiveAddressUse = false;
udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer.Client.Bind(localpt);
IPEndPoint inEndPoint = new IPEndPoint(IPAddress.Any, 0);
Console.WriteLine("Listening on " + localpt + ".");
byte[] buffer = udpServer.Receive(ref inEndPoint);
Console.WriteLine("Receive from " + inEndPoint + " " + Encoding.ASCII.GetString(buffer) + ".");
});
Thread.Sleep(1000);
UdpClient udpServer2 = new UdpClient();
udpServer2.ExclusiveAddressUse = false;
udpServer2.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer2.Client.Bind(localpt);
udpServer2.Send(new byte[] { 0x41 }, 1, localpt);
Console.Read();
}
Я посмотрел ваше сообщение об ошибке, и это объясняет, что такое ошибка и почему это происходит.
вот точное сообщение об ошибке и причине WSAEACCES 10013 (MSDN)
отказано.
была сделана попытка доступа к сокету таким образом, запрещено право доступа. Пример использования широковещательного адреса для sendto без широковещательного разрешения, устанавливаемого с помощью setsockopt (SO_BROADCAST).
другой возможной причиной ошибки WSAEACCES является то, что при привязке функция вызывается (в Windows NT 4.0 с SP4 и более поздних версиях), другая драйвер режима приложения, службы или ядра привязан к одному и тому же адрес с эксклюзивным доступом. Такой эксклюзивный доступ-это новая функция Windows NT 4.0 с SP4 и более поздних версий, и реализуется с помощью Опция SO_EXCLUSIVEADDRUSE.
даже изменение кода, чтобы я мог передать IP-адрес, я получаю то же сообщение об ошибке, кажется, что вы не можете привязаться к тому же порту, и может использоваться только один порт вот пример кода, который я использовал в вашем примере, и изменил его, чтобы захватить мой ip с моей локальной машины..
IPAddress ipAddress = Dns.Resolve(Dns.GetHostName()).AddressList[0];
IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, 11000);
//IPEndPoint localpt = new IPEndPoint(ipLocalEndPoint);
UdpClient udpServer = new UdpClient(ipLocalEndPoint);
udpServer.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer.Connect(ipLocalEndPoint);
UdpClient udpServer2 = new UdpClient();
udpServer2.Client.SetSocketOption(
SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpServer2.Client.Bind(ipLocalEndPoint); // <<---------- Exception here
это создаст исключение для метода Bind ().. извиняюсь.
для решения задачи WSAEACCESS 10013 (MSDN) исключение в приложении UDP вы можете попробовать
udpServer.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);