Laden...

Tcp File Starten

Erstellt von binaryblob vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.372 Views
B
binaryblob Themenstarter:in
36 Beiträge seit 2008
vor 9 Jahren
Tcp File Starten

Guten Tag

Ich habe ein Programm das nach einer Tcp Anfrage ein Programm starten soll.
Funktioniert auch soweit. Allerdings kommt es vor, dass das Programm nach mehreren Tagen Dauerbetrieb und Benutzung, auf einmal das definierte Programm nicht mehr startet (allerdings die Tcp Verbindung kann noch aufgebaut werden).

Was könnte das Problem sein? Oder hat jemand ein Stück Code, der stabil läuft?


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;
using TcpFileStarter.Preferences;
using System.Threading;

namespace TcpFileStarter
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            BeginListening();
        }

        private void BeginListening()
        {
            TcpListener server = new TcpListener(new  IPEndPoint(IPAddress.Any, 45555));

            server.Start();

            while (true)
            {
                byte[] buffer = new byte[12];
                TcpClient client = server.AcceptTcpClient();
                NetworkStream stream = client.GetStream();
                stream.ReadTimeout = 5000;

                try
                {
                    stream.Read(buffer, 0, buffer.Length);

                    if (Encoding.ASCII.GetString(buffer) == "EXECUTE_PROG")
                    {
                        Process.Start(new ProcessStartInfo(ConfigurationHandler.Configuration.FilePath));

                        stream.Close();
                        client.Close();

                        Thread.Sleep(20000); //Wenn Button mehrmals hintereinander, 20s warten...
                    }
                    else
                    {
                        stream.Close();
                        client.Close();
                    }
                }
                catch 
                {
                    stream.Close();
                    client.Close();
                }
            }
        }
    }
}

Gruss blob

Gelöschter Account
vor 9 Jahren

Ist der CodeSchnipsel nur ein Beispiel oder handelt sich tatsächlich um eine WindowsForms Anwendung? (Wenn ja warum machst du eine WF Anwendung zu einem Server?) So oder so gilt es hier erstmal die Frage zu klären ob es überhaupt zu dem Aufruf kommt. Hast du das hinreichend geprüft? Mach dir bitte klar das der TcpListener und auch der TcpServer nicht bemerken wenn die Verbindung auf einmal geschlossen wird. Dein Konzept geht ja dahin das du die einzelne TCP Verbindung über die Tage/Wochen aufrecht erhälst, das funktioniert so aber derzeit im Moment auf keinen Fall. (Sidestory: Dafür hat man die Service Architektur erfunden)

Du kannst, selbst als Client, nicht eine einzelne TCP Verbindung bist zum St. Nimmerleinstag offen halten, du könntest deine Idee mittels einiger (.NET Framework) LowLevel Methoden so umstellen das du als echter Echo Server unterwegs bist. Mit dem Stream basierten High Level API's wird das allerdings nix,die sind grundsätzlich zugriffsbasiert. Jede Suchmaschine deiner Wahl wird dir zu C# Tcp Server sicher genügegend Ergebnisse liefern. Fragen zum Verständniss wie TCP funktioniert werden hier sicher gerne beantwortet.

B
binaryblob Themenstarter:in
36 Beiträge seit 2008
vor 9 Jahren

Hallo

Ist ein Beispiel, das ich momentan so teste.

Nein der TcpClient sendet nur das Paket und schliesst dann die Verbindung wieder... Und das funktioniert ja alles auch perfekt, auch die ganze TCP Sache... Allerdings wird der Prozess aufeinmal nicht mehr ausgeführt... Das ist das Problem.

Gruss blob

Gelöschter Account
vor 9 Jahren

Vorab möchte ich dich bitten vor Process.Start mal irgendeine Log Anweisung zu implementieren die sicher stellt das der Call auch wirklich hier ankommt. Console.WriteLine oder File.AppendAllText...was immer du willst. Ansonsten kann ich mir nur noch vorstellen das deine Anwendung vom BS gerade unterbrochen oder schlafen geschickt(suspendet) wurde, da ich aber nicht weiss um was für ein Program es sich hier handelt oder welches BS gerade läuft, ist das natürlich reine Spekulation. Ich bleibe im Moment immer noch bei meiner Version das du das mit dem TcpListener falsch verstanden hast, Ehrlich gesagt kenne ich die High Level Klassen für TCP in .NET nicht wirklich aber ich gehe mal davon aus die haben irgendeinen Timeout. "Die ganze TCP Sache..." Wenn du willst wird dir das hier erkärt, eine einfache Lösung gibt es aus meiner Sicht hier nicht. Die Mühe musst du dir dann halt machen,,,,

189 Beiträge seit 2014
vor 9 Jahren

Hallo binaryblob,
wenn du den Code so testest wie er da steht, würde ich einfach mal im Fall einer Exception diese im catch-Block fangen und ausgeben / mitloggen.
Vermutlich kommst du irgendwann in einen Zustand, wo du in die catch-Anweisung rutschst (z.B. defekter Streaminhalt, ...).
Aber wenn die catch-Anweisung keine Info ausgibt, siehst du weder, dass ein Problem besteht, noch welches es ist.
BTW: Das Arbeiten mit using-Anweisungen finde ich irgendwie schöner und sicherer als Streams und Clients per Close-Methode zu beenden.

Grüße

Ezio

B
binaryblob Themenstarter:in
36 Beiträge seit 2008
vor 9 Jahren

Programm wurde noch etwas angepasst und läuft jetzt (Fehler Behandlung).

Auf einem Server ist das Problem aber immer noch, denke ist ein Systemproblem, auf anderen läuft es perfekt.

Gruss blob

Gelöschter Account
vor 9 Jahren

Oder hat jemand ein Stück Code, der stabil läuft?

Das Scs Tcp Framework ist nach meiner Ansicht nahezu perfekt. Könnte man kaum besser machen.

A Complete TCP Server/Client Communication and RMI Framework - Usage