Ankündigung

Einklappen
Keine Ankündigung bisher.

Client Connect zu Websocket schlägt fehl.

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Probier doch erstmal eine einfache Socket-Verbindung herzustellen, bevor du aufgibst - ohne den Socket Server, sondern mit einem einfachen Script.
    Das rufst du dann von deinem Computer über Telnet auf. Damit bist du am rudimentärsten Element.
    Wie mache ich ein einfaches Script ohne Socket Server beim Provider??

    Du sagst, dass du den Port nicht festlegst, sondern das System das macht...
    Wieso?
    Ich kann mir ja wohl nicht einfach einen Port greifen, der könnte belegt sein.
    Deshalb soll das System den Port festlegen. Der verwendete Port wird dann in einer Datei auf dem Server abgelegt,
    die sich natürlich de Client holen muss bevor er die Verbindung aufsetzt.

    PHP-Code:
    // Create TCP/IP stream socket
    // Bei TCP ist garantiert, dass alle Datenpakete in derselben Reihenfolge empfangen werden, in der sie gesendet wurden
    if (($socket socket_create(AF_INETSOCK_STREAMSOL_TCP)) === false) {
       
    logger("socket_create() fehlgeschlagen: Grund: " socket_strerror(socket_last_error()) . "\n";
    }
    else {
        
    logger(__LINE__.  "\t ".basename(__FILE__)."  socket_create()   SUCCESS \tHOST=".$host);
    }
    //reuseable port
    //  Um beispielsweise Optionen auf dem Socket-Level abzufragen,
    //  würde man den Parameter level auf den Wert SOL_SOCKET setzen.
    //  socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

    if (!socket_set_option($socketSOL_SOCKETSO_REUSEADDR1)) {
        
    logger(__LINE__.  '\t Error: Kann keine Option setzen für Socket: 'socket_strerror(socket_last_error())) . PHP_EOL;
    }

    // bind socket to (0=un)specified host and port
    // socket_bind($socket, 0,$port);  
    // Bindet an festen Port, dieser muss aber frei sein
    // das ist beim Provider schlecht möglich.
    // deshalb wird der Port nicht mit angegeben

    // Das System entscheidet jetzt welcher Port verwendet wird.
    // Das Problem, wie kommen die Clients an die Portnummer um sich zu verbinden
    // wird dann über socket_getsockname gelöst
    socket_bind($socket$host);

    //listen to port
    socket_listen($socket);

    // socket_getsockname liefert die IP und der Port zurück.
    socket_getsockname($socket$OWN_IP$PORT);


    $pid=getmypid();
    $socket_data=array('pid'=>$pid,'serv_ip'=>$OWN_IP,'port'=>$PORT);

     
    // Der Port wird in einer Datei abgelegt und kann dort von
    // den Clients gelesen werden
    file_put_contents($pfad."/tmp/socket_data.json",json_encode($socket_data));



    while(
    true) {
       
    tick_handler();   // fängt Signale SIGTERM; SIGINT, SIGKILL ab und und leitet Prozessbeendigung ein

          // Verarbeitung der einkommenden Requests

        
    sleep($sleep_time);
    }   
    // Ende while true 
    Da ich an das Thema Websockets erst mal herantaste , kann ich mit der erweirterten Technik von Websockets noch nicht anfangen.

    Ich habe den automatischen Kill nach 120 Sekunden deshalb eingebaut, damit ich den Server nicht unnötig belasten.
    Es sind aber nicht absolut 120 Sekunden, sondern 120 Sekunden nach der letzten Aktivitaet. D.h. wenn nach 110 Sek ein Request kommt,
    startetn wieder 120 Sekunden.
    Ich bin mir Klar darüber, dass die Laufzeit eines Scriptes begrenzt ist. da das Socket Script aber mit nohup aufgesetzt wird, sollte es eigentlich mit limit=0 laufen
    (kann ich ja noch mal testen).
    Es soll ja auch nicht durchgehend laufen, die Webseite ist nicht so frequentiert, dass das nötig wäre. Es müssten auch mehrere Benutzer gleichzeitig dran hängen,
    die miteinander kommunizieren wollen.

    Ich möchte keinen kleinen Vserver bei einem anderen Hoster verwenden, da ich dann Content-Security-Probleme habe.
    Ich habe in meine Scripte CSP eingebaut und möchte das nicht gleich wieder durchlöchern.

    Da das ja alles so funktioniert, wie ich mir das vorgestellt habe, wenn es auf localhost läuft, ist wahrscheinlich nur die Firewall des Providers das Problem.
    Ich muss mich mal mit denen in Verbindung setzen, ob es da eine Lösung gibt.
    Ansonsten bleibt es beim Long Polling, ich könnte da ja dann die Frequenz erhöhen, d.h. häufiger pollen um eine kürzere Reaktionzeit zu bekommen.


    Kommentar

    Lädt...
    X