Laden...

Wie kann ich nach TCP/IP Verbindungsaufbau auch Daten übertragen?

Erstellt von dev.pr vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.654 Views
D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren
Wie kann ich nach TCP/IP Verbindungsaufbau auch Daten übertragen?

Hallo Leute, ich habe 2 kleine Programme geschrieben, einen Server und einen Client, ich habe den Server laufen auf meinen PC nun möchte ich mich mit meinen Laptop auf dem PC verbinden, klappt auch alles via TCP, nur kann sich jetzt jeder verbinden der die IP und den Port meines PC´s kennt. Deswegen möchte ich im Client ein Textbox als Passwortfeld nutzen, wenn man dann auf senden drückt soll es via tcp an meinen pc gesendet werden und mit dem passwort PC verglichen werden. Wenn es richtig ist bleibt die verbindung, wenn nicht wird sie geschlossen.

Kann mir jemand helfen? habe nur umfangreiche Projekte zur Datenversendung via TCP gefunden, mir reicht ein ganz kleiner leichter Ansatz.

grüße

Never trust a running system.

Youtube

T
2.223 Beiträge seit 2008
vor 6 Jahren

Was genau ist das Problem?
Wenn du weißt, wie die Daten übertragen werden müssen, musst du nur noch deinen lokalen Benutzer abfragen und prüfen ob das PW stimmt.
Beispiele dafür gibt es im Forum + Netz zu hauf.
Diese zu suchen, sollte kein größeres Problem sein oder?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren

Hallo, danke für die schnelle Antwort.
Habe ich vielleicht falsch formuliert, ich weiß nicht wie man Daten übertragt, bekomme es nur hin eine Verbindung aufzubauen.

Ja ich habe auch einiges im Netz gefunden, nur sehr viel umständlicher als ich es benötige, ich bin noch realtiv neu und kann deswegen mit dem meisten Code nicht viel anfangen.

Never trust a running system.

Youtube

16.830 Beiträge seit 2008
vor 6 Jahren

Was genau ist denn das Problem? Wo kommst Du nicht weiter?
Das Forum ist kein kostenloser Code-Generator.

T
2.223 Beiträge seit 2008
vor 6 Jahren

Zusätzlich zu Abts Antwort und Frage, wäre auch dein aktueller Code hilfreich.
Ansonsten sind die Beispiele der Doku von MS ausreichend um mit etwas lesen + testen das Problem zu lösen.
Mit den TCP Klassen aus C# hast du auch bereits einfache Wrapper um die Sockets, die dir schon viel Arbeit abnehmen.
Ansonsten kannst du dort einfach mit Send die Bytes senden und auf Server Seite per Receive dann die Daten vom Client empfangen.
Eigentlich sollte das recht eifach sein.

Aber hier wäre halt ein bisschen Code hilfreich zum zu sehen wo du bist bzw. wo dein Problem liegt.
Eigentlich sind die Beispiele im Netz für einfach TCP Server/Client auch keine große Sache.
Diese bauen teilweise noch auf Socket auf, sind aber im Kern damit schon das Grundgerüst auf dem auch die Wrapper Klassen aufbauen.
Da ich primär noch mit Sockets für TCP/UDP arbeite, kann ich dort auch nur auf die Doku verweisen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

es ist eigentlich ganz einfach:

Wenn man direkt mit Socket arbeitet, verwendet man socket.Send(...)
Wenn man mit TcpClient arbeitet, besort man sich mit client.GetStream() den zugehörigen NetworkStream und verwendet dann stream.Write(...)

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren

Hallo, danke für die vielen Ratschläge, habe mein Problem erkannt, ich habe nie den unterschied zwischen TCPClient und Socket verstanden, deswegen bin ich bei den ganzen Codeprojekten durcheinander gekommen weil ich dachte es ist das gleiche.

Vielen dank!
Den rest habe ich selber herausgefunden

Never trust a running system.

Youtube

D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren

Hallo, hat doch noch nicht ganz geklappt, was mache ich falsch?
Hier mal der Code:

Client:

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || textBox2.Text == "") { c = 1; }

            if (c == 1)
            {
                Log.AppendText("Verbindung nicht möglich. Passwort oder IP-Adresse fehlt\n");
            }
            else
            {
                Log.AppendText("Versuche Verbindung aufzubauen \n");
            }
            if (c == 0)
            {
                try
                {
                    IPAddress adresse = IPAddress.Parse(textBox1.Text);
                    IPEndPoint endpoint = new IPEndPoint(adresse, Convert.ToInt32(textBox3.Text));
                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                    socket.Connect(endpoint);
                    Log.AppendText("Erfolgreich verbunden, Passwort wird geprüft");
                    try
                    {
                        string str = "Testpassword";
                        byte[] byData = System.Text.Encoding.ASCII.GetBytes(str);
                        socket.Send(byData);
                    }
                    catch (SocketException se)
                    {
                        MessageBox.Show("NICHT GEKLAPPT");
                    }
                }
                catch
                {
                    Log.AppendText("PC konnte nicht erreicht werden.");
                }
            }
        }



Serverseite:


{
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 7);
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                socket.Bind(endpoint);
                socket.Listen(0);

                socket.Accept();
                timer2.Start();
                c = 1;
            }
            catch
            {
            }
        }

        private void timer2_Tick(object sender, EventArgs e)
        {

            byte[] buffer = new byte[1024];
            try
            {
                int iRx = socket.Receive(buffer);
            }
            catch
            {
                MessageBox.Show("ERROR SERVER");
            }
            String recievedText = System.Text.Encoding.ASCII.GetString(buffer);
            textBox1.Text = recievedText;
        }
}


Der Client connected mit dem Server und sendet auch die Bytes, jedoch empfängt der Server sie nicht.

Never trust a running system.

Youtube

T
2.223 Beiträge seit 2008
vor 6 Jahren

Die Accept im Server Socket liefert dir dann den Client Socket.
Aus diesem musst du dann deine Daten per Receive abfragen.

Anbei blockiert Accept, weshalb dein Form_Load auch hängen dürfte.
Zusätzlich solltest du bei Listen einen Wert größer 0 mitgeben, sonst kannst du kein Backlog aufbauen und somit nie mehr als eine Verbindung über den Socket verarbeiten, was wahrscheinlich nicht gedacht ist.

Nachtrag:
Dein Socket Receive musst du dann auf deinen Client Socket umstellen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren

Hallo, ja ich weiß das meine Form blockiert, dass ist auch nicht weiter schlimm, denn es soll sich auch maximal nur einer verbinden können.

Vielen dank für deine Tipps, jedoch umsetzen kann ich sie leider nicht so richtig. Was meinst du mit der Socket wird zum Client?

Grüße und danke für die Geduld

Never trust a running system.

Youtube

4.938 Beiträge seit 2008
vor 6 Jahren

s. das Beispiel in Socket.Accept (du brauchst für das Empfangen also 2 Socket (Member-)Variablen).

D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren

Tut mir leid, aber was soll ich auf diesem Beispiel erkennen?

Never trust a running system.

Youtube

T
2.223 Beiträge seit 2008
vor 6 Jahren

@dev.pr
Hatte ich dir geschrieben.
Du musst bei Accept den Client Socket speichern.
Mit diesem musst du dann die Receive Methode aufrufen.
Bisher versuchst du Daten von deinem Server Socket zu empfangen, dieser sendet aber keine und soll seine Daten auch nicht selbst empfangen.

Du musst also den Client Socket in deiner Form speichern und dann von diesem Socket die Daten abfragen.
Schau dir die Doku an, dort gibt es dann auch entsprechende Beispiele bei Send/Receive.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.830 Beiträge seit 2008
vor 6 Jahren

Was T-Virus ausdrücken will:

Du hast einen Socket, der als Kommunikation des Servers gilt, und der Client erhält durch Accept() ein eigenen Socket, über den dann die Kommunikation läuft.
Aktuell hast Du nur den Socket zum Akzeptieren von Verbindungsanfragen.

Mit besseren Bezeichnungen für diesen Fall (aber eigentlich zeigt es das Socket Beispiel aus dem Link bereits):

protected void AcceptMethod(Socket serverSocket)
{
 Socket clientSocket = serverSocket.Accept();
}

Über den serverSocket nimmst Du verbindungen an; und wenn der Client sich meldet, dann akzeptierst Du seine Anfrage und arbeitest mit dem clientSocket weiter.

D
dev.pr Themenstarter:in
22 Beiträge seit 2017
vor 6 Jahren

Ok habe jetzt alles so hinbekommen wie ich es wollte, vielen dank für eure Hilfe und eure Geduld! 👍

Never trust a running system.

Youtube

2.298 Beiträge seit 2010
vor 6 Jahren

Hallo,

hat es einen Grund, dass du direkt auf Sockets arbeitest? Ansonsten kann ich dir [Tutorial] Client-/Server-Komponente über TCP-Sockets als Lektüre empfehlen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |