php socket函数学习
2017-04-04 本文已影响293人
小小浪把_Dont_know拍
php函数
socket_create
创建socket资源
resource socket_create ( int $domain , int $type , int $protocol )
domain
socket要使用的协议集,这个参数看着有点歧义,不知道的还以为是域名呢。取这个名字,估计是为了和第三个参数作区分。
Domain | 描述 |
---|---|
AF_INET | IPv4 网络协议 |
AF_INET6 | IPv6 网络协议 |
AF_UNIX | 本地通讯协议 |
type
套接字类型
type | 描述 |
---|---|
SOCK_STREAM | 字节流。TCP基于这种流式套接字 |
SOCK_DGRAM | 数据报文。UDP基于这种数据报文套接字 |
SOCK_SEQPACKET | 提供固定长度的数据通信 |
SOCK_RAW | 提供读取原始的网络协议。一般使用这个套接字来实现ICMP请求(例如 ping) |
SOCK_RDM | 提供一个可靠的数据层,但不保证到达顺序。一般操作系统未实现此功能。 |
protocol
与domain结合使用,设置指定domain套接字下的具体协议。这里的值可以通过 getprotobyname() 进行读取。例如
socket_create(AF_INET, SOCK_STREAM, getprotobyname('ip'));
getprotobyname
返回/etc/protocols下的协议值。
int getprotobyname ( string $name )
以osx系统下的/etc/protocols为例,这里只显示其中一部分较常用的。
name | proto |
---|---|
ip | 0 |
icmp | 1 |
tcp | 6 |
udp | 17 |
socket_bind
将地址端口绑定到socket资源上,在使用 socket_connect() 或者 socket_listen() 之前调用此函数。
bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
socket_listen
用于服务端,监听socket的连接。
bool socket_listen ( resource $socket [, int $backlog = 0 ] )
在 socket_create() 和 socket_bind() 完成以后调用。
socket_listen()只适用于SOCK_STREAM或者SOCK_SEQPACKET。
socket
用socket_create()创建的一个有效连接。
backlog
socket连接请求队列的最大数量,如果连接请求进来,队列已满,则直接抛出ECONNREFUSED错误。
socket_set_option
设置socket参数
bool socket_set_option ( resource $socket , int $level , int $optname , mixed $optval )
socket
同上。
level
level指定了协议层级依赖的选项。例如,为了从socket一级获取选项,参数level就可以指定为SOL_SOCKET。其他值也可以用getprotobyname()获取。
optname
socket可选设置,这里有很多,我们只用到一个SO_REUSEADDR。
optname | 描述 |
---|---|
SO_REUSEADDR | 是否需要重复使用地址 |
optval
optname对应的值。
socket_set_nonblock
设置socket为非阻塞。
bool socket_set_nonblock ( resource $socket )
当一个操作作用在非阻塞的socket上时,脚本不会暂停执行,直到收到信号或者它可以执行操作了。然而,如果一个操作会导致阻塞,调用方法会失败。