myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Netzwerktechnologien (https://www.mycsharp.de/wbb2/board.php?boardid=28)
--- ClientSocket.ReceiveBufferSize wird nicht richtig erkannt (https://www.mycsharp.de/wbb2/thread.php?threadid=121684)


Geschrieben von Heppy am 16.03.2019 um 10:48:
  ClientSocket.ReceiveBufferSize wird nicht richtig erkannt
Hallo zusammen,
ich hab da mal ein klaeines Problem und wäre für jede hilfe dankbar.
Derzeit versuche ich eine einfach Verbindung zwischen einem Clienten und einem Server zu Programmieren und darüber eine Nachricht zu Senden. Die Verbindung kann ich aufbauen ohne Probleme auch das Senden klapt recht gut, jedoch habe ich beim Empfangen der Nachricht das Problem das ich es nicht schaffe nur die gesendet nachricht zu empfangen.

Code Server:

C#-Code:
private void AcceptCallback(IAsyncResult AR)
{
    try
    {
        StatusHinzufügen("Client hat sich verbunden");
        _ClientSocket = _ServerSocket.EndAccept(AR);
        _buffer = new byte[_ClientSocket.ReceiveBufferSize];
        Trace.TraceInformation(_ClientSocket.ReceiveBufferSize.ToString());
        _ClientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
    }
    catch (Exception ex)
    {
        Trace.TraceInformation(ex.Message);
    }
}

private void ReceiveCallback(IAsyncResult AR)
{
    try
    {
        StatusHinzufügen("Daten vom Clienten empfangen");
        string text = Encoding.ASCII.GetString(_buffer, 0, _buffer.Length );
        StatusHinzufügen(text);
    }
    catch (Exception ex)
    {
        Trace.TraceInformation(ex.Message);
    }
}

Ich denke das mein Problem ist das

C#-Code:
_buffer = new byte[_ClientSocket.ReceiveBufferSize];

die buffer größe IMMER auf 65536 legt und nicht auf die größe der tatsächlich zu empfangenden nachricht. Ich habe es bereits mit einem von anderen Programmierten Clienten versucht und auch mit unterschiedlich langen nachrichten aber immer das gleich.

Empfangen wird dann halt <Nachricht><unglaublich viele nicht lesbare zeichen>

Also die eigentliche frage die sich mir stellt ist wie kann ich nur die nachricht empfangen welche ja keine feste länge hat?

Danke euch vielmals im vorraus für eure antworten.


Geschrieben von Heppy am 16.03.2019 um 11:11:
 
Vielleicht suche ich auch an der falschen stelle, vielleicht ist es auch ein problem mit Asyncronen Funktionen und der übergabe an die UI aber dann wes ich noch nicht wie ich das umgehen soll.
So das dann in der variable text auch nur die ampfangene nachricht steht


Geschrieben von Th69 am 16.03.2019 um 11:25:
 
Hallo,

sieh dir genau das Beispiel unter  Verwenden von asynchronen Clientsockets an. Beachte, daß du innerhalb der Callback-Methode die Methode  EndReceive(...) aufrufen mußt, welche dir dann die Anzahl der gelesenen Bytes zurückgibt.

Edit:
Unter  Asynchronous Client/Server Socket Example with C# (from MSDN library) gibt es den kompletten Source-Code am Stück.


Geschrieben von Heppy am 16.03.2019 um 14:09:
 
Danke Th69 habe die Methode EndReceive in meine ReceiveCallback funktion eigesetzt und jetzt klapts. Die von dir erwähnte seite hab ich mehrfach angesehen und habe es aber immer wieder verworfen da dort mit Threading gearbeitet wird und ich in dem zusammenhang immer nur gehört habe das dies viele Ressourcen frist.

C#-Code:
private void ReceiveCallback(IAsyncResult AR)
        {
            try
            {
                StatusHinzufügen("Daten vom Clienten empfangen");
                string text = Encoding.ASCII.GetString(_buffer, 0 , _ClientSocket.EndReceive(AR));
                Trace.TraceInformation(text);
                StatusHinzufügen(text);
            }
            catch (Exception ex)
            {
                Trace.TraceInformation(ex.Message);
            }
        }


Geschrieben von weismat am 18.03.2019 um 09:50:
 
An Deiner Stelle würde ich etwas wie SignalR oder gRPC anstatt Sockets nehmen.
Wenn Du den Socket nimmst, dann musst vor allem entweder im Protokoll am Anfang die Länge mitteilen oder mit einem Trennzeichen arbeiten.
Du musst dann auf jeden Fall mehrfaches Lesen vom Socket implementieren, wenn Deine Nachrichten länger als die BufferSize sind.


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.01.2020 20:51