2014-04-26 2 views
0

У меня есть аппаратное обеспечение, чем подключение к ноутбуку (серверу) в ad hoc Network.таймер сокета в программировании сокетов

Когда сервер отправляет данные в одиночку, он работает правильно. и клиент отправляет данные самостоятельно, также работает правильно.

, но когда сервер и клиент отправляют данные вместе, через какое-то время произойдет тайм-аут.

после 35 и иногда произойдет 33 тайм-аут пакета.

Я изменил скорость передачи оборудования, но он также отключается.

хотя аппаратное обеспечение поддерживает полный дуплекс.

после истечения таймаута, i ping hard ware и не на порте.

и проверьте порт на сервере, и он открыт.

как я могу это сделать?

byte[] bytes = new byte[512]; 
     //try 
     //{ 

      IPHostEntry ipHost = Dns.GetHostEntry(""); 
      // Gets first IP address associated with a localhost 
      IPAddress add = ipHost.AddressList[3]; 


      TcpListener tcpListener = new TcpListener(add, 6000); 
      tcpListener.Start(); 



      TcpClient tcpClient = tcpListener.AcceptTcpClient(); 


      NetworkStream stream = tcpClient.GetStream(); 

      String data = null; 
      while (true) 
      { 
       int j = 0; 
       int i; 
       while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
       { 
        j = j + 1; 
        // Translate data bytes to a ASCII string. 
        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
        AddItem("j="+j+" Received:"+ data); 

        // Process the data sent by the client. 
        //data = data.ToUpper(); 

        byte[] msg = System.Text.Encoding.ASCII.GetBytes("thanks"); 

        // Send back a response. 
        stream.Write(msg, 0, msg.Length); 
        AddItem("Sent:"+"thanks"); 


       } 
       // Shutdown and end connection 
       tcpClient.Close(); 

ответ

0

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

В .NET есть три типовые решения:

  • Microsoft имеет параллельный интерфейс для asynchronous socket activity. Это требует большего количества служебного кода, чем ваш пример, но обрабатывает практически все в стиле Windows.
  • Вы можете обрабатывать асинхронную активность самостоятельно, тестируя для чтения данные, прежде чем писать с помощью Socket.Select(). Это типичный подход к опросу, но вы делаете все сами и должны быть уверены, что нет голода или другого уклона.
  • Поместите свои Read и Write код в разных потоках, чтобы блокировка не блокировала всю программу.
+0

я изменил мою треску ниже: 'http://msdn.microsoft.com/en-us/library/fx6588te%28v=vs.110%29.aspx' , но не изменилась. – user3374618

+0

Как я могу использовать разные потоки для чтения и записи в моей треске: while ((i = stream.Read (bytes, 0, bytes.Length))! = 0) { – user3374618

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