На работе мне нужно направить некоторые данные, которые поступают с использованием UDP. Я следил за некоторыми учебниками, такими как this blog или this tutorial, и готовил два консольных приложения, один для отправки сообщений UDP (клиент) и один для их чтения (прослушиватель). Когда я ввожу IP-адрес 127.0.0.1 (localhost), все идет хорошо, но никакой другой адрес не работает. Если я использую свой настоящий локальный IP-адрес, мне не повезло. Поскольку у меня локально нет статического IP-адреса, я также попытался установить слушателя на сервере, который имеет статический IP-адрес. При этом я должен был добавить правило к установленным правилам брандмауэра Windows. Еще не повезло. Есть идеи? Вот мой код:UDP к серверу не работает
/симон/
Client
class Client
{
private readonly Socket _sendingSocket;
private readonly IPEndPoint _receiverEndpoint;
private static int outboundPortNumber = int.Parse(ConfigurationManager.AppSettings["OutgoingPortNumber"]);
public Client()
{
var receiverAddress = IPAddress.Parse(ConfigurationManager.AppSettings["IpOfReceiver"]);
_receiverEndpoint = new IPEndPoint(receiverAddress, outboundPortNumber);
_sendingSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_sendingSocket.EnableBroadcast = true;
}
public void Transmit()
{
bool done = false;
while (!done)
{
Console.WriteLine("Hit q to quit");
var keypress = Console.ReadKey();
if (keypress.KeyChar.ToString().ToLower() == "q")
done = true;
else
SendTextToServer();
}
}
private void SendTextToServer()
{
Console.WriteLine("Enter text to send");
var textToSend = Console.ReadLine();
byte[] send_buffer = Encoding.ASCII.GetBytes(textToSend);
try
{
_sendingSocket.SendTo(send_buffer, _receiverEndpoint);
}
catch (Exception send_exception)
{
Console.WriteLine(" Exception {0}", send_exception.Message);
}
}
}
Слушатель
class Listener
{
private bool _started;
private ManualResetEvent _stop;
private UdpClient _client;
private IPEndPoint _endPoint;
private Thread _workingThread;
private static int inboundPortNumber = int.Parse(ConfigurationManager.AppSettings["IncomingPortNumber"]);
public void Start()
{
_started = true;
_stop = new ManualResetEvent(false);
InitializeUdpClient();
InitializeWorkingThread();
}
private void InitializeUdpClient()
{
_endPoint = new IPEndPoint(IPAddress.Any, inboundPortNumber);
_client = new UdpClient(_endPoint);
}
private void InitializeWorkingThread()
{
_workingThread = new Thread(WorkerFunction);
_workingThread.Name = "WorkingThread";
_workingThread.Start();
}
private void WorkerFunction()
{
while (_started)
{
var res = _client.BeginReceive(iar =>
{
if (iar.IsCompleted)
{
byte[] receivedBytes = _client.EndReceive(iar, ref _endPoint);
OutputToConsole(receivedBytes);
}
}, null);
if (WaitHandle.WaitAny(new[] { _stop, res.AsyncWaitHandle }) == 0)
{
break;
}
}
}
private void OutputToConsole(byte[] receivedBytes)
{
string receivedPacket = Encoding.ASCII.GetString(receivedBytes);
Console.WriteLine("{0} received at {1}", receivedPacket, DateTime.Now.ToString("hhMMss.ffff"));
}
}
--edit -
Одно из замечаний предложил, что я должен смотреть на некоторые регистрации. Используя Microsoft Network Monitor для захвата моего трафика данных, я пробовал следующее: (1) В dev-машине: при отправке на 127.0.0.1 с моего компьютера-разработчика (так с localhost на localhost) данные не регистрируются. Я считаю это странным, потому что это единственный сценарий, в котором сообщения принимаются и красиво распечатываются на консоли. (2) Когда я отправляю с моего компьютера-разработчика на сервер, на моем компьютере-детекторе есть некоторые исходящие данные, а на сервере есть также входящие данные. Я запустил netstat -b на сервере, который вообще не показывает никакого протокола UDP. Поскольку в методе InitializeUdpClient() UdpClient имеет IPEndpoint, поэтому я должен быть привязан к порту. Почему же он не появляется, когда я запускаю netstat? Основываясь на этой новой информации, есть предложение, почему слушатель не получает никаких данных?
//
Саймон
Как выглядят ваши проблемы с поиском пакетов? – admdrew
Ваш отчет об ошибке состоит только из таких фраз, как «не работает» или «не повезло». Что происходит? Вы получаете ошибки? Создаются ли сокеты? –