PHP的socket详解

来源:互联网 发布:软件可行性方案模板 编辑:程序博客网 时间:2024/06/06 19:41
resource socket_create ( int $domain , int $type , int $protocol )
    socket_create — 创建一个套接字(通讯节点)


    domain 参数指定哪个协议用在当前套接字上。


        AF_INET     IPv4 网络协议。TCP 和 UDP 都可使用此协议。
        AF_INET6    IPv6 网络协议。TCP 和 UDP 都可使用此协议。
        AF_UNIX     本地通讯协议。具有高性能和低成本的 IPC(进程间通讯)。


    type 参数用于选择套接字使用的类型。


        SOCK_STREAM 提供一个顺序化的、可靠的、全双工的、基于连接的字节流。支持数据传送流量控制机制。TCP 协议即基于这种流式套接字。
        SOCK_DGRAM  提供数据报文的支持。(无连接,不可靠、固定最大长度).UDP协议即基于这种数据报文套接字。
        SOCK_SEQPACKET  提供一个顺序化的、可靠的、全双工的、面向连接的、固定最大长度的数据通信;数据端通过接收每一个数据段来读取整个数据包。
        SOCK_RAW    提供读取原始的网络协议。这种特殊的套接字可用于手工构建任意类型的协议。一般使用这个套接字来实现 ICMP 请求(例如 ping)。
        SOCK_RDM    提供一个可靠的数据层,但不保证到达顺序。一般的操作系统都未实现此功能。


    protocol 参数,是设置指定 domain 套接字下的具体协议。这个值可以使用 getprotobyname() 函数进行读取。如果所需的协议是 TCP 或 UDP,可以直接使用常量 SOL_TCP 和 SOL_UDP 。




bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
    绑定 address 到 socket。 该操作必须是在使用 socket_connect() 或者 socket_listen() 建立一个连接之前。
    成功时返回 TRUE, 或者在失败时返回 FALSE。


    socket 用 socket_create() 创建的一个有效的套接字资源。


    address 如果套接字是 AF_INET 族,那么 address 必须是一个四点分法的 IP 地址(例如 127.0.0.1 )。
            如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock )。


    port (可选)参数 port 仅仅用于 AF_INET 套接字连接的时候,并且指定连接中需要监听的端口号。


    
bool socket_listen ( resource $socket [, int $backlog = 0 ] )
    在绑定Socket后,服务器端使用此函数监听客户端数据。


    socket 用 socket_create() 创建的一个有效的套接字资源。


    backlog(可选) 标识允许的最大连接数。


bool socket_set_block ( resource $socket )
    设置为非阻塞模式。


int socket_write ( resource $socket , string $buffer [, int $length = 0 ] )
    使用此函数向Socket写入数据。


string socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] )
    从套接字读取的最大长度字节


    socket resource;
    length 字符长度;
    type PHP_BINARY_READ |PHP_NORMAL_READ
        PHP_BINARY_READ 安全读取二进制数据
        PHP_NORMAL_READ 遇到"\r"或"\n"时停止




resource pfsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )
    实现长连接。Client方与Server方先建立通信连接,连接建立后不断开,然后在进行报文发送和接受。
    这个函数的作用与fsockopen()完全一样的,不同的地方在于当在脚本执行完后,连接一直不会关闭。可以说它是fsockopen()的长连接版本。


bool socket_set_option ( resource $socket , int $level , int $optname , mixed $optval )
    设置Socket的控制选项


    设置$socket发送超时1秒
    secket_set_option($socket, SOL_SOCKET. SO_RCVTIMEO, ['sec' => 1, 'usec' => 0]);
    设置$socket接收超时3秒
    secket_set_option($socket, SOL_SOCKET. SO_SNDTIMEO, ['sec' => 3, 'usec' => 0]);


int socket_last_error ([ resource $socket ] )
    函数返回操作中任何socket函数产生的最后错误,返回值是一个int型的错误代号


string socket_strerror ( int $errno )
    函数给出对错误码的字符串描述。具体定义在windows和类UNIX系统略有差异,详见PHP手册




<?php
    $host = "192.168.0.2";
    $port = "12345";


    set_time_limit(0); //最好运行在CLI模式下运行,保证服务不会超时


    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket");


    $result = socket_bind($socket, $host, $port) or die("Could not bind to socket");


    $result = socket_listen($socket, 3) or die("Could not set up socket listener");
    //接收连接请求并调用另一个子Socket处理客户端--服务器间的信息
    $spawn = socket_accept($socket) or die("Could not accept incoming connection");
    //读客户端输入
    $input = socket_read($spawn, 1024) or die("Could not read input");
    //clean up input string
    $input = trim($input);
    //反转客户端输入数据,返回服务端
    $output = strrev($input)."\n";
    socket_write($spawn, $output, strlen($output)) or die("Could not write output");


    socket_close($spawn);
    socket_close($socket);
?>
0 0