Laden...

ClientSocket.ReceiveBufferSize wird nicht richtig erkannt

Erstellt von Heppy vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.314 Views
H
Heppy Themenstarter:in
5 Beiträge seit 2019
vor 5 Jahren
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:


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

_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.

Leben ist das, was passiert
Wenn du woander so beschäftigt bist.

H
Heppy Themenstarter:in
5 Beiträge seit 2019
vor 5 Jahren

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

Leben ist das, was passiert
Wenn du woander so beschäftigt bist.

4.931 Beiträge seit 2008
vor 5 Jahren

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.

H
Heppy Themenstarter:in
5 Beiträge seit 2019
vor 5 Jahren

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.


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);
            }
        }

Leben ist das, was passiert
Wenn du woander so beschäftigt bist.

W
872 Beiträge seit 2005
vor 5 Jahren

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.