在学习socket的使用学到流,但是一直不明白,这些流函数的执行步骤
19条回答 默认 最新
关注 1、stream_socket_client函数是和服务器建立连接,然后返回句柄fd。记住这个只是建立tcp连接。
由于并发建立多个连接,建立连接的fd都放在 $sockets数组里面。
假如本例:
请求Client1的socket fd=5555
请求Client2的socket fd=5556
$sockets[0] = 5555
$sockets[1] = 5556
2、stream_select会调用操作系统io函数select来工作,
$read = $write = $sockets;
select的机制:检查$read或者$write存放fd是否可以操作。
比如$read,有数据就把$read的fd对应标志位设置为1,即通知应用层已经有数据可以读了。
3、然后就遍历$read的fd读取数据。
上面就达到了并发请求的目的。
不明白的我打个比方:
1)、目的:从A5555,B5556两地搬砖回来,每个司机搬回来的砖头都是放在指定地方。
2)、连接:你派两个司机fd1,fd2分别开车去获取:
fd1 = stream_socket_client(A5555)
fd2 = stream_socket_client (A5556)
3)、select机制:这时你等待获取砖头,谁的卸载地(缓冲区)有砖头就通知你。
即告诉两个司机,如果在timeout时间内运回砖头,那就把fd对应的标志位设置为1,
即如果司机fd1运回砖头,fd1对应的标志位为1.
注意的是stream_select参数:timeout一般是设置为0,即立即返回。
4)、并行获取结果:
轮训从fd1,fd2的所在的缓冲区获取砖头。
如果不是select机制,我们看看如何处理:
1)、目的:从A5555,B5556两地搬砖回来,每个司机搬回来的砖头都是放在指定地方。
1)、连接:你派两个司机fd1,fd2分别开车去获取:
fd1 = stream_socket_client(A5555)
fd2 = stream_socket_client (A5556)
3)、直接获取结果:
因为没人通知你缓冲区已经有数据,你只能串行执行。
你只能从这两个卸载地(缓冲区)其中之一把砖头搬完再去另外地方搬砖。
比如先在司机fd1的缓冲区搬砖完了,再去司机fd2的缓冲区搬砖。
4) 结果就是串行获取。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 抖音咸鱼付款链接转码支付宝
- ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
- ¥15 求螺旋焊缝的图像处理
- ¥15 blast算法(相关搜索:数据库)
- ¥15 请问有人会紧聚焦相关的matlab知识嘛?
- ¥15 网络通信安全解决方案
- ¥50 yalmip+Gurobi
- ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
- ¥15 itunes恢复数据最后一步发生错误
- ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了