socket 相关函数
socket_accept() # 接受一个Socket连接 socket_bind() # 把socket绑定在一个IP地址和端口上 socket_clear_error() # 清除socket的错误或者最后的错误代码 socket_close() # 关闭一个socket资源 socket_connect() # 开始一个socket连接 socket_create_listen() # 在指定端口打开一个socket监听 socket_create_pair() # 产生一对没有区别的socket到一个数组里 socket_create() # 产生一个socket,相当于产生一个socket的数据结构 socket_get_option() # 获取socket选项 socket_getpeername() # 获取远程类似主机的ip地址 socket_getsockname() # 获取本地socket的ip地址 socket_iovec_add() # 添加一个新的向量到一个分散/聚合的数组 socket_iovec_alloc() # 这个函数创建一个能够发送接收读写的iovec数据结构 socket_iovec_delete() # 删除一个已经分配的iovec socket_iovec_fetch() # 返回指定的iovec资源的数据 socket_iovec_free() # 释放一个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 //确保在连接客户端时不会超时 set_time_limit(0); $ip = '127.0.0.1'; $port = 1935; /* +------------------------------- * @socket通信整个过程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +-------------------------------- */ if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { // 创建一个Socket链接 echo "socket_create() 失败的原因是:" . socket_strerror($sock) . " "; } if (($ret = socket_bind($sock, $ip, $port)) < 0) { //绑定Socket到端口 echo "socket_bind() 失败的原因是:" . socket_strerror($ret) . " "; } if (($ret = socket_listen($sock, 4)) < 0) { // 开始监听链接链接 echo "socket_listen() 失败的原因是:" . socket_strerror($ret) . " "; } do { if (($msgsock = socket_accept($sock)) < 0) { //堵塞等待另一个Socket来处理通信 echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . " "; break; } else { //接收客户端消息 $buf = socket_read($msgsock, 8192); // 获得客户端的输入 $talkback = "收到的信息:$buf "; //发送消息到客户端 逻辑处理 $msg = ""; if ($buf == 1){ $msg = "传值为1,结果为逻辑处理的结果1! "; }else{ $msg = "传值不为1,结果为逻辑处理的结果123456789! "; } socket_write($msgsock, $msg, strlen($msg)); echo $talkback.'。 返回的结果为:'.$msg; //if可有可无 测试使用 $count = 0; if (++$count >= 5) { break; }; } //echo $buf; socket_close($msgsock); } while (true); socket_close($sock); ?>
客户端代码
<?php error_reporting(E_ALL); set_time_limit(0); echo "<h2>TCP/IP Connection</h2> "; $port = 1935; $ip = "127.0.0.1"; /* +------------------------------- * @socket连接整个过程 +------------------------------- * @socket_create * @socket_connect * @socket_write * @socket_read * @socket_close +-------------------------------- */ $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 第一个参数”AF_INET”用来指定域名; // 第二个参数”SOCK_STREM”告诉函数将创建一个什么类型的Socket(在这个例子中是TCP类型),UDP是SOCK_DGRAM if ($socket < 0) { echo "socket_create() failed: reason: " . socket_strerror($socket) . " "; } else { echo "OK. "; } echo "试图连接 '$ip' 端口 '$port'... "; $result = socket_connect($socket, $ip, $port); if ($result < 0) { echo "socket_connect() failed. Reason: ($result) " . socket_strerror($result) . " "; } else { echo "连接scoket服务成功 "; } $in = "2"; $out = ''; if (!socket_write($socket, $in, strlen($in))) { echo "socket_write() failed: reason: " . socket_strerror($socket) . " "; } else { echo "发送到服务器信息成功! "; } while ($out = socket_read($socket, 8192)) { echo "服务端返回的信息为:", $out; } echo "关闭SOCKET... "; socket_close($socket); echo "关闭OK "; ?>