专栏首页wakiphp 纯socket编程核心的东西!socket_read阻塞的问题!

php 纯socket编程核心的东西!socket_read阻塞的问题!

网上的代码大都是官方的例子,不直观、不彻底。 结合网上的东西花了一周的时间。
这是一篇socket应用级别的文章,更深入的了解(自己写的):

最大视角-从Unix底层 理解 python的io模型、python异步IO、python的select、Unix的select、epoll fileno 的本质:可读写文件 一图了解 socket原理 Python 标准输入输出

通常:一些简单的概念结合在一起就变得混乱

重点: 1、阻塞就是,没有按照PHP的思维习惯,在莫名其妙的请款下就停止了【阻塞】,阻塞的本质是在底层操作系统、网络接口等用c语言封装后暴露出来的一个PHP函数(看c的socket总结出来的) 2、socket_accept、socket_read、socket_recv默认都会阻塞,但也可以用socket_set_nonblock()、socket_set_block()设置 3、PHP不关心buffer缓存,在这: socket_read的buffer=n 意思是:最多读取n个字符(注意编码),和while结合就有点懵逼了:每满n个字符就输出 socket_write的$buffer=n 意思是: 最多写入n个字符 4、socket 很大程度受限于操作系统(即 和操作系统紧密相关)

一图了解

用到的代码(最简单的才容易理解)

<?php
$socket_create = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket_create, '127.0.0.1', 13145);
socket_listen($socket_create,4);
// socket_set_nonblock($socket_create);	//错误的地方
error_reporting(E_ERROR );
while (true){	//while 是抄来的所以不懂得 使用的原因	//关系到socket_close要不要运行,什么时候运行(需要更进一步研究)
    print_r("暂停\n");
    $socket_accept = socket_accept($socket_create);
    print_r("继续\n");
/**********************************************************************************read研究开始 两者注释一个*/
   //  socket_set_nonblock($socket_accept);
    
   // while(($buf_read_data = socket_read($socket_accept, 2, PHP_BINARY_READ)) !== false){//PHP_NORMAL_READ 不够length就阻塞,PHP_BINARY_READ不会
   //     var_dump($buf_read_data."\n");
   // }
/**********************************************************************************read研究 结束 */
/**********************************************************************************recv研究开始 两者注释一个*/
    socket_set_nonblock($socket_accept);	
    // //socket_read、socket_recv、socket_accept三个默认都是阻塞的,不阻塞就是:不会'卡死'在这些函数上
    //不开启不能反向写入数据:报错:Warning: socket_recv(): unable to read from socket [0]: ����ɹ���ɡ�
    //如果不开启的话就是同步,同步在此意思是:此处socket和client的socket是同一个socket,客户端的socket sleep几秒,这里也sleep几秒。最终因为网速慢于电脑,所以客户端接受不到这里write的数据,client的while就运行完了
   	while ($flag = socket_recv($socket_accept, $buf, 2, 0)) {
   		var_dump($flag);
   	}
   	var_dump($flag);
/**********************************************************************************recv研究 结束*/   
    print_r("读完了\n");
// sleep(1);	//这里是没用的,请看client
	$write_data = socket_write($socket_accept, 'aaaaaaaaaaa',1024);//写数据的时候buffer无所谓
   	print_r($write_data."\n");
   	print_r("写完了\n");

}
socket_close($socket_accept);
print_r("结束\n");

客户端

<?php
$socket_create = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$socket_connect = socket_connect($socket_create, '127.0.0.1', 13145);
//socket_connect($socket_create, '127.0.0.1', 13145);
socket_set_nonblock($socket_create);	//必须开启  结果:不开启不会结束(socket_close) 原因:未知

//socket_write($socket_create, $aa = "abcdef我", 10);
socket_write($socket_create, $aa = "abcdefe", strlen($aa));
print_r(strlen($aa));
sleep(5);	//机器运算要比网络传输快几百倍,服务器还没有返回数据呢就已经开始运行了,当然就收的是空值了
while ($flag = socket_recv($socket_create, $buf, 2, 0)) {
	var_dump($flag);
}
var_dump($flag);
socket_close($socket_create);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux nginx访问控制只允许某个ip段访问特定路径

    要在nginx中做特定目录访问控制首先要了解nginx中^~的意义,^~ 匹配路径的前缀,优先级在conf正则里同=一样是最高的优先匹配。 例如^~/cont...

    葫芦
  • 研究人员发现了一种读取加密数据的新型侧信道攻击

    近期,研究人员发现了一种能够读取加密数据的新型侧信道攻击技术,这种攻击技术针对的是操作系统,而不是芯片,而且这种技术将有可能成为网络犯罪分子获取目标公司加密技术...

    FB客服
  • 如何发现Web App Yummy Days的安全漏洞?

    作为一个金融Web应用的开发人员,我对安全问题一直尤为关注。在过去的两年里,我参与的一些Web应用在进入生产模式之前,都会经过全面严格的安全检查,以确保它们在完...

    FB客服
  • React Router v4教程:为你的 React 应用创建路由[每日前端夜话0x59]

    翻译:疯狂的技术宅 原文:https://www.edureka.co/blog/react-router/

    疯狂的技术宅
  • FDsploit:文件包含路径回溯漏洞的挖掘枚举和利用

    FDsploit可自动化的为我们发现和利用本地/远程文件包含及目录遍历漏洞。如果发现了LFI漏洞,可以使用--lfishell选项来进行利用。目前,支持以下3种...

    FB客服
  • GitHub Desktop在OSX系统下的RCE漏洞

    2018年,我有幸受邀参加了HackerOne在赌城拉斯维加斯举办的,赏金超过50万美金的H1-702黑客马拉松大赛。本次大赛的测试目标包括GitHub,对我个...

    FB客服
  • Sitadel:一款功能强大的Web应用扫描器

    Sitadel实际上是WAScan的升级版,不过是Python版本(>= 3.4)的,这样有助于研究人员根据自己的需要去进行自定义开发,并引入新的功能模块。

    FB客服
  • centos7查看修改时区

    2、timedatectl list-timezones: 列出所有时区 3、timedatectl set-local-rtc 1 将硬件时钟调整为与本地时...

    24-丰总
  • 如何利用postMessage窃取编辑用户的Cookie信息

    某天,当我在做某个项目的漏洞测试时,在登录的一些HTTP请求记录中,我发现了一种利用postMessage方式窃取和编辑用户Cookie的方法。由于该测试是邀请...

    FB客服
  • 揭秘一句话木马的套路

    可变函数:通过一个变量,获取其对应的变量值,然后通过给该值增加一个括号 (),让系统认为该值是一个函数,从而当做函数来执行。

    FB客服

扫码关注云+社区

领取腾讯云代金券