以前一直经为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. [POI2014]Cards

    题目大意: 有$n(n\le2\times10^5)$张卡片排成一排,每张卡片正反面有两个数$a_i$和$b_i$.$m(m\le10^6)$次操作,每次交换第$c_i$和第$d_i$张卡片,问若可以 ...

  2. Linux下查看某个进程的网络带宽占用情况

    说明: 1.可能查看某个进程的带宽占用需要明确知道PID.进程名字.发送速度.接收速度. 2.很遗憾,在Linux原生的软件中没有这样的一款,只能额外装,最符合以上的情况就只有nethogs. 3.n ...

  3. service mysqld start 报错:service mysqld start 报错 090517 13:34:15 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 090Can't open the mysql.plugin table. Please run mysql

    service mysqld start 报错 090517 13:34:15 [ERROR] Can't open the mysql.plugin table. Please run mysql_ ...

  4. tiny4412 串口驱动分析八 --- log打印的几个阶段之内核启动阶段(printk tiny4412串口驱动的注册)

    作者:彭东林 邮箱:pengdonglin137@163.com 开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 ...

  5. Linux下防止文件误删方法

    转载:http://coolsky.blog.51cto.com/177347/1230332 Linux系统中,在root帐号下使用rm * -rf是非常危险的,一不小心就可能删除系统中的重要文件. ...

  6. go+mysql实现页面的增删改查练习

    原文地址:http://www.niu12.com/article/35 初次学go,在了解一些基础之后就开始做一个用户的增删改查来回顾知识,有很多数据验证和安全漏洞并没有考虑,只当作联系 前提:下载 ...

  7. Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle

    ylbtech-DatabaseDesgin:Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle DatabaseName:PetShop(宠物商店) Model:宠物商店网 ...

  8. EM算法和GMM模型推导

  9. 搭建Drupal-8.5.3

    环境说明 系统版本    CentOS 6.9 x86_64 软件版本    yum安装nginx 1.10.2 yum安装php 7.2.6(当前的最新版本) yum安装mysql 5.5.60 d ...

  10. java学习笔记——可用链表

    NO 链表方法名称 描述 1 public void add(数据类型 对象) 向链表中增加数据 2 public int size() 查看链表中数据个数 3 public boolean isEm ...