以前一直经为PHP里没有低级的socket帧接收函数,看来是没看仔细,不过那些说明也太少了,(更令人气的里在英文版说明里的例子下有一句话:这个程序不能运行,因为没用listen函数,但在中文版里却没了,这个翻译的人也忒不负责了吧)

int socket_recv ( resource socket, string &buf, int len, int flags )

resource socket 是生成的套接字
string &buf 是接收缓冲区
int len 是你打算接收的长度
int flags 是一个标志
0x1 数据应该带外发送,所谓带外数据就是TCP紧急数据
0x2 使有用的数据复制到缓冲区内,但并不从系统缓冲区内删除。
0x4 不要将包路由出去。
以上三项与sock.h文件中定义完全相同
0x8 数据完整记录
0x100 数据完整处理 当socket_read在PHP_BINARY_READ模式时(默认值,但一般用PHP_NORMAL_READ )与socket_recv基本相同 下面是两个测试成的小例子
发送接收方法:
>> CODE /* server sock_accept
* client => filename
* server <= filesize(filename)
* client => "OK"
* server <= file_get_contents(filename)
* client => "FIN"
* server sock_close
*
* 注意:这里用flags为0x2不清缓冲区将接收到所以读到的数据
*/ server.php >> CODE
<?php
/* server sock_accept
* client => filename
* server <= filesize(filename)
* client => "OK"
* server <= file_get_contents(filename)
* client => "FIN"
* server sock_close
*
* Read buffer save all data that it have recived ever.
*/
$flag = 0x2;
error_reporting(E_ALL); /* Allow the script to hang around waiting for connections. */
set_time_limit(0); /* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush(); $address = '127.0.0.1';
$port = 10000; if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
exit;
} if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
exit;
} if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
exit;
} do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
break;
}else
{
echo "accept \r\n";
} do {
$p = 0;
if (($ret = socket_recv($msgsock, $buf, 1024, $flag)) ==0 ) {
echo "$buf socket_read() failed reason: " . socket_strerror($ret) . "\n";
break; // 2;
}
$msg = substr($buf,$p); $p += strlen($msg);
echo "R:$msg\n"; if(file_exists($msg))
{
$fcon = file_get_contents($msg);
$flen = filesize($msg);
if ( ( $ret = socket_write($msgsock,$flen,strlen($flen))) != strlen($flen))
{
echo "Write Error $ret\n";
break; // 2;
}
echo "S:$flen\n";
if (($ret = socket_recv($msgsock, $buf, 1024, $flag)) ==0 ) {
echo "$buf socket_read() failed reason: " . socket_strerror($ret) . "\n";
break; // 2;
}
$msg = substr($buf,$p); $p += strlen($msg);
echo "R:$msg\n";
$sndlen = 0;
do
{
$sndlen += socket_write($msgsock,$fcon,$flen-$sndlen);
echo "------[".$sndlen."][$flen]\n";
}while($sndlen<$flen);
echo "S:!!!!!\n"; do
{
socket_recv($msgsock,$buf,1024,$flag);
if(substr($buf,-3) == "FIN")
{
echo "FIN\n";
break 2;
}
}while(true);
}else
{
socket_write($msgsock,"NOFO",4);
echo "File not found\n";
break;
}
} while (true);
socket_close($msgsock);
} while (true); socket_close($sock);
?> client.php >> CODE
<?php
//error_reporting(E_ALL);
$flag = 0x2;
echo "TCP/IP Connection: "; /* Get the port for the WWW service. */
$service_port = 10000; //getservbyname('www', 'tcp'); /* Get the IP address for the target host. */
$address = '127.0.0.1'; //gethostbyname('www.example.com'); /* Create a TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
exit;
} else {
echo "OK.\n";
} echo "Attempting to connect to '$address' on port '$service_port'...";
$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
exit;
} else {
echo "OK.\n";
} $in = "server.php";
echo "S:getfile $in.";
if(socket_write($socket, $in, strlen($in))==0)
{
echo " Err\n";
return;
}
echo " OK\n"; if(($ret = socket_recv($socket,$out, 2048,$flag)) == 0) {
echo "Error read[".$out."]\n";
}
echo "<=:$out\n";
if($out !== "NOFO")
{
echo "=>:OK...";
if(socket_write($socket,"OK",2)==0 )
{
echo " Err\n";
return;
}
echo " OK\n"; $len = strlen($out)+ $out;
$l = 0;
while($len > $l)
{ socket_recv($socket,$t,$len,$flag);
$l= strlen($t);
echo "----[$l][$len]\n";
}
echo "<====:\n[".substr($t,strlen($out))."]\n"; echo "=>:OK...";
if(socket_write($socket,"FIN",3)==0 )
{
echo " Err\n";
return;
}
echo " OK\n";
}else
{
echo "FILE not FOUND on SERVER\n";
}
//socket_close($socket);
sleep(2);
echo "OK.\n\n";
?>

PHP里的socket_recv方法解释的更多相关文章

  1. java 里面的 native 方法

    第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method   简单地讲,一个Native Meth ...

  2. Info.plist和pch文件的作用,UIApplication,iOS程序的启动过程,AppDelegate 方法解释,UIWindow,生命周期方法

    Info.plist常见的设置 建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 注:在旧 ...

  3. Android Service生命周期 Service里面的onStartCommand()方法详解

    在Demo上,Start一个Service之后,执行顺序:onCreate - > onStartCommand 然后关闭应用,会重新执行上面两步. 但是把代码拷贝到游戏工程发现,关闭游戏后,只 ...

  4. Hutool工具里,POST方法,body中传参的几种调用方法

    接口说明: POSTMAN测试: JAVA代码: package com.provy.guard.api; import java.util.HashMap; import java.util.Map ...

  5. 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  6. javascript里的sleep()方法

    很多编程语言里都有sleep(),delay()等方法,它能让我们的程序不那么着急的去执行下一步操作,而是延迟.等待一段时间.软件开发中经常会遇到需要这样的函数,比如等待几分钟去检查某一事件是否发生. ...

  7. 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

  8. Servlet里面一调用Dao里的某个方法

    背景: 这几天,由于项目集成的需要,我要在doFilter里调用dao层里的某些方法,可是总之报空指针,只要调用那个dao方法,就报错误.很是纳闷,网上查找了各种原因,终于让我给突破了,看来还是Jav ...

  9. es6的map()方法解释

    es6的map()方法解释   map方法的作用不难理解,即“映射”,也就是原数组被“映射”成对应新数组.下面这个例子是数值项求平方: var data = [1, 2, 3, 4]; var arr ...

随机推荐

  1. DQL数据查询语言——连接查询

    --内连接 两种写法 等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b.b ...

  2. Ubuntu 16.04下用Wine运行的软件出现方块的解决思路(应该是兼容现在所有平台的Wine碰到这个的问题)

    说明: 1.我使用的是深度的deepin-wine,版本为1.9.0,参考:http://www.cnblogs.com/EasonJim/p/8016674.html 2.这种问题没有一定的解决的方 ...

  3. What is Mocking?

    Mocking is primarily used in unit testing. An object under test may have dependencies on other (comp ...

  4. 设计模式之中介者模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性. ...

  5. 理解Hbase RowKey的字典排序;HBase Rowkey的散列与预分区设计

    HBase是三维有序存储的,是指rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度是依照ASCII码表排序的. HB ...

  6. remeber me即记住我功能

    1.登录过程中的记住我功能如图: 2.这样在登录认证的时候,客户端会传递两个cookie:remember_token和Tsession 3.即使客户端不传递cookie中的Tsession,只传递r ...

  7. paho-mqtt

    mqtt 参考: https://pypi.org/project/paho-mqtt/ https://github.com/eclipse/paho.mqtt.python #服务端 [root@ ...

  8. python+ubuntu+selenium安装chrome和chromedriver

    请确保selenium已经安装成功,没安装的可以pip install selenium 安装chrome 在终端输入 下载安装包 wget https://dl.google.com/linux/d ...

  9. YAML 在Python中的应用

    编程免不了要写配置文件,怎么写配置也是一门学问. YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. YAML在python语言中有PyYAML安装包,下载地址:http ...

  10. 几个有关Hadoop自带的性能测试工具的应用

    http://www.talkwithtrend.com/Question/177983-1247453 一些测试的描述如下内容最为详细,供你参考: 测试对于验证系统的正确性.分析系统的性能来说非常重 ...