Danke für die vielen Hilfen und Denkansätze.
Ich habe meinen eigentlichen Fehler gefunden.
Bei dem Client habe ich zum senden eine fixe Byte Länge angegeben
Ist:
stream.Write(send, 0, 1024);
Soll:
stream.Write(send, 0, send.Length);
Danke für die Links, ich habe heute morgen in der Forensuche immer "Kein Ergebnis" angezeigt bekommen.
Ich versuche momentan alles Lokal auf dem Rechner über die 127.0.0.1. Firewall sollte dann normal ja kein Thema sein, oder?
Zur Thematik async/await, ich werde den Task wohl besser in einem eigenen Thread umsetzen, da ich beim empfangen ein Event auslösen will und nicht auf eine Rückgabe der Methode warten will. Somit würde await rausfallen, da die Abfrage nach neuen Nachrichten ja kontinuierlich in der while Schleife läuft und nicht beendet wird.
Ich hoffe Ihr reißt euch jetzt nicht die Haare wegen mir aus 😄
Danke für die schnelle Antwort.
Ich versuche nun die empfangenen Daten direkt wieder an den Client zu senden. Leider tritt der Fehler schon beim lesen des Streams im Server auf.
Wenn ich keinen ReadTimeout definiere wird das Stream.Read nicht beendet. Fehlt hier vielleicht ein Zeichen, dass dem Read Befehl anzeigt, dass der Stream zu ende ist?
Guten Morgen, ich habe mir eine kleine TCP Klassenbibliothek erstellt, leider bekomme ich bei dem lesen des Streams folgende Exception:
System.IO.IOException: "Von der Übertragungsverbindung können keine Daten gelesen werden: 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."
Könnt Ihr mir einen Tipp geben, wo mein Problem liegt?
Danke im voraus.
Server.cs:
using System;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace TCP
{
public class Server
{
public event MessageRecived NewMessage;
public delegate void MessageRecived(string Message);
bool _running;
TcpListener Listener;
public bool Running
{
get
{
return _running;
}
set
{
_running = value;
}
}
public Server(int Port)
{
Listener = new TcpListener(IPAddress.Any, Port);
}
public async void Start()
{
try
{
Listener.Start();
Running = true;
while(Running)
{
var client = await Listener.AcceptTcpClientAsync();
Task.Run(() => HandleClient(client));
}
}
catch(SocketException)
{
throw;
}
}
public void Stop()
{
Listener.Stop();
Running = false;
}
private void HandleClient(TcpClient Client)
{
NetworkStream Stream = Client.GetStream();
while(Client.Connected)
{
byte[] msg = new byte[1024];
Stream.ReadTimeout = 250;
Stream.Read(msg, 0, msg.Length);
String message = Encoding.UTF8.GetString(msg);
NewMessage?.Invoke(message);
}
}
}
}
Client.cs:
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace TCP
{
public class Client
{
TcpClient client;
IPAddress ip;
int port;
public Client(IPAddress IP, int Port)
{
this.ip = IP;
this.port = Port;
client = new TcpClient();
}
public bool SendMessage(string Message)
{
bool succsess = false;
if (!client.Connected)
connect();
if(client.Connected)
{
NetworkStream stream = client.GetStream();
byte[] send = Encoding.UTF8.GetBytes(Message);
stream.Write(send, 0, 1024);
stream.Flush();
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
succsess = true;
}
return succsess;
}
void connect()
{
client.ConnectAsync(ip, port);
}
}
}
Ich werde mich darin einlesen. Auf jeden Fall muss ich euch ein riesiges Lob und Dankeschön aussprechen. Genau das war der Fehler und nun läuft es wie es soll. Danke an auch alle und gute Nacht.
Gruß
Robin
Sorry für die doofe frage, aber warum geht es nur nicht, wenn Windows das Programm automatisch startet. Wenn ich das Programm manuell starte geht es ohne auch nur ein Parameter geändert zu haben? Zumal ich das Programm über Ausführen Win-R mit genau dem dem gleichen Pfad, wie in der Registry hinterlegt, aufrufe.
Gruß
Robin
Ich habe das File im selben Ordner wie das Programm und rufe im Programm dieses über die Working Directory + Datei auf. Das seltsame ist das vom "autostart" die XML nicht eingelesen werden kann, wenn ich dann aber direkt im Anschluss das Programm manuell ausführe funktioniert alles reibungslos.
Hey danke für die schnelle Antwort.
Zur registry: USR:Software\Microsoft\WindowsNT\CurrentVersion\Winlogon dort unter Shell habe ich den Explorer entfernt und mein Programm eingefügt.
Das Programm startet auch, aber die XML Datei wird nicht gefunden.
Ich möcht bewusst den Explorer nicht starten, da es ein kassensystem werden soll und der Zugriff auf das File System nicht gestattet sein soll.
Wenn ich das Programm dann manuell starte läuft es wie gesagt tadellos.
Gruß
Robin
verwendetes Datenbanksystem: <XML>
Hallo,
ich habe ein Programm geschrieben, welches ich als Shell in der Registry festgelegt habe.
Mein Problem ist, dass beim Starten die XML-Datei nicht gefunden wird.
Habe jetzt schon eine 5sekündige Schleife eingebaut in der ich überprüfe ob das File vorhanden ist. Diese bleibt erfolglos.
Starte ich das Programm über den TaskManager funktioniert es aber ohne Probleme.
Wer kann mir einen Tipp geben?
Gruß
Robin