2013-08-21 2 views
0

В пакете заголовка tcp это поле, в котором упоминается общий размер пакета. Я выполнил свой сервер, который прослушивает многократным клиент следующим способаC# реализация таймаута для чтения полного пакета tcp сервером

int numberOfClientsYouNeedToConnect = int.Parse(Console.ReadLine()); 
     for (int i = 0; i < numberOfClientsYouNeedToConnect; i++) 
     { 
      Thread newThread = new Thread(new ThreadStart(Listeners)); 
      newThread.Start(); 
     } 

public static void Listeners() 
    { 
     try 
     { 
      Socket socketForClient = tcpListener.AcceptSocket(); 

      if (socketForClient.Connected) 
      { 
       Console.WriteLine("Client : " + socketForClient.RemoteEndPoint + " is now connected to server."); 
       NetworkStream networkStream = new NetworkStream(socketForClient); 
       //networkStream.ReadTimeout = 30; 
       System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream); 
       System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream); 

       while (true) 
       { 
        string theString = streamReader.ReadLine(); 
        //Console.WriteLine(theString); 
        byte[] input_stream = extra_function.ConvertHexToString(theString); 
        for (int i = 0; i < input_stream.Length; i++) 
        { 
         // Console.WriteLine("hi"); 
         Console.Write(input_stream[i]); 
        } 


        if (theString != "exit") 
        { 
         // original message from client 
         Console.WriteLine("------------------------------------------------------------------------------"); 
         Console.WriteLine("Message recieved from client(" + socketForClient.RemoteEndPoint + ") : " + theString); 

         // ASCII code for the message from client 
         Console.Write("ASCII Code for message is : "); 
         foreach (char c in theString) 
         { 
          Console.Write(System.Convert.ToInt32(c) + " "); 
         } 
        } 
       } 

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

+0

Вы используете StreamReader и StreamWriter, поэтому ваш протокол кажется * текстовым *. Поэтому ваш * пакет * - * одна строка *. – I4V

+0

ok фактически протокол не основан на тексте, но он будет отправлять и принимать tcp-пакеты. – prattom

+0

Вы не можете использовать StreamReader и StreamWriter для двоичных данных. Используйте networkStream напрямую. – I4V

ответ

-1

Вы попробовали StreamReader.ReadToEnd() вместо StreamReader.ReadLine()?

+0

Сервер не получит никакого * сообщения *, пока клиент не закроет соединение. – I4V

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