myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Netzwerktechnologien » ClientSocket.ReceiveBufferSize wird nicht richtig erkannt
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

ClientSocket.ReceiveBufferSize wird nicht richtig erkannt

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Heppy Heppy ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2019
Beiträge: 5
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Deutschland


Heppy ist offline

ClientSocket.ReceiveBufferSize wird nicht richtig erkannt

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
16.03.2019 10:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Heppy Heppy ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2019
Beiträge: 5
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Deutschland

Themenstarter Thema begonnen von Heppy

Heppy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
16.03.2019 11:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.405
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am 16.03.2019 11:31.

16.03.2019 11:25 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Heppy Heppy ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2019
Beiträge: 5
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Deutschland

Themenstarter Thema begonnen von Heppy

Heppy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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);
            }
        }
16.03.2019 14:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
weismat
myCSharp.de-Mitglied

Dabei seit: 20.09.2005
Beiträge: 869
Entwicklungsumgebung: Vistual Studio 2017, VS Code
Herkunft: Frankfurt am Main


weismat ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
18.03.2019 09:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Monate.
Der letzte Beitrag ist älter als 8 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 11.12.2019 06:23