socket基础

来源:互联网 发布:神工电脑刻绘机软件 编辑:程序博客网 时间:2024/04/28 11:52

转自:http://www.cnblogs.com/fcode/articles/socket.html

迷人而又让人容易懵懂的套接字(Sockets)。Sockets在PHP中是没有充实哄骗的功能。今天你将瞥见产生1个能使用客户端连接的办事器,并在 客户端使用socket进行连接,办事器端将具体的处置惩罚信息发送给客户端。

当你瞥见完备的socket过程,那么你将会在往后的程序研发中使用它。这个办事器是1个能让你连接的HTTP办事器,客户端是1个Web浏览器,这是一 个单一的 客户端/办事器 的关系。

Socket 基础

PHP使用Berkley的socket库来创建它的连接。你可以懂得socket只不过是1个数值布局。你使用这个socket数值布局去开始1个客户端和办事器之间的会话。这个办事器是一直在监听准备产生1个新的会话。当1个客户端连接办事器,它就打开办事器正在进行监听的1个端口进行会话。这时,办事器端接受客户端的连接请求,那么就进行一次循环。此刻这个客户端就可以兴许发送信息到办事器,办事器也能发送信息给客户端。

产生1个Socket,你需要3个变量:1个协议、1个socket类型和1个大众协议类型 。产生1个socket有三种协议供选择,接续看底下的内容来 获取具体的协议内容。

定义1个大众的协议类型是进行连接1个必不可少的元素。底下的表咱们看看有那些大众的协议类型。

表一:协议

名儿/常量描述

AF_INET这是大多数用来产生socket的协议,使用TCP或UDP来传输 ,用在IPv4的地址

AF_INET6与上面类似,不过是来用在IPv6的地址

AF_UNIX本地协议,使用在Unix和Linux 系 统上,它很少使用,一般都是当客户端和办事器在同一台及其上的时辰使用

表二:Socket类型

名儿/常量描述

SOCK_STREAM这个协议是按照顺序的、可靠的、数值完备的基于字节流的连接 。这是1个使用最多的socket类型,这个socket是使用 TCP 来进行传输。

SOCK_DGRAM这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP 来进行它的连接。

SOCK_SEQPACKET这个协议是双线路的、可靠的连接,发送固定长度的数值包进行传输。必须把这个包完备的接受才气进行读取。

SOCK_RAW这个socket类型提供单一的收集访问,这个socket类型使用ICMP大众协议。(ping、traceroute使用该协 议)

SOCK_RDM这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数值链路层使用,不保证数值包的顺序

表三:大众协议

名儿/常量描述

ICMP互联网控制消息协议,首要使用在网关和主机上,用来检查收集状态和报告错误信息

UDP 用户数值报文协议,它是1个无连接,不可靠的传输协议

TCP 传输控制协议,这是1个使用最多的可靠的大众协议,它能保证数值包可以兴许到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数值包。

此刻你懂得了产生1个socket的3个元素,那么咱们就在php中使用socket_create()函数来产生1个socket。这个 socket_create()函数需要3个参数:1个协议、1个socket类型、1个大众协议。socket_create()函数运行成功归回1个 包含socket的资源类型,如果没有成功则归回false。

Resourece socket_create(int protocol, int socketType, int commonProtocol);

Socket函数

函数名描述

socket_accept()接受1个Socket连接

socket_bind()把socket绑定在1个IP地址和端口上

socket_clear_error()清除socket的错误或者最后的错误代码

socket_关上()关闭1个socket资源

socket_connect()开始1个socket连接

socket_create_listen()在指定端口打开1个socket监听

socket_create_pair()产生一对没有区另外socket到1个数组里

socket_create()产生1个socket,至关于产生1个socket的数值布局

socket_get_option()获取socket选项

socket_getpeername()获取长途类似主机的ip地址

socket_getsockname()获取本地socket的ip地址

socket_iovec_add()添加1个新的矢量到1个分离/聚合的数组

socket_iovec_alloc()这个函数创建1个可以兴许发送接收读写的iovec数值布局

socket_iovec_delete()删除1个已分配的iovec

socket_iovec_fetch()归回指定的iovec资源的数值

socket_iovec_free()释放1个iovec资源

socket_iovec_set()配备布置iovec的数值新值

socket_last_error()获取时下socket的最后错误代码

socket_listen()监听由指定socket的所有连接

socket_read()读取指定长度的数值

socket_readv()读取从分离/聚合数组过来的数值

socket_recv()从socket里结束数值到缓存

socket_recvfrom()接受数值从指定的socket,如果没有指定则默认时下socket

socket_recvmsg()从iovec里接受消息

socket_select()多路选择

socket_send()这个函数发送数值到已连接的socket

socket_sendmsg()发送消息到socket

socket_sendto()发送消息到指定地址的socket

socket_set_block()在socket里配备布置为块标准样式

socket_set_nonblock()socket里配备布置为非块标准样式

socket_set_option()配备布置socket选项

socket_shutdown()这个函数许可你关闭读、写、或者指定的socket

socket_strerror()归回指定错误号的具体错误

socket_write()写数值到socket缓存

socket_writev()写数值到分离/聚合数组

以上所有的函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去失底下这行前面的注释:

extension=php_sockets.dll

如果你没有办法去失注释,那么请使用底下的代码来加载扩展库: if(!extension_loaded(‘sockets’)) { if(strtoupper(substr(PHP_OS, 3)) == “WIN”) { dl(‘php_sockets.dll’); } else { dl(‘sockets.so’); } }

*如果你不懂得你的socket是不是打开,那么你可以使用phpinfo()函数来确定socket是不是打开。你经由过程查看phpinfo信息了解 socket是不是打开。