Laden...

Problem mit leerem Datenpacket?

Erstellt von jstuch vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.529 Views
J
jstuch Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren
Problem mit leerem Datenpacket?

Hi,

das hier ist eine funktion in meiner Server Klasse. Diese wird als seperater Thread gestartet.


        // ########################################################
        // Desc: Funktion um Daten zwischen Client über den 
        //       Proxy (Das Prog hier) und dem Server auszutauschen
        // Mods: 
        // ########################################################
        private void transfer()
        {
            this._Client_to_Server = new TcpListener(IPAddress.Any, 6809);
            this._Client_to_Server.Start();

            do
            {
                bool iHadWork = false;
                // Schauen ob Clients anfragen
                if (this._Client_to_Server.Pending())
                {
                    TcpClient client = this._Client_to_Server.AcceptTcpClient();
                    this._HtClients.Add(client, client.GetStream());
                    iHadWork = true;

                    this._Server_To_Server = new TcpClient();
                    this._Server_To_Server.Connect(_RemoteServer, _Port);
                    this._Server_To_Server_Stream = this._Server_To_Server.GetStream();
                }
                else
                {
                    //prüfe ob für offene Clients Daten da sind
                    foreach (TcpClient client in this._HtClients.Keys)
                    {
                        NetworkStream _Client_To_Server_Stream = this._HtClients[client] as NetworkStream;
                        if (_Client_To_Server_Stream.DataAvailable)
                        {
                            //Transfer von Client über Proxy zum Server
                            byte[] bytes = new byte[client.ReceiveBufferSize];
                            _Client_To_Server_Stream.Read(bytes, 0, client.ReceiveBufferSize);
                            _Server_To_Server_Stream.Write(bytes, 0, client.ReceiveBufferSize);
                            iHadWork = true;
                        }

                        if (_Server_To_Server_Stream.DataAvailable)
                        {
                            // Transfer von Client über Proxy zum Server
                            byte[] bytes = new byte[_Server_To_Server.ReceiveBufferSize];
                            _Server_To_Server_Stream.Read(bytes, 0, _Server_To_Server.ReceiveBufferSize);
                            _Client_To_Server_Stream.Write(bytes, 0, _Server_To_Server.ReceiveBufferSize);
                            iHadWork = true;
                        }
                    }
                }
                if (!iHadWork)
                {
                    Thread.Sleep(100);
                }
            } while (!this._ListenerStop);

            foreach (TcpClient client in this._HtClients.Keys)
            {
                NetworkStream ns = this._HtClients[client] as NetworkStream;
                ns.Close();
                client.Close();
            }
        }

Das funktioniert so weit auch schonmal. Ich werde nach einer kurzen Zeit aber vom Server getrennt. Das scheint mir an folgendem zu liegen.

Monitor per Etheral.

.
....
$CQEDDK_OBS:SERVER:IP
.................................................. -> und noch mehr Punkte.
#TMserver:EDDK_OBS:hereby

Da scheint anscheind der das Packet leer zu sein. Woran köönte das liegen? und Wie kann ich das am besten unterbinden?

Das war Das. Ich hab totale Probleme hier ein Event einzubauen. Ich hab hier im Forum schon vieles gelesen. Ich bekomm das einfach nicht hin. Ich will aus dieser Klasse im Form1 eine Listbox mit dem Inhalt füllen. Kann mir da einer helfen?

mfg

F
529 Beiträge seit 2003
vor 18 Jahren

Auf deine ersten beiden Fragen habe ich keine Lösung. ABer ich kann dir eventuell weiterhelfen den Fehler selbst zu finden:

a) Mach bitte aus der Funktion eine(mehrere) Klassen. Oder zumindest mehrere Funktionen. Es ist nämlich als Außenstehender nicht leicht, bei dem Code durchzublicken.

b) Warum verwendest du zwei Verbindungen? Dient dein Programm nur als Brücke zu einem weiteren Programm oder baust du zwei Verbindungen auf damit du auf einer sendest und auf der anderen empfängst? Hast du eigentlich den selben Code auch auf der Gegenseite laufen?

Aber bei den Events kann ich dir helfen.

Du fügst in der Klasse über deiner Funktion in etwa sowas ein:


public event EventHandler OnMessageArrive;

Und dann in deiner Funktion an der Stelle, an der du z.B. eine neue Meldung empfangen hast:


if(this.OnMessageArrive != null)
    this.OnMessageArrive(message, new EventArgs());

Das ist die einfachste Lösung einen Event zu realisieren. Aber auch die unschönste. Du missbrauchst das Feld sender quasi um deine eigene Meldung zu übertragen. Falls du das so nicht machen willst, musst du dir eine Klasse und ein Delegate definieren. Dann kannst du so viele Daten mit einem Event übertragen, wie du möchtest.

Besuchen sie das VisualC++ - Forum

J
jstuch Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

Das Programm fungiert wie du richtig erkannt hast als Brücke.
Ein Client (nicht von mir) verbindet über mein Programm zu einem Server (nicht von mir) im Internet.
Da ich aber mit einem weiteren Programm (von mir) die Daten auch brauche, lese ich die einfach an der Brücke aus.
So hab ich mir das jedenfalls gedacht. Ich denke auch, dass das funktionieren wird.

Mit den Events werde ich jetzt mal schauen.

danke

J
jstuch Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

wenn ich das event nutze um im mainform was zu ändern, dann muss ich ja was mit begininvoke machen.


        public void ThisMyEvent(string value)
        {
            //listBox1.Items.Add(value);
            listBox1.BeginInvoke(
        }

Kann mir jemand sagenwas da hin muss?

F
529 Beiträge seit 2003
vor 18 Jahren

void ThisMyEvent(object sender, EventArgs e)
{
    if (this.InvokeRequired)
    {
          object[] args = { sender, e };
          this.Invoke(new EventHandler(this.ThisMyEvent, args);
          return;
    }
    //Hier beliebigen Code einfügen
}

Also, die Funktion die per Event aufgerufen wurde überprüft, ob sie sich invoken muss. Wenn nein gehts ganz normal weiter. Wenn ein Invoke durchgeführt werden muss, dann wird die Funktion einfach mit den selbigen Parametern aufgerufen. Aber vom richtigen Thread aus.

Wenn du dein Programm als Brücke zwischen zwei anderen verwendest gehe ich davon aus, dass du keinen Fehler im Programmablauf hast, sondern dass einfach was wichtiges dem anderen Programm fehlt, sodass das andere Programm die Verbindung wieder beendet.
Wie ich das sehe, gehst du ja stur die Packete zwischen den beiden Applikationen routen und greifst sie halt noch ab.
Vielleicht müsstest du das erstmal nur mit einem Programm machen. Also so, dass nur ein Programm zu deinem Programm verbinden kann. Später kannst du ja das andere noch dazu bauen. Wichtig ist, dass du deinen Quelltext erstmal von sinnlosem Zeug fern halten musst. So kannst du nämlich Fehler ausschließen.
Vielleicht machst du erstmal nur ein einfaches Konsolenprogramm, das nichts anderes tut, als die Verbindung zu brücken.

Ich hoffe doch, du hast nichts böses im Sinn 😁

Besuchen sie das VisualC++ - Forum