phpbar.de logo

Mailinglisten-Archive

[php] socket Problem - strlen > 1500 nicht möglich

[php] socket Problem - strlen > 1500 nicht möglich

Andi Voss andi at andis.mine.nu
Mon Mar 12 15:24:25 CET 2007


Hi,

ich habe eine Client - Server Verbindung mit php über ssh, die im LAN
wunderbar funktioniert. Es können Strings z.B. mit strlen > 4000
übertragen werden, da gibt es überhaupt keine Probleme.
Jetzt sollen damit zwei Rechner verbunden werden, die jeweils per DSL im
Inet sind (z.B. in Berlin und München).
Die Übertragung funktioniert an sich auch immer noch, nur dass über das
Inet nicht mehr alle Daten übertragen werden.
Größer als 1499 strlen des zu übertragenen Strings geht nicht.
Der ankommende String wird einfach bei einer strlen von 1499 auf dem
empfangenden Server abgeschnitten bzw. es wird gar nicht erst mehr als
1499 in den SSH-Tunnel durch fwrite geschrieben.

Ich habe keine Ahnung warum das im LAN funktioniert und über das Inet nicht.
Die MTU kanns irgendwie nicht sein, denn die ist im LAN ja genauso groß
(1500 auf meinen Linux-Kisten wo es intern funktioniert).

Es funktioniert z.B. auch, wenn der php-Server auf meinem root-Server
läuft (also permanente Verbindung + feste IP) und der Client von einer
DSL-Einwahlverbindung kommt, hier werden auch alle Daten übertragen.
Nur wenn der php-Server auf einem Rechner läuft, der per DSL angebunden
ist, gibts diese Probleme.

Ich hab mir schon die Finger wund gesucht, vielleicht hat ja jemand einen
Tip - übersehe ich vielleicht etwas wichtiges in Bezug auf Inet?

Hab das hier gefunden(2. note):
http://de.php.net/manual/en/function.stream-set-blocking.php

Kann das aber irgendwie nicht auf mein Problem umwälzen, denn im Client
$r = array( $tunnel );
while ( 0 !== stream_select( $r, $w = null, $e = null, 0 ) )
...
ergibt:
Warning: stream_select(): cannot represent a stream of type SSH2 Channel
as a select()able descriptor in ...


So ist grundlegend der Client aufgebaut:
...
$connection = ssh2_connect( REMOTE_IP, SSH_PORT );
$auth_password = ssh2_auth_password( $connection, SSH_USER, SSH_PASS );
$tunnel = ssh2_tunnel( $connection, REMOTE_IP, IMOD_PORT );
$fwrites_success = fwrite( $tunnel, $string, strlen( $string ) );
...

Und so der Server:
...
$sock = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
socket_setopt( $sock, SOL_SOCKET, SO_REUSEADDR, 1 );
socket_set_block( $sock );
$ret = socket_bind ( $sock, ADRESS, IMODD_PORT );
$ret = socket_listen( $sock, 5 );
do
{
   $msgsock = socket_accept( $sock );
   do
   {
      // MAXBUFSIZE = 20000
      $buf = socket_read( $msgsock, MAXBUFSIZE );
      ...
   } while ( true )
} while ( true )
...


Ich hoffe es kann mir da jemand nen Tip geben oder weiß sogar woran es liegt.
PHP-4.4.4, libssh2-0.13, (pecl) ssh2 0.10 beta  kommt zum Einsatz.

Liegt der Fehler im client oder server?

Wenn noch Infos fehlen, bitte nachfragen.
Danke Andi




php::bar PHP Wiki   -   Listenarchive