Auch bei write() Signal broken-pipe unterdrücken



  • Mein Paket will einfach nicht mit send() richtig gesendet werden 😕 (bitte nichts hierzu schreiben), allerdings flutzscht es mit write() perfekt!
    Allerdings kann ich bei send() den praktischen Parameter MSG_NOSIGNAL setzen, bei write() nicht.

    Kann ich auch soetwas (also kein broken-pipe Signal bei disconnect) bei write() erreichen?
    Mit fcntl()?
    Mit etwas anderem?

    [ Dieser Beitrag wurde am 18.04.2003 um 13:46 Uhr von Mr. Suicide editiert. ]



  • Soweit ich weiss, geht das nicht.
    Ok, ich soll nichts zu send() scheiben, mache ich nicht. Aber aus dem gesamten Kontext Deines Threads sieht es so aus, als würde es auch bei Dir auch mit send() klappen, nur als ob Du trotz eines disconnects weiter schreiben willst. Hmmm, ich kann mir vorstellen, dass es dafür bei Dir mehrere Gründe geben kann, z.B. bist Du irgend wo mitten in einer Funktion, aber den Fall des Disconnects möchtest Du erst später behandeln, z.B. am Ende der Funktion, oder was auch immer. Lass Dir nur gesagt sein (falls überhaubt so die grundsätzliche Annahme von mir zutrifft), dass das i.d.R. ein unsauberer Ansatz ist und überdenke in diesem Fall den Code nochmal.

    Aber um Dir vielleicht trotzdem helfen zu können, würde ich einfach dafür einen Signalhandler einrichten, dann läuft Dein Programm wenigstens weiter.



  • signal(SIGPIPE, SIG_IGN);

    > Mein Paket will einfach nicht mit send() richtig gesendet werden 😕 (bitte > nichts hierzu schreiben)

    Wieso? Bist du nicht an der Lösung des Problems interessiert?
    Also wenn send() fehlschlägt, dann ist das etwas, was man besser nicht ignoriert.
    Mach mal ein strace(1) auf dein Programm, wenn es send() verwendet und fehlschlägt.

    [ Dieser Beitrag wurde am 18.04.2003 um 17:33 Uhr von patrick++ editiert. ]



  • Kurz gesagt, wenn ich mit

    struct meinpaket
    {
    blablablabla....
    };
    
    struct mainpaket Paket;
    [Wertezuweisungen]
    
    send(meinsocket,&Paket,sizeof(meinpaket),MSG_NOSIGNAL);
    

    arbeite werden irgenwelche verstümmelten Daten (w*****einlich Speicherproblem mit send() ) gesendet.

    Wenn ich allerdings genau (!) den gleichen Code ausser mit

    write(meinsocket,&Paket,sizeof(meinpacket));
    

    verwende klappt alles wunderbar...

    *edit*PS: Die Schimpfwortdetection dieses Forums ist nicht ausgereift...

    [ Dieser Beitrag wurde am 18.04.2003 um 21:48 Uhr von Mr. Suicide editiert. ]



  • Daten Binär zu senden ist eigentlich eine schlechte Idee, da die Strukturen von den Compilern mit Padding Bytes aufgefüllt werden und die Datentypen Platform abhängig gespeichert werden. Also sorgst du dafür, dass dein Programm nur geht, wenn alle die gleiche Platform nutzen und alle die gleiche Compiler Version mit den gleichen Compiler Optionen nutzen.

    *edit*PS: Die Schimpfwortdetection dieses Forums ist nicht ausgereift...

    doch! Sie korrigiert nur nebenbei auch Rechtschreib Fehler, wie "w*********einlich" anstelle von wahrscheinlich



  • send versendet nicht den gesamten Puffer auf einmal und hat einen nützlichen Rückgabewert...



  • Original erstellt von kingruedi:
    **Daten Binär zu senden ist eigentlich eine schlechte Idee, da die Strukturen von den Compilern mit Padding Bytes aufgefüllt werden und die Datentypen Platform abhängig gespeichert werden. Also sorgst du dafür, dass dein Programm nur geht, wenn alle die gleiche Platform nutzen und alle die gleiche Compiler Version mit den gleichen Compiler Optionen nutzen.

    doch! Sie korrigiert nur nebenbei auch Rechtschreib Fehler, wie "w*******einlich" anstelle von wahrscheinlich

    Danke! Jetzt habe ich wieder was gelernt.
    Was soll ich denn deiner Meinung nach tun?



  • du kannst alles per string versenden.

    Also wenn du eine Struktur hast, die zB. so aussieht

    struct xyz
    {
      int foo;
      char *bar;
    }
    

    und in einer Instanz von xyz wird foo auf 101 gesetzt und bar auf "Hallo Welt", dann könnte das Packet so aussehen, was du versendest

    101;"Hallo Welt"
    

    das musst du eben in deinem Protokoll festlegen.



  • Auch wenns blöd klingt, kannst du mir helfen, dies Umzuwandeln...ich bekomm mit sprintf() immer Speicherfehler ...bitte,bitte 😞 :

    struct IP
    {
    unsigned char IPa,IPb,IPc,IPd;
    };
    
    struct ControlPacket
    {
    unsigned char type;
    struct IP ClientIP;
    int flags;
    unsigned char spread;
    char data[128];
    };
    
    void StructToPacket(struct ControlPacket *input,char *output)
    {
    ????
    return;
    }
    
    void PacketToStruct(char *input,struct ControlPacket *output)
    {
    return;
    }
    

    [ Dieser Beitrag wurde am 19.04.2003 um 17:02 Uhr von Mr. Suicide editiert. ]



  • wahrscheinlich hast du nicht genug Speicher reserviert.

    http://pw1.netcom.com/~tjensen/ptr/pointers.htm



  • Muss ich immer malloc() verwenden?!?!


Anmelden zum Antworten