在看了一下php版的socket-api后,发现php和c语言果然是亲源关系,其socket函数名都有很多相似之处,好了,开始学习。
一. Socket的建立
1.创建socket资源
/**
* Socket协议:domain => AF_INET(ipv4) AF_INET6(ipv6) AF_UNIX(本地进程间通讯)
* Socket类型:type => SOCK_STREAM(顺序全双工字节流,TCP) SOCK_DGRAM(数据报文,UDP)
* SOCK_SEQPACKET(面向连接和包最大长度) SOCK_RAW(构建任意类型的协议,ICMP【ping】)
* SOCK_RDM(可靠的数据层,但不保证到达顺序,一般系统未实现)
* domain-Socket下的具体协议:SOL_TCP SOL_UDP 还有ICMP但不知道常量名
*/
resource socket_create ( int $domain , int $type , int $protocol )
2.(服务器端)绑定IP地址和端口
/*
* 地址address:AF_INET族(IP地址) AF_UNIX族(Unix套接字一部分[例如 /tmp/my.sock ])
* 端口port : 仅用于AF_INET的端口号
*/
bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
3.(服务器端)开始监听端口
/*
* backlog:最大接收的客户端连接数
*/
bool socket_listen ( resource $socket [, int $backlog = 0 ] )
4.(服务器端)获得连接上servcer的与client相关的socket,用于通信,阻塞
resource socket_accept ( resource $socket )
5.(客户端)在create后,主动连接服务器
bool socket_connect ( resource $socket , string $address [, int $port = 0 ] )
二. 数据的发送
1.数据的发送write函数
int socket_write ( resource $socket , string $buffer [, int $length ] )
2.数据的发送send函数
int socket_send ( resource $socket , string $buf , int $len , int $flags )
注意这里send比write多了一个参数flags,该标志有如下几种情况:
MSG_OOB:发送带外数据(也就是同一连接优先级更高的紧急数据);
MSG_EOR: 当发送数据量达到一条完整的记录时,才发送信息(windows不支持);
MSG_EOF: 当发送完这一帧信息后,关闭连接(windows不支持)。
MSG_DONTROUT: 绕开路由表,直接查找目标用户(一般用于本地通讯)
三.数据的接收
1.数据的接收read函数
string socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
2.数据的接收reacv函数
int socket_recv ( resource $socket , string &$buf , int $len , int $flags )
这里的flags参数也有四中状态:
MSG_OOB 处理超出边界的数据
MSG_PEEK 从接受队列的起始位置接收数据,但不将他们从接受队列中移除。
MSG_WAITALL 在接收到至少 len 字节的数据之前,造成一个阻塞,并暂停脚本运行(block)。但是, 如果接收到中断信号,或远程服务器断开连接,该函数将返回少于 len 字节的数据。
MSG_DONTWAIT 如果制定了该flag,函数将不会造成阻塞,即使在全局设置中指定了阻塞设置。
四. Socket的关闭
void socket_close ( resource $socket )
—–to do——————–