0

圧縮ファイルを送信するためにソケットを使用していますが、送信用のファイルサイズが受信用のファイルサイズと異なります。

これはサーバーです:

<?php
$sock = socket_create(AF_INET, SOCK_STREAM, 0) or die("socket_create() fallito: motivo: " . socket_strerror($this->sock) . "\n");
$ret = socket_bind($sock, "192.168.1.40", "9000") or die("socket_bind() fallito: motivo: " . socket_strerror($ret) . "\n");
$ret = socket_listen($this->sock) or die("socket_listen() fallito: motivo: " . socket_strerror($ret) . "\n");
while(true){
    if($buf = @socket_accept($this->sock)){
        echo "Call incoming\n";
        // Read lenght of file
        $lun = socket_read($buf, 1024);
        // Write ok
        socket_write($buf, "OkContinue", 1024) or die("Could not send data to server\n");
        // Read file of lenght $lun
        $lettura = socket_recv ($buf, $lun);
        // Write dimension
        echo "I need rec file of $lun size, but i rec: ".strlen($lettura)." size";
    }
}
?>

これはクライアントです:

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
$result = socket_connect($socket, "192.168.1.40", "9000") or die("Could not connect to server\n");  
socket_write($socket, strlen($message), 1024) or die("Could not send data to server\n");
while ($out = socket_read($socket, 1024)) {
    if ($out=="OkContinue"){
        socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
        echo "Send text of ".strlen($message)." size";
    }
}
?>

しかし、これはクライアントに関する2つのメッセージです。

Send text of 3741477 size

そしてこれはサーバー上にあります:

Call incoming
I need rec file of 3741477 size, but i rec: 82536 size

では、プロトコルがTCPであるにもかかわらず、再送信されないデータが失われるのはなぜですか?どうしたの?

4

1 に答える 1

0

のPHPページを見てくださいsocket_write

socket_write() は、必ずしも指定されたバッファーからすべてのバイトを書き込むわけではありません。ネットワークバッファなどによっては、バッファが大きくても、1バイトでも一定量のデータしか書き込まれないことは事実です。残りのデータを送信するのをうっかり忘れないように注意する必要があります。

何度も呼び出して、読み取るデータがなくなるまでデータのチャンクを連結するsocket_read必要がある可能性があります

于 2013-02-21T11:05:31.803 に答える