TCP Server, ab und zu keine Verbindung

  • Hallo,

    ich bin grade mit meinem PI eine Smart Home Zentrale zu basteln, es läuft soweit ganz gut, aber ab und zu hab ich noch Problemchen.

    Habe ein TCP Socket, wenn der läuft.. dann läuft der Stabil... aber wenn ich mein Programm mal beende und neustarte... kann es passieren dass ich keine Verbindung aufbauen kann... erst nach x mal beenden und starten.. evlt sogar nach einem neuem "make"...

    code:

    mache ich irgendwas falsch? oder liegt es evlt garnicht an meiner Soft?ich habe jetzt paar Error Logs eingebaut....

    ERROR on binding: Address already in use

    spuckt der mir raus... kann es sein dass der im Hintergrund weiter läuft wenn ich das beende?
    und der daher den Port blockiert?

  • Hallöle,

    Code
    ...
       //Öffne Socket
       connfd = accept(listenfd, (struct sockaddr*) NULL, NULL);
    
    
       /**Receive**/
       recv(connfd, recByte, sizeof (recByte), 0);
    ...


    zunächst mal fällt mir auf, dass Du bei keinem systemcall den returncode auswertest ... da wirst Du vermutlich schon mal ein höchst sonderbares Laufzeit-Verhalten bekommen ;) ...

    Code
    ...
      while (1) {
    /* .........*/
          piThreadCreate(tcp_schleife);
          usleep(10); 
      } 
    ...


    Das threading-Konstrukt, das Du da verwendest, kenne ich jetzt nicht. Ist das aus der wiringPi Lib?
    Jedenfalls kommt es mir seltsam vor, dass Du den piThreadCreate() in einer Schleife aufrufst. In meiner C-Welt wird ein pthread_create() einmal aufgerufen ... :s

    Da fehlen imho noch diverse Code-Zeilen ...
    Das waren jetzt erst mal die Punkte, die mir auf Anhieb aufgefallen sind.

    -ds-

  • Moinsen Grünschnabel :) ...


    Es dauert ne Weile bis der Socket zu erneuten Benutzung wieder frei ist. In python kann ich sockets mit "reuse-adress" flag initalisieren, das wird doch bestimmt auch in C gehen.


    yepp ... gibts ... setsockopt( ..., ..., SO_REUSEADDR, ..., ... )
    Ein -> Beispiel <- dazu hab' ich in meiner -> Raupensammlung <- ;)

    cu,
    -ds-

  • [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]jedenfalls kommt es mir seltsam vor, dass Du den piThreadCreate() in einer Schleife aufrufst[/font]

    aber soll ja nicht nur einmal auf eine TCP Anfrage reagieren... sondern halt immer... deswegen die schleife!? oder versteh ich da was falsch?

  • Wie gesagt ... ich verstehe Dein threading-Konstrukt nicht. Da fehlt mir irgendwas.
    Jedenfalls ist bei mir der Ablauf in etwa so:

    Code
    socket öffnen
    Paramete setzen
    bind des sockets
    listen mit backlog z.B. 5
    - und jetzt in einer Schleife
    -- accept der eingehenden Verbdindungsanfrage
    -- fork() Kindprozess zum Handling der neuen Verbindung
    - Ende der Schleife
    cleanup()


    und bei pthreads z.B.:


    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!