2013-02-21 90 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

socket_write

socket_write()的PHP页面不一定写从给定的 缓冲区中的所有字节。根据网络缓冲区等的不同,只有一个 数据(即使是一个字节)的写入是有效的,尽管您的缓冲区 较大。你必须小心,所以你不会无意中忘记 来传输你的其他数据。

关于socket_read它可能是可能的,你必须把它称为很多次,Concat的数据块,直到没有更多的数据读取存在