一、Socket一般称为“套接字”,用于描述IP地址和端口,是一个通讯链的句柄。php
二、应用程序经过套接字向网络发出请求或者应答网络请求。编程
三、Socket既不是一个程序,也不是一种协议,其只是操做系统提供的通讯层的一组抽象API。服务器
四、进程通讯的相关概念:网络
网间进程通讯要解决的是不一样主机进程间相互通讯问题。为此,首先要解决的是网间进程标识问题。同一主机上,不一样进程可用惟一进程号(Process ID)标识。dom
(1)端口:网络中能够被命名和寻址的通讯端口,是操做系统可分配的一种资源,用于标识通讯的进程socket
传输层和网络层在功能上功能上的最大区别是传输层提供进程通讯能力。函数
端口是一种抽象的软件结构。应用程序(即进程)经过系统调用与某端口创建链接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应的进程发给传输层的数据都经过该端口输出。工具
相似于文件描述符,每个端口都拥有一个端口号,都是整数型标识符,用于区别不一样端口。spa
TCP/UDP段结构中端口的地址都是16比特,有0~65535个端口号。操作系统
常见的端口号有,FTP(22)、HTTP(80)、SMTP(25)等。
(2)地址:
网络通讯中通讯的两个进程分别处在不一样的机器上,应遵循如下原则:
某台主机能够与多个网络相连,必须指定一个特定的网络地址;
网络上每台主机应有惟一的地址;
每台主机的每一个进程应有在该主机上的惟一标识符
(3)链接:
两个进程间的通讯链路称为链接。链接表现为一些缓冲区和一组协议机制。
五、Socket是一种服务,与其实现的语言无关。基于这个性质,咱们能实现不一样服务之间,不一样语言之间的互联互通。
六、注意一个小知识点:本地进程间经过TCP通讯,使用Fiddler等抓包工具是抓不到数据的。主要是由于回环接口的机制,这些包不会到达网卡,数据包直接被返回到传输层的输入队列中去了。
七、Socket函数原型:
SOCKET socket(int af, int type, int protocol);
af:指定应用程序使用的通讯协议的协议族,对于TCP/IP协议族该参数设置为AN_INET,对于UNIX可创建本地Socket
type:指定建立socket类型:
流套接字类型(SOCK_STREAM):最多见的类型,基于TCP协议
数据报套接字类型(SOCK_DGRAM):即UDP数据报
原始套接字类型(SOCK_RAW):在IP层对套接字进行编程
protocol:指定应用程序所使用的通讯协议。最经常使用的是TCP和UDP
流套接字和数据报套接字不能完成的任务,能够在原始套接字中得以实现。
八、Socket从传输模式上又分为端对端和点对点的链接,流套接字和数据报套接字都属于端对端的链接,所以须要绑定端口号。而原始套接字是基于IP协议的,属于点对点的传输模式,是没有端口这个概念的。好比经常使用的监测网络链接ping命令,就是基于ICMP协议的,它不存在端口的概念。
九、PHP中的Socket函数:
(1)socket_create(int $domain, int $type, int $proticol):建立一个socket
第一个参数指定socket建立时所使用的通讯协议族 AF_INET(基于IPv4)、AF_INET6(基于IPv6)、AF_UNIX(UNIX本地通讯协议)
第二个参数指定socket通讯的交互类型,SOCK_STREAM(可靠的全双工连接,支持TCP)、SOCK_DGRAM(自动寻址信息功能,支持UDP)等
第三个参数指定搜才可使用何种类型处理协议,包括ICMP、UDP、TCP
(2)socket_bind(resource $socket, string $address[, int $port = 0]):将IP地址和端口绑定到socket_create()所建立的句柄
第一个参数是必选参数,其值是socket_create()建立的句柄
第二个参数是必选参数,其值是要绑定的IP地址
第三个参数是可选参数,其值是要绑定的端口号
(3)socket_listen($socket[, $backlog = 0]):用于监听客户端数据
第一个参数是socket句柄
第二个参数的容许的最大链接数
(4)socket_set_block($socket):设置为非阻塞模式
(5)socket_write($socket, $buffer[, $length=0]):使用此函数想socket写入数据
(6)socket_read($socket, $length[, $type = PHP_BINARY_READ]):读取指定长度的数据
(7)fsockopen($hostname, [$port = -1 [, $errno [, $errstr [$timeout = ini_get["default_socket_timeout"] ]]]) :实现长链接
(8)socket_set_option($socket, $level, $optname, $optval):设置socket的控制选项
(9)socket_last_error([$socket]):返回操做中任何socket产生的最后错误,返回值是一个int型的错误代号
接下来用PHP建立一个socket例子:
1 <?php 2 $host = "127.0.0.1"; 3 $port = 8880; 4 set_time_limit(0); 5 6 //建立socket 7 $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die('create error'); 8 9 //绑定socket到指定端口 10 $result = socket_bind($socket, $host) or die('bind error'); 11 12 //开始监听链接 13 $result = socket_listen($socket, 3) or die('listen error'); 14 15 //接收链接请求并调用另外一个子socket处理客户端——服务器间的信息 16 $spawn = socket_accept($socket) or die('accept error'); 17 18 //读取客户端输入 19 $input = socket_read($spawn, 1024) or die('spawn read error'); 20 21 $output = "我是返回的数据"; 22 //返回服务端 23 socket_write($spawn, $output, strlen($output)) or die('write error'); 24 25 //关闭socket 26 socket_close($socket); 27 socket_close($$spawn); 28 ?>