Да, надеюсь, быстрый вопрос и ответ.Мое приложение должно прослушивать UDP-порт и любой IP-адрес с определенного сервера showcontrol.Который просто отправляет простой текст / строки ASCII.
Поскольку у нас нет такого сервера SC в офисе, я также написал очень маленькое простое консольное приложение, которое просто передает пакеты UDP.
Этотакое консольное приложение:
static void Main(string[] args)
{
Thread.Sleep(1000);
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint e = new IPEndPoint(IPAddress.Broadcast, 35000);
IPAddress broadcast = IPAddress.Parse("192.168.1.255");
e = new IPEndPoint(broadcast, 35000);
string s;
Byte[] sendBytes;
while ("exit" != (s = Console.ReadLine()))
{
sendBytes = Encoding.ASCII.GetBytes((s.EndsWith("\n") ? s : s + "\n"));
soc.SendTo(sendBytes, e);
}
sendBytes = Encoding.ASCII.GetBytes("EXIT\n");
soc.SendTo(sendBytes, e);
soc.Close();
}
Я пробовал две вещи на стороне слушателя.Использование UdpClient и использование сокетного соединения и то и другое дают мне точно такую же проблему, которую я опишу ниже, и мой код слушателя:
Версия сокета:
public MediaPlayer(Output outputWindow)
{
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, i_inPort);
serverSocket.Bind(ipEndPoint);
IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
EndPoint epSender = (EndPoint)ipeSender;
SocketState state = new SocketState();
state.e = epSender;
state.s = serverSocket;
beginReceiveFrom(state);
}
public void beginReceiveFrom(SocketState state)
{
state.byteData = new byte[state.byteData.Length];
IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
state.e = (EndPoint)ipeSender;
state.s.BeginReceiveFrom(state.byteData, 0, state.byteData.Length, SocketFlags.None, ref state.e, onReceiveFrom, state);
}
public void onReceiveFrom(IAsyncResult ar)
{
SocketState state = (SocketState)ar.AsyncState;
Socket serverSocket = state.s;
//EndPoint epSender = state.e;
IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 0);
EndPoint epSender = (EndPoint)ipeSender;
try
{
serverSocket.EndReceiveFrom(ar, ref epSender);
string s = Encoding.ASCII.GetString(state.byteData);
}
catch (System.Exception ex)
{
Console.WriteLine(ex);
}
finally
{
beginReceiveFrom(state);
}
}
Версия UdpClient:
public MediaPlayer(Output outputWindow)
{
UdpClient client = new UdpClient(i_inPort);
IPEndPoint endPoint = null;
UdpState state = new UdpState();
state.e = endPoint;
state.u = client;
}
private void BeginReceive(UdpState state)
{
state.u.BeginReceive(new AsyncCallback(ReceiveCallback), state);
}
private void ReceiveCallback(IAsyncResult ar)
{
UdpState state = null;
try
{
state = (UdpState)ar.AsyncState;
Byte[] receiveBytes = state.u.EndReceive(ar, ref state.e);
string receiveString = Encoding.ASCII.GetString(receiveBytes);
executive.Receive(receiveString);
BeginReceive(state);
}
catch(System.Exception ex)
{
SetText(ex.ToString());
}
}
В версии UpdClient ReceiveCallback есть некоторый дополнительный код, потому что это тот, который я изначально использовал.Проблема в том, что когда я отправляю / транслирую материал с консольным приложением в любом случае в сети моей компании и на любом компьютере, он просто работает, нет проблем.Несколько медиаплееров могут воспроизводиться на любом количестве компьютеров без проблем.
Однако, когда я использую другого отправителя UDP (что-то вроде Hercules с hw-group.com), он просто не будет работать,> до <Я посылаю одну команду с моим консольным приложением.Только тогда, после отправки текста / пакета / данных с помощью моего консольного приложения, мое приложение примет данные из приложения hercules. </p>
Кто-нибудь видит, что я делаю неправильно?Я прочитал несколько примеров кода, отсюда, codeproject и guru-что-то, и они все используют один и тот же тип программирования, который я использовал.
Также, извините за стену текста.