Ankündigung

Einklappen
Keine Ankündigung bisher.

TCP Verbindung mit C#

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    TCP Verbindung mit C#

    Hallo zusammen,
    ich möchte gerne Variablen und Busdaten mittels TCP auf meinen Windowsrechner übertragen und bin gerade dabei hierfür eine kleines Programm zu schreiben.
    Auf dem EibPC versuche ich dann mittels ConnectTCP eine Verbindung herzustellen - leider ohne Erfolg.

    Was mache ich falsch? Ist die TcpListener Klasse die richtige hierfür?

    Danke


    Code:
    TcpListener server = null;
    try
    {
    // Set the TcpListener on port 13000.
    Int32 port = 13000;
    IPAddress localAddr = IPAddress.Parse("127.0.0.1");
    
    // TcpListener server = new TcpListener(port);
    server = new TcpListener(localAddr, port);
    
    // Start listening for client requests.
    server.Start();
    
    // Buffer for reading data
    Byte[] bytes = new Byte[256];
    String data = null;
    
    
    // Enter the listening loop.
    while (true)
    {
    Console.Write("Waiting for a connection... ");
    
    // Perform a blocking call to accept requests.
    TcpClient client = server.AcceptTcpClient();
    Console.WriteLine("Connected!");
    
    data = null;
    
    // Get a stream object for reading and writing
    NetworkStream stream = client.GetStream();
    
    int i;
    
    // Loop to receive all the data sent by the client.
    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
    {
    // Translate data bytes to a ASCII string.
    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    Console.WriteLine("Received: {0}", data);
    
    // Process the data sent by the client.
    data = data.ToUpper();
    
    byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
    
    // Send back a response.
    stream.Write(msg, 0, msg.Length);
    Console.WriteLine("Sent: {0}", data);
    }
    
    // Shutdown and end connection
    client.Close();
    }
    }
    catch (SocketException e)
    {
    Console.WriteLine("SocketException: {0}", e);
    }
    finally
    {
    // Stop listening for new clients.
    server.Stop();
    }

    #2
    Was geht denn nicht? Kein Verbindungsaufbau?

    Ohne jetzt zur C#-Nachhilfe zu werden:
    Die Klasse passt schon.
    Code:
    TcpListener(localAddr, port);
    wartet nur auf lokale Verbindungen (127.0.0.1). Nimm die auskommentierte Zeile drüber oder verwende die IP des EibPC.

    Edit: nicht die IP des EibPC sondern die IP der lokalen Netzwerkschnittstelle, über die eine Verbindung zum EibPC besteht.

    Auf dem EibPC solltest beim connecttcp() eine 2 als Rückgabewert bekommen haben?
    Zuletzt geändert von foobar0815; 11.02.2021, 17:19.

    Kommentar


      #3
      Ja genau: ich bekomme kein Verbindunsgaufbau und der Rückgabewert von connecttcp ist 2
      Allerdings ist es so gedacht, dass er auf dem localhost "lauschen" soll. Wenn ich die IP vom EibPC angebe wirft er eine Socket Exception

      Kommentar


        #4
        Möchtest du in dem c# Programm auf deinem PC nicht viel mehr einen TCP Client erstellen?

        Kommentar


          #5
          Zitat von Heinze Beitrag anzeigen
          localhost "lauschen"
          Schon klar. Aber wenn du nur auf Verbindungen VON localhost wartest, wird's langweilig.
          Die IP vom EibPC (s. Edit oben) ist natürlich quatsch.

          nimm einfach 0.0.0.0. Wenn du die Verbindungen auf die IP des EibPC einschränken willst, prüfe die Remote-Adresse deines client-Objektes nach dem Verbindungsaufbau.

          Kommentar


            #6
            Ehrlich gesagt verstehe ich es nicht. Wenn ich in C# 0.0.0.0 einsetzte funktioniert das noch. Allerdings was soll dann die Zieladresse vom EibPC sein? Wenn ich da 0.0.0.0 angebe funktioniert das natürlich nicht. Und wenn ich die IP der lokalen Netzwerkschnittstelle in C# einsetze komme ich wieder zur Socket Exception. Übrigens habe verschiedene IPs versucht => immer Socket Exception => ich denke in der Klasse ist die lokale IP gemeint.

            Kommentar


              #7
              Zitat von Heinze Beitrag anzeigen
              Allerdings was soll dann die Zieladresse vom EibPC sein
              Na wenn sich der EibPC zum Server verbinden soll, die externe IP-Adresse des Servers.

              Kommentar


                #8
                Wieso die externe IP? Befinden sich alle im selben Netzwerk. Also wie gesagt: ich bekomme bei connecttcp als Rückgabewert 2 und TCP Listener sagt, dass keine eingehenden Verbindungen bestehen - egal was ich mit den IPs bereits versucht habe.
                Man müsste mal wissen wie connecttcp genau funktioniert und ob der TCP Listener die richtige Klasse ist um mit dem EibPC eine Verbindung aufzubauen.

                Kommentar


                  #9
                  extern = außerhalb des Rechners, nicht außerhalb deines lokalen Netzes.

                  PC: externe IP: 192.168.1.1, interne (im PC) IP: 127.0.0.1 (bzw. das gesamte 127.0.0.0/8 Netz)
                  EibPC: 192.168.1.2

                  PC: TCPListener hört auf 0.0.0.0, IPAddress.Any, oder 192.168.1.1, Port 1234 - hauptsache nicht auf 127.0.0.1, dann könntest du nur von lokal (= im PC) aus verbinden
                  EibPC: connecttcp(1234, 192.168.1.1)

                  Bevor ich mit dem EIbPC teste, würde ich erstmal einen lokalen Verbindungsaufbau testen.
                  Wireshark hilft bei sowas auch. Dann sieht man zumindest, ob eine Verbindungsanfrage kommt.
                  Falls die Verbindungsanfrage des EibPC nicht am PC ankommt, ist vermutlich die Windows-Firewall oder sowas schuld.



                  Zitat von Heinze Beitrag anzeigen
                  um mit dem EibPC eine Verbindung aufzubauen.
                  Es ist die richtige Klasse, um VOM EibPC eine Verbindung aufbauen zu lassen, und die am PC anzunehmen.

                  Wenn du vom PC aus MIT dem EibPC eine Verbindung aufbauen willst, und der EibPC soll sie annehmen, ists falsch. Dann wären wir bei

                  Zitat von tobiasr Beitrag anzeigen
                  Möchtest du in dem c# Programm auf deinem PC nicht viel mehr einen TCP Client erstellen?
                  und nicht bei
                  Zitat von Heinze Beitrag anzeigen
                  Auf dem EibPC versuche ich dann mittels ConnectTCP eine Verbindung herzustellen
                  Zuletzt geändert von foobar0815; 12.02.2021, 09:00.

                  Kommentar


                    #10
                    Gerade geprüft mit folgendem EibPC-Programm:

                    Dazu habe ich noch einen Visu-Button erstellt und mit dem Exterten unter dem Namen "btnConnect" verknüpft.

                    Code:
                    uIp = 192.168.1.1
                    uPort = 13000u16
                    
                    uStatus=255
                    if pbutton(btnConnect, btnConnect_P) == 1 then {
                    uStatus = connecttcp(uPort, uIp);
                    } endif
                    
                    bSende=AUS
                    if uStatus == 0 then {
                    pdisplay(btnConnect, $connected$, LIGHT, ACTIVE, GREY, btnConnect_P);
                    bSende=EIN;
                    } endif;
                    
                    if uStatus != 0 then {
                    pdisplay(btnConnect, $not connected$, LIGHT, ACTIVE, GREY, btnConnect_P);
                    bSende=AUS;
                    } endif;
                    
                    uCounter=0u32
                    if cycle(0,10) then {
                    if bSende then {
                    sendtcp(uPort, uIp, $Paket $ + convert(uCounter, $$));
                    uCounter = uCounter + 1u32;
                    } endif;
                    } endif
                    Wie erwartet kommt folgende Ausgabe des Servers:

                    Waiting for a connection... Connected!
                    Received: Paket 1
                    Sent: PAKET 1
                    Received: Paket 2
                    Sent: PAKET 2
                    Received: Paket 3
                    Sent: PAKET 3
                    Received: Paket 4
                    ...
                    Zuletzt geändert von foobar0815; 12.02.2021, 11:37. Grund: Typo

                    Kommentar

                    Lädt...
                    X