Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP TCP Socketserver ließt nicht mehr als 1460 Bytes

Einklappen

Neue Werbung 2019

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

  • PHP TCP Socketserver ließt nicht mehr als 1460 Bytes

    Hallo,

    ich muss eine sehr "große" Datenmenge (7540 Bytes) über das Internet auf meinen TCP Server senden. Das Problem ist, er ließt nicht alles auf einmal, sondern sendet das ganze in einzelnen Paketen. Er sendet nämlich maximal 1460 Bytes und diese hintereinander. Obwohl der Client (in C++ geschrieben) eigentlich alles direkt auf einmal sendet. Das ist etwas, was ich einfach nicht verstehe. Die socket_recv Größe beträgt insgesamt (zum Test) 2.000.000 Bytes.
    PHP-Code:
    $read_bytes = @socket_recv($s,$buffer,2000000,0); 
    Der Buffer enthält halt jedesmal nur maximal 1460 Bytes. Kann es sein, dass ich mit socket_set_option die Größe erhöhen muss? Wenn ja, welche Optionen müsste ich setzen, wenn der PHP Server maximal 2.000.000 Bytes auf einmal lesen soll bzw. bis das Ende erreicht wurde? Ich habe die Funktion vorhin schon mit paar Optionen ausprobiert, allerdings ohne Erfolg.

    In diesem Fall denke ich ist kein Quellcode notwendig. Falls doch, dann kann ich den gerne noch anhängen. Wird sowieso ein GitHub Projekt.

  • #2
    Hab schon lange nichts mehr in die Richtung gemacht, aber 1460 ist üblicherweise die Maximum Segment Size von TCP-Segmenten. Offenbar empfängst oder sendest du also nur das erste Segment.

    Ich würde bevor ich den Fehler im (PHP-)Programmcode suche mal mit einem Packetsniffer schauen ob alle Daten von dem C++-Client rausgehen und dann nochmal ob sie beim Client empfangen werden.

    Kommentar


    • #3
      Ja aber ich empfange ja eigentlich alles. Nur es wird halt alles hintereinander gesendet. Also sprich nicht alles in einer Nachricht.

      Kommentar


      • #4
        lass das @ weg und nimm mal MSG_WAITALL als 4. Flag Parameter

        Kommentar


        • #5
          Das klappt nicht, da er solange blockiert bis 2 MB gelesen wurden. Das ist aber in dieser Anwendung sehr sehr unpraktisch. Ich weiß die genaue Größe nicht.

          Kommentar


          • #6
            Zitat von Mr_Brox Beitrag anzeigen
            Ja aber ich empfange ja eigentlich alles. Nur es wird halt alles hintereinander gesendet. Also sprich nicht alles in einer Nachricht.

            Nie Netzwerktechnik gehabt? Das ist die MTU. Und dein Provider lässt nie mehr als 1500 Bytes pro Paket raus (inkl. Header). Egal wir viel du auf einmal sendest, spätestens dein Router splittet.
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              Wie kann ich dann erkennen, wann alles ankam?

              Kommentar


              • #8
                Wenn du weißt, dass du immer nur auf 7540 bytes warten musst, dann nimm doch den Wert statt 2000000. Ansonsten mach es per socket_select

                Kommentar


                • #9
                  Ich weiß nicht, wie viele Bytes er sendet. Das ist von User zu User total unterschiedlich. Ich verwende bereits ein socket_select, aber inwiefern kann ich damit mein Problem lösen?

                  Kommentar


                  • #10
                    socket_select verrät dir, auf welchem socket Daten zum lesen anliegen. Damit können mehrere sockets gelesen werden, bis die Daten komplett vorliegen.

                    Kommentar


                    • #11
                      Ja, das Problem ist aber, ich möchte nicht warten, bis 2.000.000 Bytes gelesen wurden (also irgendwann mal). Ich sende eine Anfrage vom Server an den Client und der Client sendet wiederrum das was ich benötige zurück. Das kommt aber immer daraufan was ich haben will und dessen Rückgabe (vom Client) ist auch immer unterschiedlich groß. Warten kann ich nicht, da ich das direkt auswerten muss.

                      Kommentar


                      • #12
                        Mit socket_select musst du auch nicht warten sondern kannst immer Daten lesen sofern welche am socket anliegen. Die Daten in einen Buffer packen und prüfen ob alle notwendigen Daten für ein Datenpacket angekommen sind. Packet verarbeiten, ggf. antworten und weiter vom socket lesen.

                        Kommentar


                        • #13
                          Das Problem ist, dass ich die Daten direkt brauche und ich nicht warten kann. socket_select wartet ja dennoch bis alles da ist. So verstehe ich das zumindest.

                          Kommentar


                          • #14
                            socket_select wartet garnicht, das sagt dir nur, wo was anliegt.
                            Und was anderes als auf die Daten warten die du brauchst kannst du eh nicht machen, außer dein Script kann in die Zukunft sehen.
                            [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                            Kommentar


                            • #15
                              Dito. Und was du mit den bereits empfangenen Daten machst liegt in deiner Hand. Es liegt an dir, festzustellen ob du damit schon arbeiten kannst oder noch warten muss

                              Dafür wurden z.B. Steuerzeichen und Steuersequenzen erfunden.
                              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                              Kommentar

                              Lädt...
                              X