Php 为什么socket_write()返回已写入的7423字节,但服务器端只接收1448字节?

Php 为什么socket_write()返回已写入的7423字节,但服务器端只接收1448字节?,php,sockets,Php,Sockets,我正在编写一个简单的socket代码,使用socket\u write()将数据写入,作为回报,使用socket\u read()检索数据 这是我的基本设置: $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die ("Could not create connection"); $socket_conn = socket_connect($socket, "some_ip", some_digit); // internal ne

我正在编写一个简单的socket代码,使用socket\u write()将数据写入,作为回报,使用socket\u read()检索数据

这是我的基本设置:

  $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die ("Could not create connection");
  $socket_conn = socket_connect($socket, "some_ip", some_digit); // internal network
  $socket_params = pack('I',0) . strval($file['filename'] .'.'. $file['extension']) . pack('I', $file['size']) . pack('I', 0) . strval(File::read($file['saved_to'] . $file['saved_as'], true)) . pack('I', 0);
  $t = socket_write($socket, $socket_params, strlen($socket_params)) or die ("Could not create connection");        
  $status = unpack('I', socket_read($socket, 4));
  socket_close($socket);
运行此操作后,我将得到错误
ErrorException[Warning]:unpack()[function.unpack]:类型I:输入不足,需要4,有0。我不确定为什么会发生这种情况,因为
$t
返回7423,这是我在
var\u dump($socket\u params)
时得到的大小

然而在服务器端,它显示它只收到1448字节,因此请求被终止。服务器端与当前的live PHP实现配合得很好,所以我现在排除了服务器端的任何有趣之处

我已经将我的测试代码上传到了生产环境中进行测试(在与当前活动服务器完全相同的服务器上),它返回了相同的错误

值得一提的是,我使用的是FuelPHP1.0RC3,而当前的实时实现使用的是CakePHP。本地机器是OSX10.6.8(MAMP 1.9.4),生产机器是10.04LTS(Apache/PHP5.3.X)

最后,我一直在搜索,因为它在Linux机器上也有同样的问题,我认为排除这种可能性也是安全的(http://stackoverflow.com/questions/6878603/strange-raw-socket-on-mac-os-x )对吧??如果是问题的话,我不太确定如何解决这个问题


提前感谢,我不确定我还需要提供什么其他信息,因为这是我第一次做套接字编程。我可以为调试提供一些指导,所以请不要提任何建议

1448听起来与平均的TCP MTU设置非常接近,我怀疑如果你拔出Wireshark或其他一些数据包嗅探器,你会发现所有的数据都在传输,但是在两个不同的数据包中。只是一个想法……而且,没有必要将
$length
参数传递给socket\u write,特别是如果您遇到这样的问题,我还没有抽出时间来检查它是否发送了多个数据包,但是如果是,有什么解决方法吗?不是真的,因为服务器端会忽略额外的数据包。。。现在我这样说似乎不太可能——也许可以尝试一下使用
SO\u SNDBUF
socket选项?这就是为什么每当我进行套接字级编程时,我都会在测试时运行Wireshark,这样我就可以准确地看到通过网络交换的内容。在尝试socket编程之前,您还应该了解一些较低层次的TCP/IP机制。服务器端到底是什么?你写的一个应用程序,还是别的什么?我对服务器端的应用程序没有控制权,除了与作者联系。所以我真的想知道这是否是一个客户端问题,因为它正在为当前的实时实现工作。好的,我将开始使用wireshark并向您汇报。谢谢