none
Komunikacia cez TCP/IP

    Dotaz

  • Mám problém s komunikáciou na XPort. Connect je bez problémov, dáta posielam bez problémov, ale ako náhle chcem prečítať čo mi XPort poslal alebo či vôbec niečo poslal, tak sa mi násilne ukončí connect na XPort. Pri Debug sa mi krokovanie zasekne na Read.

    Pomôže mi niekto?

    ===================

    Z MainFormat volám

    Robot.Connect ("192.168.2.100, 10001);  // môj PC má IP 192.168.2.85
    Robor.SendCommand ("ahoj");


    public class Robot : IDisposable
    {
       TcpClient client = new TcpClient();
       NetworkStream netStream = null;

       public bool Connect(string address, int port)       // TU ROBIM CONNECT - TO JE V PORIADKU
       {
                try
                {

                    this.client.Connect(address, port);
                    this.netStream = this.client.GetStream();
                }
                catch (ArgumentNullException e)
                {
                    Common.Spojenie = false;
                    Console.WriteLine("ArgumentNullException: {0}", e);
                }
                catch (SocketException e)
                {
                    Common.Spojenie = false;
                    Console.WriteLine("SocketException: {0}", e);
                }

                return true;
            }

       public string SendCommand(string command)                     // TU ROBIM SEND A RECEIVE

            {
                if (!this.client.Connected) throw new Exception("You have to connect to endpoint first!");

                if (this.netStream.CanWrite)
                {
                    byte[] bytes = Encoding.ASCII.GetBytes(command);
                    this.netStream.Write(bytes, 0, bytes.Length);           // WRITE JE BEZ PROBLEMOV
                }
                else
                {
                    // throw exception
                }

                if (netStream.CanRead)
                {
                    this.client.ReceiveTimeout = 10000;
                    byte[] bytes = new byte[this.client.ReceiveBufferSize];

                    this.netStream.Read(bytes, 0, (int)this.client.ReceiveBufferSize); // !!!!! TADY SA MI TO ZASEKNE A NEIDE DALEJ !!!
                    return Encoding.ASCII.GetString(bytes);
                }

                return null;
            }


       public void Close()
       {
          if (this.client != null) this.client.Close();
          if (this.netStream != null) this.netStream.Close();
       }

       public void Dispose()
            {
                Dispose(true);

                GC.SuppressFinalize(this);
            }


            protected virtual void Dispose(bool disposing)
            {
                if (!_disposed)
                {
                    if (disposing)
                    {
                        if (_resource != null)
                            _resource.Dispose();
                        Console.WriteLine("Object disposed.");
                    }

                    // Indicate that the instance has been disposed.
                    _resource = null;
                    _disposed = true;
                }
            }

    Ešte som skúšal premávku pomocou Etherealu.

    Pri pripájaní XPortu bola premávka
    192.168.2.85   192.168.2.100 TCP gw-call-port > scp-config [SYN] Seq=0 win=65535 Len: 0 MSS= 146
    192.168.2.100  192.168.2.85  TCP scp-config > gw-call-port [SYN, ACK] Seq=0 Ack=1 win=2047 Len: 0
    192.168.2.85   192.168.2.100 TCP gw-call-port > scp-config [ACK] Seq=1 Ack=1 win=65535 Len=0

    Pri Write bola premávka
    192.168.2.85   192.168.2.100 TCP gw-call-port > scp-config [PSH, ACK] Seq=1 win=65535 Len: 4 MSS= 146 (text:ahoj)
    192.168.2.100  192.168.2.85  TCP scp-config > gw-call-port [ACK] Seq=1 Ack=5 win=2047 Len: 0

    Pri Read nebola žiadna premávka

    středa 15. září 2010 9:44

Odpovědi

  • Ahoj, trochu pozdě, ale vyzkoušel jsem co se ti stává s tvým kódem. Na mém testovacím TCP serveru se mi to chovalo stejně, asi proto, protože můj server čte ze streamu pomocí ReadLine, takže očekával na vstupu celý řádek .. proto nemohlo zpět nic přijít. Navíc jsem přidal Flush pro okamžité  vyprázdnění celého streamu. Tady je tvůj upravený kód:

     

    private string AlternateSendText()
     {
      var command = "Ahoj" + Environment.NewLine; // <<
    
      if (!this.client.Connected) throw new Exception("You have to connect to endpoint first!");
    
      if (this.netStream.CanWrite)
      {
      byte[] bytes = Encoding.ASCII.GetBytes(command);
      this.netStream.Write(bytes, 0, bytes.Length);  // WRITE JE BEZ PROBLEMOV
      this.netStream.Flush(); // <<
      }
      else
      {
      // throw exception
      }
    
      if (netStream.CanRead)
      {
      this.client.ReceiveTimeout = 10000;
      byte[] bytes = new byte[this.client.ReceiveBufferSize];
    
      this.netStream.Read(bytes, 0, (int)this.client.ReceiveBufferSize); // !!!!! TADY SA MI TO ZASEKNE A NEIDE DALEJ !!! 
      var response = Encoding.ASCII.GetString(bytes);
      textBox1.Text += response;
      return response;
      }
    
      return null;
     }
    

     

    neděle 31. října 2010 17:38