Laden...

Forenbeiträge von Dasart Ingesamt 25 Beiträge

29.09.2010 - 13:06 Uhr

Danke aber das Problem hat sich heute aufeinmal von selbst gelöst o.O...

Hatte wirklich alles richtig eingestellt von Port forwarding bis zur Firewall.
Anpingen konnte ich die IP durch den Port auch und telnet gab ebenfalls keine Probleme.

Die Ip war eine Statische.

Ich hoffe nur das, dass das Problem nicht irgendwann unerwartet wieder auftaucht...

28.09.2010 - 19:49 Uhr

Ich habe beides Implementiert und es funktioniert wunderbar..

28.09.2010 - 19:30 Uhr

Wie schon jetzt das zweite mal zitiert :

Am Port kann es auch nicht mehr liegen, der ist freigegeben

Damit meine ich meinen Router 😉
Das mit der Firewall war nur eine Randnotitz, damit diese eventualität ausgeschlossen werden kann.

28.09.2010 - 14:10 Uhr

Am Port kann es auch nicht mehr liegen, der ist freigegeben

Auch an Firewall kann es nicht liegen, am Router ist sie aus und die Windows eigene, da hab ich den Dienst gestoppt

27.09.2010 - 22:16 Uhr

Guten Tag

Ich habe ein Problem :

Mein Programm verbindet sich zwar zu localhost und zu meiner Lan Adresse (192.168.2.100) Aber sobal ich versuche über meine reale IP Adresse zu Connecten :
80.145.XXX.XXX

Gibt es Probleme.
Am Port kann es auch nicht mehr liegen, der ist freigegeben hier der Code :

try
                {
                    IPHostEntry hostinfo = Dns.GetHostEntry(Host);
                    IPEndPoint ep = new IPEndPoint(hostinfo.AddressList[0], 1050);
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket.Connect(ep);
                    online = true;
                }
                catch (Exception)
                {
                    Thread.Sleep(10000);
                }

"Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat 80.145.XXX.XXX:1050"

Hier wird die Verbindung angenommen :

 port = Convert.ToInt16(tbxPort.Text);
                listener = new TcpListener(IPAddress.Any, port);

                try
                {
                    listener.Start();
                    online = true;
                    Thread GettingClients = new Thread(GetClients);
                    GettingClients.Start();
                    btnListen.Text = "Stop Listen";
                    clients = new List<Client>(100);
                    tmrIsOnline.Enabled = true;
                }
                catch (Exception)
                {
                    throw;
                }

UND

if (online && listener.Pending())
                {
                    Socket socket = listener.AcceptSocket();
                    Thread StartingClient = new Thread(StartClient);
                    StartingClient.Start(socket);              
                }
26.09.2010 - 21:46 Uhr

Vielen Vielen Dank das reicht locker aus 😃

26.09.2010 - 21:37 Uhr

Danke, da bin ich grade auch drauf gekommen.

Was würde ich nur ohne dieses Forum tuhn ? 😉

Eine Frage hätte ich aber noch ist ein Integer ausreichend für die Länge eines Bildes und Dateien im 5MegaByte bereich ?

26.09.2010 - 21:26 Uhr

Also ich habe einfach mal einen Text mit einer Länge von 1250 getesten,
Bei solch großen Texten, wird die Länge nicht mehr richtig angegeben, dann bekomme ich im Byte Array so sachen wie :
length[0] = 230;
length[1] = 10;
length[2] = 0;
length[3] = 0;

Hier die Sendung :

byte[] length = BitConverter.GetBytes(textBox1.Text.Length);

Hier wirds empfangen :

                    do{
                        buffer = new byte[1];
                        socket.Receive(buffer, 1, 0);
                        msgLength += Convert.ToInt32(buffer[0]);
                    }while(buffer[0]!=0);
26.09.2010 - 21:00 Uhr

Guten Tag

Ich bins (leider) mal wieder.

Wie schaffe ich es die länge eines beliebigen datentypes (z.B. text) in bytes zu bekommen ?

Bissher habe ich es so gemacht :

byte[] length = BitConverter.GetBytes(textBox1.Text.Length);

Doch wenn der Text in der Textbox zu lang wird funktioniert es leider nicht mehr.
Gibt es da einen besseren Weg ?

Später muss ich nämlich auch die länge von Bildern und normalen Dateien in bytes bekommen.

Der Zweck ist mein Protokoll :
[Kommando][Länge][0][Daten]
Kommando = 1 Byte
Länge = x Bytes (alle bytes werden später wieder addiert und ich habe wieder die richtige länge der Daten)
0 = "Hier hört die Länge auf und es fangen die Daten an"
Daten = x Bytes

26.09.2010 - 20:55 Uhr

Jap das ist das Problem in der Doku von Socket steht sowas nicht drin, ich nehme also auch an, dass es anders nicht zu bewerkstelligen ist.

Aber das tut nämlich nicht mehr zur Sache, ich habe es so gelöst :

Sobald Daten gesendet werden steht der "Pinger" still.
Um dann noch zu vermeiden, dass noch während des Empfanges der Daten null bytes gesendet werden, wird erst wieder gepingt, wenn alle Daten wirklich angekommen sind.

Also
Daten verden gesendet Pinger wird stillgelegt.
Daten werden empfangen und beim erfolgreichen empfangen wird ein nullbyte zurückgesendet, damit klar wird, dass wirklich alle daten jetzt drüben sind.
Empfängt der Client jetzt dieses nullbyte weiß er das alle Daten erfolgreich gesendet wurden und fängt wieder an alle 10 sekunden zu pingen.

26.09.2010 - 18:07 Uhr

Danke so werde ich es lösen.

26.09.2010 - 17:41 Uhr

Naja eigentlich habe ich 2 Thread die Daten auf die Leitung legen.

Einmal der "Pinger" und einmal der richtige Sender.

Das ich während des normalen sendeverlaufs keine Pings schicke ist zwar gut, ich muss aber anfangs trotzdem ein paar nullbyter in der Leitung rauslöschen, da ja solange keine Daten gesendet werden, trotzdem Pings geschickt werden.

26.09.2010 - 17:28 Uhr

Guten Tag

Wie schaffe ich es mit dem Socket zu prüfen ob der Client/Server noch online ist ?

Meine Momentane lösung ist, dass ich nullbytes schicke und bei einer Exception weiss, dass der Server/Client nicht mehr online ist.

Das funktioniert zwar aber verursacht das Problem, das die nullbytes in den Datenstrom schleichen und somit die eigentlich gesendeten Daten verfälscht.

Momentan löse ich dieses Problem, indem ich einfach den Buffer durchegehe und die nullbytes lösche. Wenn ich aber später Binär Daten sende könnte das zu Problemen führen, da diese ja auch nullbytes enthalten können, DIE ich aber dann lösche wegen den Ping nullbytes.

Gibt es da nicht eine elegantere Lösung ?
Danke

26.09.2010 - 17:14 Uhr

Danke werde mich gleich mal ransetzten und es damit versuchen.

26.09.2010 - 16:03 Uhr

Guten Tag

Ich Programmiere gerade ein Netzwerkprogramm. Nun bin ich schon so weit das sich Verbindungen zwischen den Sockets aufbauen, dass Textnachrichten gesendet werden können, dass durch Senden eines bytes überprüft wird ob Server/Client noch online sind.

Das erste Problem habe ich schon gelöst. Dabei handelte es sich darum, das die "Pings" also null byter zwischen den Normalen bytes der Nachricht standen, beim Empfangen, geh ich einfach den kompletten Buffer durch und kopiere alle bis auf die "null bytes" in ein anderes Array.

Aber nun ein Problem.

Ich Prüfe immer alle 1000ms ob Daten zum "Abholen" bereit sind. Das Funktioniert zwar bei Textnachrichten ziemlich gut aber wenn ich Daten Senden will bekomm ich Probleme, weil in 1000ms einfach nicht alle Daten geschickt werden können.

Mein Ansatz ist so :
Ich habe ein Protokoll mit Volgendermaßener "Syntax"
[Kommando][Länge der Nachricht][Eigentliche Nachricht/Datei]
Kommando = 1 byte
Länge der Nachricht = 4bytes
Nachricht = Variable

Das Protokoll ist nicht das Problem aufzustellen, funktioniert bei Textnachrichten auch gut, ich müsste nur wissen wie ich es schaffe wirklich auf Alle Daten zu warten und bei zuvielen Daten die überstehenden Daten wieder in den "normalen" buffer zu schreiben.

Wie löse ich das Problem am besten ?

22.09.2010 - 19:57 Uhr

Ahhh o.K das ergibt Sinn. War grade zu aufgeregt um es selber zu merken 😃

Vielen Vielen Dank an MarsStein, der mich aus der schaffenskriese gezogen hat. 😃

22.09.2010 - 19:50 Uhr

Vielen Vielen Dank.

Wenn ich die Endlosschleife rausnehme funktioniert es. Aber dann habe ich ein Problem weil die Endlosschleife von nöten ist um die Daten in abständen zu empfangen.

Wie könnte ich dieses Problem lösen, hat da einer eine Idee ?

22.09.2010 - 15:14 Uhr

Danke aber daran kann es auch nicht liegen, da wirklich ALLE Elemente im Array null bleiben..

Langsam bin ich echt ratlos o.O

21.09.2010 - 18:33 Uhr

Danke erstmal.

Natürlich bezeihen sich meine aussagen nicht auf das Komplette Array, sondern wirklich auf die einträge.

Sprich ich Lasse einen Client connecten, Aber trotzdem bleibt client[0] null.
Da hilft mir dann die foreach schleife auch nicht sehr viel.

Die definition der Client Klasse ist :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Windows.Forms;

using System.Threading;
using System.Net.Sockets;
using System.Net;
using Remote_Accses_Tool;


public class Client
{
    private int Status;
    private Socket socket = null;
    private byte[] buffer = null;
    public string IP = "";
    private Client_Form formular;


    public Client(Socket sock,Client_Form f)
    {
        socket = sock;
        IP = Convert.ToString(socket.LocalEndPoint);
        this.formular = f;
        sendToLog("Client conntected through: " + Convert.ToString(socket.RemoteEndPoint));
        RecieveData();
    }

    public void RecieveData()
    {
        while (true)
        {
            if (socket.Available > 0)
            {
                buffer = new byte[socket.Available];
                //TODO
            }                  
        }  
    }
    public void SendData(byte[] sndBuffer)
    {
        //TODO
    }

    public void sendToLog(string Text)
    {
        MethodInvoker listV = delegate
        {
            formular.updateLog(Text + "\r\n");
        };
        formular.Invoke(listV);
    }
    public void Close()
    {
        socket.Close();
    }
}

21.09.2010 - 16:32 Uhr

Guten Tag

Mein Projeckt ist schon fast Fertig, doch eine Hürde stellt sich mir noch.
Folgendes :
Ich habe eine Client Klasse die alle nötigen Funktionen und Informationen des Sockets beinhalten. Um einzelne Clients anzusprechen habe ich ein Array von dieser Klasse erstellt :

private Client[] clients = new Client[maxClient];

Bei ankommender Verbindung wird nun ein neuer Client erstellt und in dieses Array geschrieben.

clients[connections] = new Client((Socket)socket, this);

Anmerkung : Dieser Vorgang geschieht in einem anderen Thread.

Nur bleiben die Einträge im Array immer NULL.

Somit bekomme ich natürlich immer Errors beim Beenden der Verbindungen

clients[i].Close();

Meine Frage nun warum ? Kann mir da einer Weiterhelfen ?

Hier nochmal der komplette Code:
[SPOILER]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Net.Sockets;
using System.Windows.Forms;
using System.Net;
using System.Threading;



namespace Remote_Accses_Tool
{
    public partial class Client_Form : Form
    {
        private static int maxClient = 100;
        private bool online = false;
        private int port = 0;
        private Client[] clients = new Client[maxClient];
        private TcpListener listener;
        private int connections = 0;

        public Client_Form()
        {
            InitializeComponent();
        }

        private void btnListen_Click(object sender, EventArgs e)
        {
            if (online)
            {
                online = false;
                for (int i = 0; i <= connections; i++)
                {
                    clients[i].Close();
                }
                listener.Stop();
                btnListen.Text = "Start Listen";
            }
            else 
            {
                port = Convert.ToInt16(tbxPort.Text);
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");
                listener = new TcpListener(localAddr, port);

                try
                {
                    listener.Start();
                    online = true;
                    Thread GettingClients = new Thread(GetClients);
                    GettingClients.Start();
                    btnListen.Text = "Stop Listen";
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        private void GetClients()
        {
            while (online)
            {
                while (online && !listener.Pending())
                {
                    if (!online) { return; } //Gibt sonst eine Exception da die Schleife nicht funktioniert ohne listener
                    Thread.Sleep(200);
                }
                Socket socket = listener.AcceptSocket();
                Thread StartingClient = new Thread(StartClient);
                StartingClient.Start(socket);
                Thread.Sleep(100);
                connections++;
            }
        }

        private void StartClient(object socket)
        {
            clients[connections] = new Client((Socket)socket, this);
        }

        public void updateLog(string Text)
        {
            tbxLog.Text += Text;
        }
    }
}

[/SPOILER]

19.09.2010 - 19:33 Uhr

Vielen Danke so klappt es wunderbar 😃

19.09.2010 - 18:41 Uhr

Guten Tag

Ich sitze grade an einem Problem. Folgendes ich erhalte Daten die werden in ein byte Array geschrieben. Das erste byte enthält die Nummer des Komandos z.B. 5 für eine Textnachricht.

Ich möchte nun das erste byte aus dem array löschen. So direckt habe ich das aber nicht hinbekommen, also dachte ich mir Kopier das array doch einfach in ein anderes byte array und setzt den index auf 1. Doch es klappt nicht. Mache ich das passiert nämlich nix und ich erhalte in meiner Textbox keinen Text.

                if (buffer[0] == 6)
                {
                    byte[] writer = new byte[buffer.Length+1];
                    buffer.CopyTo(writer, 1);
                    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
                    textBox1.Text += enc.GetString(writer);
                }

Setze ich aber komischer weise den Index beim CopyTo auf 0 funktioniert es, aber dann habe ich wieder das lästige "Kommando byte"

Meine Frage :
1.) Bekomme ich das erste byte aus dem Array vllt sogar viel einfacher entfernt ?
2.) Wenn nicht was ist an meinem Code falsch ?

Danke

18.09.2010 - 16:58 Uhr

Vielen Vielen Dank.

Ja aber ich würde gerne alles selber schreiben, um davon zu lernen 😃

18.09.2010 - 16:41 Uhr

Danke schoneinmal.

Wie konvertiere ich denn ein int in ein byte[4]. So das ich aber auf jedes einzelne byte noch zugriff habe ? Vllt sehe ich ja grade den Wald vor lauter Bäumen nicht.

Der Sinn des ganzen ist, das ich mich an ein Protokoll rantaste für ein späteres Chat Programm. Um das ganze zu Testen benutze ich einfach zwei executables.

die 5 byte stellen dann später die Länge der Nachricht oder der gesendeten Datei da.
Die wird ausgelesen und ich kann effektiver mit den ankommenden Daten arbeiten.

18.09.2010 - 15:46 Uhr

Guten Tag

Ich sitze grade hier an einem Problem und komme nicht weiter.

Was ich vorhabe :

Ich würde gerne einen Variablen Integer in genau 5 bytes schreiben und diese 5 bytes ans Ende einer bestehenden Datei anfügen.

Nur wie bekomme ich diesen Integer in 5 bytes verteilt ? Da dieser Integer Variabel ist muss ich irgendeine vorgehensweise schreiben, die diesen Integer in genau 5 bytes verteilt nur wie ?

Mein bisheriger ansatz :

            int laenge = 50; //Ein Beispiel später wird dieser int Variabel sein
            byte[] lang = new byte[5];
            lang = Convert.ToByte(laenge); //Genau hier besteht das Problem ich kann ja nicht so einfach in ein Array schreiben

            // Hänge bytes an die Datei an
            FileStream fs = File.Open(DLG.FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            {
                BinaryWriter bw = new BinaryWriter(fs);
                fs.Position = fs.Length + 1;
                bw.Write(lang);
                bw.Flush();
                bw.Close();
            }

Bin über jede Hilfe dankbar 😃