Netzwerkprogrammierung unter Gentoo



  • Hallo,

    ich bin gerade dabei eine Server/Client-Application auf meinem Gentoo zu entwickeln und bin da auf eine eigenartige Sache gestoßen. Immer wenn ich über send und recv ne Message absetzt, liest mein Client im 4Byte-Takt meine gesendete Nachricht aus. Naja wie ihr euch schon denken könnt, ist die gesendete Nachricht größer als nur 4 Byte.
    Nun die Nachrichten, die ich verfasse will werden wohl nie größer als 100-200 Byte sein. Ist es möglich diese in einem Stück auszulesen?

    Wäre toll, wenn ihr mir helfen könnt.



  • recv im loop, bis die verbindung tot ist oder du eine bestimmte anzahl an bytes hast (vorher ne laengen angabe schicken).

    gib mal code, man kann ja garnichts nachvollziehen.



  • Hm, das mit der Loop-Size-Variante ist ne Idee.

    c.rackwitz schrieb:

    gib mal code, man kann ja garnichts nachvollziehen.

    Das Projekt ist ziemlich groß und damit du wirklich durch siehst müsste ich ne ganze Menge posten. Was die reine Verdindung zwischen Client und Server angeht, ist halt so wie man es überall in den Forum nachlesen kann. ich werde mal ne "kleiner" Version versuchen fertig zu machen.



  • ein einfacher client und server zum testen waeren garnicht verkehrt. so quasi als "schmierblatt"



  • Nun ersteinmal Danke für deine Hilfe.

    Ich habe das Problem gefunden, lang am sizeof. Mein Fehler war, das ich statt

    char* buffer=new char[MAXFRAMESIZE];
    int n=recv(socketid,buffer,sizeof(*buffer),0);
    

    das geschrieben hatte.

    char* buffer=new char[MAXFRAMESIZE];
    int n=recv(socketid,buffer,sizeof(buffer),0);
    

    Das erklärt auch die ganze Sache mit den 4 Bytes.

    c.rackwitz schrieb:

    ein einfacher client und server zum testen waeren garnicht verkehrt. so quasi als "schmierblatt"

    Was das angeht mach das wohl jeder, oder? Ich habe es natürlich auch vorher ausgibig getestet, aber als ich dann den Code an mein C++-Projekt angpasst habe, muss ich das mit dem sizeof verhauen haben. 🙄

    naja, wie gesagt läuft er jetzt. also danke für die anregung.



  • aber ne schleife brauchste trotzdem



  • das ist klar.



  • tyr377 schrieb:

    Ich habe das Problem gefunden, lang am sizeof. Mein Fehler war, das ich statt

    char* buffer=new char[MAXFRAMESIZE];
    int n=recv(socketid,buffer,sizeof(*buffer),0);
    

    das geschrieben hatte.

    char* buffer=new char[MAXFRAMESIZE];
    int n=recv(socketid,buffer,sizeof(buffer),0);
    

    Das erklärt auch die ganze Sache mit den 4 Bytes.

    Und das Funktioniert? Ich hätte gesagt dass jetzt nur noch 1 Byte rauskommen kann.

    Anyway, du solltest auch wenn es in tests klappt, immer mit ner Schleife arbeiten, denn recv garantiert dir nie, dass soviel Bytes rauskommen wie du möchtest oder gesandt worden. Wenn ein Router auf der Strecke lust hat, das Paket in zwei teile zu hacken, dann bekommst du ggf. zwei Teile.



  • TriPhoenix schrieb:

    Und das Funktioniert? Ich hätte gesagt dass jetzt nur noch 1 Byte rauskommen kann.

    Ja, es funktioniert hervorragend. Was die Loop angeht, ist mir klar das ich eine brauche, habe ich aber auch schon gesagt. Was mich nur gewundert hatte, war halt die Anzahl der empfangen Bytes. Da ich das über localhost getestet habe und meine MTU wesentlich größer ist, fand ich es schon komisch, jedes mal nur 4Bytes zu empfangen.
    wie dem auch sei, es läuft und das ist gut so.

    danke für eure anregungen.



  • lass dir mal den wert von sizeof(*buffer) ausgeben...



  • Hm, indeed!

    Okay ihr habt mich überzeugt. ich werde doch direkt MAXFRAMESIZE nehmen. Wird wohl mal Zeit, das ich mir ne Pause vom programmieren gönne.



  • du kannst auch den puffer auf dem stack anlegen oder ist MAXFRAMESIZE so riesig?



  • Nun ich denke MAXFRAMESIZE ist mit 8192 groß genug. Jetzt in der Entwicklungs- und Testphase ist das noch recht groß und wird wahrscheinlich auf 1024 runtergeschraubt, da über die TCP-Verbindungen keine großen Nachrichten versendet werden.
    Was den Stack angeht, erkläre mir bitte mal was du da konkret meinst.



  • tyr377 schrieb:

    Was den Stack angeht, erkläre mir bitte mal was du da konkret meinst.

    http://www.gotw.ca/gotw/009.htm



  • So wars gemeint.

    char buffer[MAXFRAMESIZE];
    recv(s, buffer, sizeof(buffer), 0);
    

Anmelden zum Antworten