2013-02-21 2 views
0

Я использую сокет для передачи сжатого файла, но размер файла для отправки отличается от размера файла приема.PHP-сокет, длина разного сообщения между отправкой и получением

Это сервер:

<?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, вы теряете данные, которые не ретранслируются? Что не так?

ответ

0

Посмотрите на PHP страницах socket_write

socket_write() не обязательно записывает все байты из данного буфера. Действительно, в зависимости от сетевых буферов и т. Д. Записывается только один размер данных, даже один байт, но ваш буфер больше. Вы должны следить за тем, чтобы непреднамеренно не забыть , чтобы передать остальную часть ваших данных.

О socket_read это может быть возможно, что Вам не нужно называть его много раз и Concat кусков данных, пока не больше данных для чтения присутствует

 Смежные вопросы

  • Нет связанных вопросов^_^