Sockets ....

Willkommen!

Wenn du im Nexave-Forum mitmachen möchtest, schreib an community@nexave.de. Wir haben die Registrierungsfunktion in unserem Diskussionsforum nämlich deaktiviert, weil sich praktisch nur noch Spammer und Werbebots registriert haben. Per E-Mail sind wir dir gern behilflich, einen Account anzulegen.
  • Hallo,


    mich plagt da ein Problem. Mit Sockets. Folgendes Beispiel läuft auf dem Simulator/Emulator perfekt, auf einem echten Palm (getestet: TC,ux50) nicht.


    So in etwas sieht der Code aus:


    network.open();
    for(i=1;i<20;i++) {
    socket.open(...);
    socket.connect(...);
    --- socket.shutdown(...) // zum testen eingebaut, trotzdem problem
    socket.close();
    }
    network.close();


    Nachdem "i" auf 16 steht (16 Schleifendurchläufe) bekomme ich den fehler "too many TCP connections" --- obwohl ja in der Schleife ein socket.close() steht. Ich habe Testweise auch das network.open/close() in die Schleife getan - ändert nichts ausser das das Progamm natürlich langsamer wird. Mit den Timeouts hats auch nichts zu tun und auch nicht damit, ob der connect ins Nirvana läuft (wegen kein Port offen) oder wirklich connected.


    Kurzum ... Wer mir den entscheidenden Tipp gibt wird einen Netzwerk-Portscanner geschenkt bekommen sobald er fertig ist - ansonsten gedenke ich dafür 5€ bei pdassi/5$ Palmgear zu verlangen.


    Grüße
    Rudi

    Bilder

    • palmscanner.jpg

    Die Kinder des Kometen küssen die blaue Perle.


    (Atari Portfolio->Sharp pc3000->IIIc->m505->ux50->Lifedrive->Pre)

  • Was ist, wenn du vor dem schliessen eine kleine Warteschleife einbaust, mit Leerschleife oder wait()? Kann ja sein, dass man das Schliessen des Sockets abwarten muss, bzw. der Funktion ein bisschen mehr Zeit geben muss.
    Ist nur ein Schuss ins Dunkle, da ich mich mit Netzwerkprogrammierung auf dem Palm überhaupt nicht auskenne.

  • Zitat

    Original von MeisterPetz
    Was ist, wenn du vor dem schliessen eine kleine Warteschleife einbaust, mit Leerschleife oder wait()? Kann ja sein, dass man das Schliessen des Sockets abwarten muss, bzw. der Funktion ein bisschen mehr Zeit geben muss.
    Ist nur ein Schuss ins Dunkle, da ich mich mit Netzwerkprogrammierung auf dem Palm überhaupt nicht auskenne.


    Hab ich natürlich schon gemacht :) 1000mS sollten reichen. Die Netzwerktimeouts habe ich bis 5Sekunden hochgedreht. Keine Hilfe. Das Programm wird langsam und nach 16 connects() gibts den fehler :((((


    Grüße
    Rudi

    Die Kinder des Kometen küssen die blaue Perle.


    (Atari Portfolio->Sharp pc3000->IIIc->m505->ux50->Lifedrive->Pre)

  • Hi Rudi,


    Du laeufst in das Problem das die tcp verbindung nicht sofort abgebaut wird wenn du Close() aufrufst. Close() initiert den Abbruch und es werden noch eine reihe pakete zwischen client und server ausgetauscht bevor die Verbindung beendet wird. NetLib haelt die Verbindung offen bis ein letztes Fin/Close vom server kam
    Ich kann mich nicht 100% erinnern wie das genau funktioniert...


    Bestimmt besser erklaert siehe
    http://httpd.apache.org/docs/misc/fin_wait_2.html
    http://www.freesoft.org/CIE/RFC/1122/99.htm
    oder in google nach "tcp close fin" suchen.



    Also entweder wird die Verbindung nicht richtig beendet, or es verstreicht nicht genuegend zeit bis die verbindung korrekt abgebaut wurde.


    Umgehen kannst du das ganze mit
    NetLibSocketOptionSet() und zwar mit der
    "SockLinger" Option. Damit legst du fest wie lange du noch abwartest nachdem du mit close() die verbindung beenden hast. d.h. wenn du willst stellst du das auf 0 und die verbindung ist nachdem close() sofort beendet. Weiteres siehe PalmOS API Referenz
    Als Nebeneffekt von SockeLinger, kann allerdings die server applikation noch die tcp verbindung aufrecht erhalten, was bei aktuellen betriebssystemen allerdings kein problem sein sollte.


    BTW, das es nach 16 mal eine "too many TCP connections" haengt vom Palm ab. unterschiedliche versionen scheinen unterschiedliche max tcp connections zu haben.


    Ich hoffe das konnte weiterhelfen, ich bin schon ein wenig muede, und kann mich nicht mehr fluessig ausdruecken


    Gruss,


    Sebastian