php socket通信中stream_select方法的理解

发布时间:2017-08-03 SOCKET PHP SELECT

关于php stream_select方法的研究理解
function stream_select (array &$read, array &$write, array &$except, $tv_sec, $tv_usec = null) {}

stream_select函数返回的条件为:

  1. $read数组中的任何一个连接发生可读事件
  2. $write数组中任何一个连接发生可写事件
  3. $except数组中的任何一个连接有带外数据到来(OOB)
  4. 当前进程收到系统信号(signal), 如:pcntl_alarm产生的闹钟信号,也就是说信号可以中断stream_select的调用,使其立即返回
  5. stream_select阻塞等待时间超过($tv_sec+$tv_usec)的时间总值,如果$tv_sec=&null时,则无限阻塞直到上面4种返回条件中的任何一种发生了

返回值

  • 返回值为监听的所有连接中发生状态改变的连接数,比如当有3个连接发生可写事件,导致方法返回,则返回值为3(integer类型)
  • 如果是被系统信号中断返回值为false并输出警告(被信号中断).
  • 如果等待直到超时都没任何事件发生,则返回0

关于带外数据

  • 带外数据长度只支持1个字符,用于发生紧急的数据,比如暂停这类的功能,就是发生一个紧急字符优先发送到对端,进而紧急处理

stream_select是如何判断连接可读可写的

  • 每一个socket连接都有一个读缓冲区(readBuffer)和一个写缓冲区(writeBuffer). 每个缓冲区都有一个低水位标记. 接收缓存区低水位标记(用于判断可读)和发送缓存区低水位标记(用于判断可写)stream_select底层通过遍历所有待监听的socket连接,并通过下面的方式判断每个连接的可读可写:
    1. 可读: 当readBuffer中的数据量”大等于”接收低水位标记值时. 默认接收低水位标记值=1; 还有另一种情况发生可读事件, 就是对端关闭连接时, 这时可以使用 !is_resource($fd) || feof($fd)==true 判断连接已经断开
    2. 可写: 当writeBuffer中剩余的可用空间”大等于”发送低水位标记值时, 默认发送低水位标记值=2048

更多相关推荐


异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

select函数:  系统提供select函数来实现多路复用输入/输出模型。原型:  #include<sys/time.h>  #include<unistd.h>  select函数:  系统提供select函数来实现多路复用输入/输出模型。原型:  #include<sys/time.h>  #include<unistd.h>  intsel...

TCP协议解析以及状态图详细分析

发布时间:2020-05-11 网络协议 网络 SOCKET LINUX C语言 C++
TCP协议解析以及状态图详细分析TCP数据报格式与UDP协议一样TCP协议也有源端口号和目的端口号,通讯的双方由IP地址和端口号标识。32位序号、32位确认序号、窗口大小。4位首部长度和IP协议头类似,表示TCP协议头的长度,以4字节为单位,因此TCP协议头最长可以是4x15=60字节,如果没有选项字段,TCP协议头最短20字节。URG、ACK、PSH、RST、SYN、FIN是六个控制位。16位检...

UDP实现多线程聊天

发布时间:2020-12-14 网络编程 网络 多线程 SOCKET UDP
接收线程创建套接字Socket,监听端口等待并接收数据包读取数据包的数据判断是否结束packagetest03;importjava.io.BufferedReader;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.SocketExceptio...

网络编程之udp学习之udp实现的高并发服务器(借助tcp的c/s模型,实现udp的c/s模型)02

发布时间:2021-02-08 LINUX网络编程 SOCKET 网络
1概述udp的高并发服务器非常简单,因为不需要连接,所以我们服务器做好后,客户端只需要往服务器中发送数据即可,无论多少个客户端,都能发送数据,能不能处理就看服务器的处理能力。这样就实现了高并发。2代码下面代码需要注意的是:1)平时tcp调用socket函数的时候都是使用SOCK_STREAM作为参2,而udp实现的c/s使用SOCK_DGRAM。2)并且服务器在recvfrom时必须获取传出的客户...

UDP socket查询高速缓存

发布时间:2020-02-08 UDP SOCKET
UDP没有连接的概念,所以UDP不会保存“正在和谁通信的信息”,换句话说,UDP数据的发送是oneshot的。我们来做个实验,两台机器分别部署UDP的server和client。先看server:#definePORT 2222intmain(){ intsockfd; charbuffer[MAXLINE]; char*tosend="aaaaaaaaaaa"; structsockaddr_i...

UDP聊天实现

发布时间:2021-03-01 SOCKET JAVA
packagecom.sean.base.netStudy.chat;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetSocketAddress;importjava....

服务器udp连接数高导致带宽堵塞,服务器宕机

发布时间:2015-12-14 网络 PHP PYTHON
2019独角兽企业重金招聘Python工程师标准>>>故障现象:从防火墙看服务器流出带宽占用高,UDP连接数超高,不稳定时高时低,导致整个网内服务器无法正常访问。分析:⒈通过服务器“本地连接状态”可以看到,发送的字节增长速度很快(几乎10m/s),收到的字节很少! 在cmd里用netstat-an查看到服务器连接的都是同一个ip,端口都是连续的。根据这个可以判定不是DDOS攻击,...

UDP数据包一次发送多大为好

在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,或许也能得到一点帮助:首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,传输层,应用层.UDP属于运输层,下面我们由下至上一步一步来看:以太网(Ethern...

linux内核中等待队列 (函数wait_event与wake_up)

发布时间:2012-01-05 数据结构与算法 PHP
     根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析    介绍这几个函数,不得不先介绍等待队列wait_queue_head_t与完成量completion。    等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。    完成量机制是基于等待队列的,内核利用该机制等待某一操作的结束。这两种经常被使用。一、等待队列 ...

【并发服务器】高并发服务器模型select实现服务器和客户端通信

select函数函数原型:intselect(intnfds,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,structtimeval*timeout);【参数列表】:nfds:监听的所有文件描述符的最大描述符+1(内核采取轮询的方式);readfds:读文件描述监听集合;writefds:写文件描述符集合;exceptfds:异常文件描述符集合;...

LINUX SOCKET select服务器监听的 聊天程序

发布时间:2020-03-14 LINUX SOCKET SELECT
前提利用ifconfig看当前主机的ip地址作为客户端代码执行的参数server.c#include<stdio.h>#include<stdlib.h>#include<string.h>#include<errno.h>#include<sys/socket.h>#include<arpa/inet.h>#include&...

Linux之select系统调用_2

发布时间:2014-08-24 LINUX SELECT
在上一篇博文中,我们的程序中我们有3个客户端,因此也事先建立了3个管道,每个客户端分别使用一个管道向服务器发送消息。而在服务器端使用select系统调用,只要监测到某一管道有消息写入,服务器就将其read,并显示在标准输出上。本篇文章,我们会让服务器拥有一个管道,专门用于从客户端接收消息(上线通知,发送需要服务器转发的消息以及下线通知)。服务器需要维护一个列表(使用结构体),记录哪些用户已经连上服...

Linux 多路I/O复用转接的Select模型的服务端和客户端

发布时间:2020-08-30 LINUX SELECT
多路I/O转接服务器多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是,不再由应用程序自己监视客户端连接,取而代之由内核替应用程序监视文件。简称找内核秘书帮干事,来人跟我说。最大优点就是跨平台!!Select1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数。2.解决1024以下客户...

服务器之select

发布时间:2019-08-25 SELECT 服务器
selectselect能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精#include<sys/select.h>/*Accordingtoe...

Linux下select函数编写服务器

发布时间:2017-07-06 LINUX SELECT 服务器
select函数1、select的作用系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE*结构的表...

Linux select服务器

发布时间:2017-08-01 LINUX 函数 SELECT 服务器
简介  系统提供select函数来实现多路复用输入/输出模型。select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE*结构的表示就是stdin、stdout...

Linux中socket的select()函数使用

发布时间:2018-05-11 C++ SELECT SOCKET LINUX
socket通讯分为两种模式:阻塞和非阻塞模式。阻塞模式在读写缓冲区时都是lock的,即没有退出或没有获得预期结果时会一直卡住不返回。对于read操作,缓冲区没有数据时会一直等待并将当前线程挂起,知道缓冲区有数据过来再唤起线程继续执行,对于write操作,当缓冲区没有足够空间写入数据时,也会一直等待,直到缓冲区有足够的空间写入数据再返回结果继续执行下面的代码。非阻塞模式就是和阻塞模式相对的了,非阻...

Linux下使用Select函数实现TCP并发服务器

发布时间:2021-09-22 笔记 LINUX SOCKET C语言 TCPIP
本文实现功能介绍在Linux下,使用socket编程,通过I/O端口的复用(select函数)实现了基于TCP协议的并发服务器,所谓并发,即可以同时处理数个客户端的连接请求或已建立连接的数据收发服务。Select函数使用说明下文中对于select函数的用法已经非常详尽,笔者这里不再赘述。链接:https://blog.csdn.net/lingfengtengfei/article/details...

linux select()详解( 三)-- TCP最简实例

发布时间:2016-06-04 网络编程 SELECT LINUX TCP 实例
通过本文你会了解到:1.TCPserver的实例2.TCPclient的实例3.TCPserver和client的运行测试4.TCPC/S模型的思考约定1.格式为/**/的注释对程序的主要流程进行说明2.格式为//的注释对程序的难懂语句进行说明TCPserver实例(server.c)#include<stdio.h>/*forprintf()andfprintf()*/#includ...

linux socket select recv ready

发布时间:2014-04-18 SELECT SOCKET FUNCTION TV LINUX
Thereisnothingtosay!Seecode:boolIsRecvReady(intm_sock){   fd_setfdsr;   structtimevaltv;   intsock_fd=m_sock;   FD_ZERO(&fdsr);   //把Sock_fd加入到文件描述符集合   FD_SET(sock_fd,&fdsr);   tv.tv_sec=1;  ...

Linux下socket多路复用应用--select函数

发布时间:2017-07-25 网络编程 SOCKET SELECT 多路复用应用
Linux下socket多路复用应用--select函数Select系统调用是用来让我们的程序监视多个文件描述符(filedescriptor)的状态变化的。程序会停在select这里等待,直到被监视的文件描述符有某一个或多个发生了状态改变。文件描述符在Linux里有很多,如果你man某个函数,在函数返回值部分说到成功后有一个文件描述符被创建,如mansocket可以看到“Onsuccess,af...

Linux操作系统select非阻塞操作socket分析

发布时间:2019-04-21 LINUX C/C++ SOCKET SELECT 异步IO
socket在很多应用常见下,单进程单线程,调用socket(),connect(),read(),write()等一套,对单个socket服务。但在多socket场景下,这样的方法行不通了。server会在accept()时阻塞,等待client连入,那么到底是监听端口8080先accept(),还是监听端口8086先accept()。这就需要引入非阻塞式轮询各个socket的状态,当他们连入状...

linux非阻塞socket教程

发布时间:2010-02-07 其它 SOCKET LINUX BUFFER STRUCT PORTABILITY TIMER
       本文并非解释什么是非阻塞socket,也不是介绍socketAPI的用法,取而代替的是让你感受实际工作中的代码编写。虽然很简陋,但你可以通过man手册与其它资源非富你的代码。请注意本教程所说的主题,如果细说,内容可以达到一本书内容,你会发现本教程很有用。 本教程内容如下:        1.改变一个阻塞的socket为非阻塞模式。       2.select模型       3.F...

Linux select实现的TCP echo

发布时间:2013-04-05 C LINUX SELECT TCP ECHO
       该文主要是用select实现了一个TCP的echo,客户端连接到服务器端,发送数据,服务器端直接回复原数据给客户端。客户端发送quit则服务器终止。需要注意的是:1、每次select前最好都要重新设置一下fd_set2、不要忘记关闭socket3、将server_sockfd用fcntl设置为非阻塞4、select最后一个超时参数,0表示不阻塞,-1表示一直阻塞直到事件发送,还有自定...

Linux环境下select并发服务器

发布时间:2020-02-22 LINUX SELECT
摘要在linux环境下多路复用模型一共有三种,分别是select、poll、epoll。本文主要记录select模型实现网络socket服务器多路并发的相关要点和知识。在写这篇文章之前,已经使用多进程和多线程实现服务器多路并发。多进程和多线程多线程对于内核的负担和内存的开销都是巨大的,原因是内核都会为新来的客户端创建新进程和新线程,会导致内核的工作效率降低。select的最大优势在于它可以在一个线...

Linux网络编程 5 - select模式的TCP服务器

发布时间:2018-03-31 网络编程 SOCKET LINUX C 网络 SELECT TCP
        为了同时处理多个客户端的连接,上一篇介绍了利用多线程的方法实现,每个连接新建一个线程,然后各自去处理。这是最简单也是最容易想到的方式。客户端的连接存在,线程就存在。      但是,对于每一个客户端,并不是时时刻刻都会向服务端发送消息的,随着客户端连接数量的增加,创建的线程也越来越多,系统在线程和进程之间切换的开销就会变得非常大。      再者,如果客户端频繁的创建连接又断开,服...

Select实现并发服务器

发布时间:2016-12-20 LINUX 并发 SELECT LINUX-C SOCKET TCP
并发服务器除了可以用多线程和多进程实现以外,还可以用select实现单线程并发,下面用select实现简单的示例,服务器接收客户端的连接,并将客户发的消息返回,代码如下:服务器端代码:main.c#include<sys/types.h>#include<sys/socket.h>#include<sys/time.h>#include<netinet/i...

linux—TCP_server端编写之利用select()函数编写可多用户同时访问

发布时间:2017-07-31 LINUX 网络 函数 SELECT SERVER TCP
1.回顾多进程、多线程编写的server之前我们编写了多进程、多线程的tcp_server,但我们发现虽然多线程和多进程的编写简单,但太占资源了,当客户端连接稍微多一点,服务器就有可能奔溃。所以我们今天要利用一种io模式:i/o复用(多路转接)2.什么是多路转接我们在IO数据时,通常时间是在等,我们普通read()函数,write()函数等一次只能等一个文件描述符,这样的效率太低了。所以我们就有了...

fwrite文本模式写入的回车换行符转换问题

发布时间:2019-09-05 C/C++ PYTHON PHP
今天在写一个日志类,用于打印服务程序的信息。我将每一个日志信息都以单行的形式输入,所以在开头加上了回车换行符。文件是以代码如下:FILE*file=fopen(log_file_name,"a+");if(!file)return;fwrite("\r\n",3,file);//这里不是原始代码,只用来说明问题然后用winhex软件查看了十六进制的数据,结果发现\r\n对应的十六进制为0D0D0A...

linux c++ select 做个简单的server

发布时间:2021-06-21 SOCKET 网络 C++ LINUX
实现功能:多个客户端连接到服务器后,在终端屏幕下输入要发送的消息,按enter发送到服务器,服务器返回原消息给客户端。server.cpp#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>#include<netinet/in.h>#include<arpa/inet.h&g...

c/c++ TcpServer-Select管理模式

发布时间:2018-02-10 SOCKET TCP SELECT
TcpServer1:当我们的Server接入一个客户端进来以后,就要管理好负责从客户端来接收数据,但是服务器要对多个客户端从不能一直等待这一个客户端有数据进来;2:我们的server还要读写数据,总不能一直等着有新的用户进来;3:需要一种方式来管理,select模型来管理我们的TcpServer;1>创建一个句柄集合,这个集合里面有要管理的所有的socket(句柄);2>使用sele...

客户端升级为select网络模型

发布时间:2020-04-08 网络 SOCKET C++ C语言
现在将服务端新加一个网络消息当有一个新的客户端加入的时候就通知给其他客户端server修改enumCMD{ CMD_LOGIN, CMD_LOGIN_RESULT, CMD_LOGOUT, CMD_LOGOUT_RESULT, CMD_NEW_USER_JOIN, //新增一个类型 CMD_ERROR};//一个新的用户加入就群发给别的客户端structNewUserJoin:publicData...

socket通信与select函数

发布时间:2018-04-16 SOCKET SELECT
intmain(intargc,constchar*argv[]){intsockfd,acceptfd;structsockaddr_inserveraddr,clientaddr;socklen_taddrlen=sizeof(serveraddr);charbuf[N]={};ssize_tbytes;//初始化结构体memsetbzerobzero(&serveraddr,addr...

TCP/IP编程之select函数详解

发布时间:2016-07-12 TCP/IP SELECT SOCKET LINUX 网络编程 TCP
前述:linux下的I/O复用模型目前很多都已经不用select函数了,而是用epoll,但是为什么还需要了解select编程呢,其实是从两个方面考虑的:一是为了通过select去理解epoll,而是非阻塞的connect函数也会用到select函数。函数原型:SELECT(2)LinuxProgrammer'sManualSELECT(2)NAMEselect,pselect,FD_CLR,FD...

TCP中select函数的理解

发布时间:2016-07-17 TCP SELECT
1、select一般用在非阻塞的通信中(主要可以设置超时时间);2、一般服务端可以使用select的模型,如创建SOCKET以后,监听等待直到有accept,3、然后可以对所有接入的连接轮训进行数据包的收发,主要使用如下几个函数,该方法跟linux下poll或者epoll相似FD_ZERO(&set);      //将你的套节字集合清空 FD_SET(nSocket,&set);...

select版tcp服务器(python实现)

在编写了单进程非阻塞式服务器之后,还有另外种写服务器的方法,便是利用select。select是对底层操作系统的一个访问操作,因而效率较高,比单进程非阻塞中的for循环遍历效率要高,可以利用select进行选择,选择出来可以读取信息的套接字、可以发送信息的套接字、以及产生的异常(分别是三个返回值)。readable,writable,exceptionable=select([],[],[])以上...

Linux下的UDP Socket简单例子

发布时间:2013-08-19 LINUX SOCKET C/C++ NET
客户端代码client.c#include<stdio.h>#include<string.h>#include<sys/socket.h>#include<netinet/in.h>int main(int argc, char **argv){    int sockfd;    struct sockaddr_in servaddr;    s...

关于非阻塞模式下的SOCKET设定处理---select模式

下面范例是一个关于非阻塞模式下的SOCKET设定处理---select模式。使用的是UDP协议。Client02首先启动,将本机的1207端口进行SOCKET绑定,并将该SOCKET模式设定为非阻塞模式,此模式下不可直接调用recvfrom。理由: 阻塞模式下,如果直接调用recvfrom从指定的SOCKET读取数据,如果还没有接受到来自Client01的数据,函数recvfrom会一直等待,直到...

socket select模型(一)

发布时间:2015-05-15 SOCKET 网络编程
fd_set编辑select()机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。fd_setset...

网络编程Socket之TCP之select概述

发布时间:2014-07-23 网络编程SOCKET之TCP SOCKET TCP SELECT
I/O模型:1. 阻塞式I/O模型2. 非阻塞式I/O模型:使用fcntl将套接字设置成非阻塞;然后轮询读取数据,这样会耗费大量CPU时间;3. I/O复用模型:阻塞在select上;4. 信号驱动式I/O模型:5. 异步I/O模型:aio_read,信号直到数据已复制到应用进程缓冲区才产生select:select的最后一个时间参数:1. 为空时表示永远等下去;2. 为具体非0时间时表示不超过该...

socket编程select函数的使用

发布时间:2018-01-02 SOCKET SELECT
socket编程中,connect、accept、recv或者是recvfrom是阻塞方式,就是进程或是线程执行到这些函数时必须等待某个事件发生,如果没有事件发生,进程或者线程就会被阻塞,函数不能立即返回,可是select就可以完成非阻塞,就是进程或是线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,如果事件不发生则返回一个...

select版的TCP通信

发布时间:2016-04-27 SELECT TCP
    编写代码之前,大概先说一下利用select编写tcp的思路及select特点。    select系统调用是用来让程序监视多个文件句柄的状态变化的,程序会停在select这里等待,直到被监视的句柄有一个或者多个发生了状态改变。select函数为:intselect(intnfds,fd_set*readfds,fd_set*writefds,异常文件描述符,时间长度)//默认时间长度异常事...

socket编程—select方法使用

发布时间:2016-05-31 计算机网络 SOCKET SELECT 服务器
0.背景最近要写一个RPC库,即在客户端向服务端发送请求,服务器计算并返回结果,要求实现服务端能同时接收多个客户端请求但是不能使用线程库,根据提示我知道了可以使用select函数来完成非阻塞方式工作的程序,于是我就开始了select方法的学习。1.概念Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序(比如我),他们只是习惯写诸如conne...

Linux编程之select示例

发布时间:2021-04-24 LINUX-C编程 SOCKET 网络
基础原理理解请参考这篇:IO-同步,异步,阻塞,非阻塞(亡羊补牢篇)select主要解决的问题:(详细请参考:select用法&原理详解(源码剖析))select/epoll区别:如果这篇文章说不清epoll的本质,那就过来掐死我吧!select特点:select需要使用两个systemcall(select和recvfrom),而blockingIO只调用了一个systemcall(re...

select循环读取数据

发布时间:2017-06-20 读取数据 SELECT
<selectid="srType"name="srType"value="test"><c:forEachvar="sd"items="${sysRoleTypeList}"><optionvalue="${sd.sdId}">${sd.sdName}</option></c:forEach></select> 转载于:ht...