Sockets: Kann send() abstürtzen?



  • Hallo,

    Kann es sein das die send() funktion unter bestimmten Funktionen abstürzt?

    cout << "While #1" << endl << flush;
      ClientVerwaltung.GetNachricht(n);
      cout << "While #2" << endl << flush;
      char buf[255];
      strcpy(buf, Temp[n].c_str());
      int tmpSocket = ClientVerwaltung.MeinSocket[n];
      cout << "While #3" << endl << flush;
      send(tmpSocket,buf,254,0);
      cout << "While #4" << endl << flush;
      if(false)
      {
    	 cout << "break" << endl << flush;
       break;
      }  
      timespec t;
      t.tv_sec = 0;
      t.tv_nsec = 100;  
      nanosleep(&t,0);
    

    Mit diesem Code habe ich folgendes Prob:
    Er funktioniert solange der Client nicht disconnectet. Dann ist bei der Ausgabe "While #3" schluss und ich bin wieder in der Befehlszeile. Der Code sieht etwas seltsam aus, da ich schon ein bisschen rumprobiert habe (ich kann irgendwie nicht glauben das send abstürtzt). Das Prog hat unter Windows einwandfrei funktioniert, ich habe es jetzt nach Linux portiert und es geht auch bis auf das Prob das es beim Disconnect abstürtzt.

    Ich habe das Programm mit g++ -o xy -lpthread xy.cpp (ja es gibt Threads im Prog) kompelliert. Habe ich vergessen eine Lib für sockets oder so anzugeben? Wie kann das sein?

    Gruß, Fabian



  • Nein, kann es nicht. Es kann aber mit EINTR zurückkehren und v.a. kann es ein SIGPIPE auslösen.

    Ich würde sowohl beim Compilen als auch beim Linken -pthread verwenden.



  • Was ist SIGPIPE? Zurückkehren kann die Funktion nicht dann würde ich ja auch die Ausgabe "While #4 sehen". Macht g++ nicht linken und kompelieren mit thread libs wenn ich -lpthread angebe?



  • Also ich habe jetzt das Progamm mal mit strace laufen lassen, und das meldet killed by SIGPIPE. Wie kriege ich das nun weg?



  • signal(SIGPIPE, SIG_IGN);

    ignoriert das Signal und send kehrt stattdessen mit entsprechendem Fehlercode zurück. Oder als vierten Parameter für send MSG_NOSIGNAL benutzen.



  • thk



  • Wenn der Linker die Libraries nicht linken würde, würdest du gar kein binary erhalten 🙄

    btw. macht endl gleich ein flush, daher ist << endl << flush etwas sinnlos 🙂



  • kingruedi schrieb:

    Wenn der Linker die Libraries nicht linken würde, würdest du gar kein binary erhalten 🙄

    Man kann Programme mit Threads auch ohne -lpthread kompelieren und linken (und ausführen. Unter der Vorraussetzung das die Programme den Header einbinden und nur pthread_create() benutzten. Das führt dann zu mysteriösen Abstürtzen beim Thread erstellen.

    kingruedi schrieb:

    btw. macht endl gleich ein flush, daher ist << endl << flush etwas sinnlos 🙂

    Das wusste ich nicht, danke für den Hinweis.



  • flammenvogel schrieb:

    Man kann Programme mit Threads auch ohne -lpthread kompelieren und linken (und ausführen. Unter der Vorraussetzung das die Programme den Header einbinden und nur pthread_create() benutzten. Das führt dann zu mysteriösen Abstürtzen beim Thread erstellen.

    Ich kann das nicht:

    /tmp/ccwTmfmL.o: In function `main':
    /tmp/ccwTmfmL.o(.text+0x24): undefined reference to `pthread_create'
    

    😮


Anmelden zum Antworten