2013-12-09 3 views
-1

На работе мне нужно направить некоторые данные, которые поступают с использованием 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? Основываясь на этой новой информации, есть предложение, почему слушатель не получает никаких данных?

//

Саймон
+0

Как выглядят ваши проблемы с поиском пакетов? – admdrew

+0

Ваш отчет об ошибке состоит только из таких фраз, как «не работает» или «не повезло». Что происходит? Вы получаете ошибки? Создаются ли сокеты? –

ответ

0

К сожалению, ребята, проблема была как-то связана с брандмауэром. Я разрешил устанавливать правила на сервере и исходящие правила на моей машине разработки, но прокси-сервер компании молча блокировал трафик. При переходе на беспроводную сеть для гостей это мой трафик прибыл на сервер.

Simon

Смежные вопросы