• php Socket基础


    ◆ Socket 基础
    PHP使用Berkley的socket库来创建它的连接。socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
    产生一个Socket,你需要三个变量:一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。
    定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。
    表一:协议
    名字/常量     描述
    AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
    AF_INET6     与上面类似,不过是来用在IPv6的地址
    AF_UNIX 本地协议,使用在Unix和Linux系统上,它很少使用,一般都是当客户端和服务器在同一台机器上的时候使用
    表二:Socket类型
    名字/常量     描述
    SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
    SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
    SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
    SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
    SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包顺序
    表三:公共协议
    名字/常量     描述
    ICMP 互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息
    UDP      用户数据报文协议,它是一个无连接,不可靠的传输协议
    TCP 传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数据包。
    现在你知道了产生一个socket的三个元素,那么我们就在php中使用socket_create()函数来产生一个socket。这个socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型,如果没有成功则返回false。
    Resourece socket_create(int protocol, int socketType, int commonProtocol);
    现在你产生一个socket,然后呢?php提供了几个操纵socket的函数。你能够绑定socket到一个IP,监听一个socket的通信,接受一个socket;现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。
    <?php
    $commonProtocol = getprotobyname(“tcp”);//使用公共协议名字来获取一个协议类型
    $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);//产生一个socket并且返回一个socket资源的实例
    socket_bind($socket, ‘localhost’, 1337);//绑定socket到本地计算机
    socket_listen($socket);//监听所有进来的socket连接
    // More socket functionality to come
    ?>
    上面这个例子产生一个你自己的服务器端。例子第一行,
    $commonProtocol = getprotobyname(“tcp”);
    使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议,如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname()函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在socket_create()函数中。
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后,你就必须把socket绑定到一个IP地址和某一个端口上。
    socket_bind($socket, ‘localhost’, 1337);
    在这里你绑定socket到本地计算机(127.0.0.1)和绑定socket到你的1337端口。然后你就需要监听所有进来的socket连接。
    socket_listen($socket);
    在第四行以后,你就需要了解所有的socket函数和他们的使用。
    表四: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中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释:
    extension=php_sockets.dll
    如果你无法去掉注释,那么请使用下面的代码来加载扩展库:
    <?php
    if(!extension_loaded(‘sockets’)) {
    if(strtoupper(substr(PHP_OS, 3)) == “WIN”) {
    dl(‘php_sockets.dll’);
    }else{
    dl(‘sockets.so’);
    }
    }
    ?>
    如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。你通过查看phpinfo信息了解socket是否打开。
    查看phpinfo()关于socket的信息
    ◆ 产生一个服务器
    现在我们把第一个例子进行完善。你需要监听一个指定的socket并且处理用户的连接。
    <?php
    $commonProtocol = getprotobyname("tcp");
    $socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
    socket_bind($socket, 'localhost', 1337);
    socket_listen($socket);
    // Accept any incoming connections to the server
    $connection = socket_accept($socket);
    if($connection){
    socket_write($connection, "You have connected to the socket... ");
    }
    ?>
    你应该使用你的命令提示符来运行这个例子。理由是因为这里将产生一个服务器,而不是一个Web页面。如果你尝试使用Web浏览器来运行这个脚本,那么很有可能它会超过30秒的限时。你可以使用下面的代码来设置一个无限的运行时间,但是还是建议使用命令提示符来运行。
    set_time_limit(0);
    在你的命令提示符中对这个脚本进行简单测试:
    Php.exe example01_server.php
    如果你没有在系统的环境变量中设置php解释器的路径,那么你将需要给php.exe指定详细的路径。当你运行这个服务器端的时候,你能够通过远程登陆(telnet)的方式连接到端口1337来测试这个服务器。

    原文:http://www.php100.com/html/webkaifa/PHP/PHP/2008/1218/969.html

  • 相关阅读:
    Seial port API and tool
    Simple HTTPD
    VC与Cygwin的结合
    zlib
    嵌入式开发系统编程文件格式解析
    ZB4O
    Wireshark基本介绍和学习TCP三次握手
    freeware
    Console2 A Better Windows Command Prompt
    iniparser
  • 原文地址:https://www.cnblogs.com/zsmynl/p/3540037.html
Copyright © 2020-2023  润新知