zoukankan      html  css  js  c++  java
  • php socket的一些问题

    在php手册看到了php socket的例子 但有些socket_read的循环判断有一些问题 造成进程的阻塞

    实例是用phpsocket实现 客户端连接到socket server 发送文本 接受文本 断开

    server端

      

    <?php
    
    set_time_limit(0);
    
    $host = "127.0.0.1";
    $port = 12388;
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
        or die("socket_create() failed:". socket_strerror(socket_last_error()));
    
    //设置阻塞模式
    socket_set_block($socket)
        or die("socket_set_block() failed:". socket_strerror(socket_last_error()));
    
    // 绑定到端口
    socket_bind($socket, $host, $port)
        or die("socket_bind() failed:" . socket_strerror(socket_last_error()));
    
    // 开始监听
    socket_listen($socket, 4)
        or die("socket_listen() failed:" . socket_strerror(socket_last_error()));
    
    echo "Binding the socket on $host:$port ... 
    ";
    
    while (true) {
        // 接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
        if (($msgsock = socket_accept($socket)) < 0) {
            echo "socket_accept() failed:" . socket_strerror(socket_last_error());
        } else {
            // 读数据
            $out = '';
            while ($buf = socket_read($msgsock, 1024)) {  #注意 主要是这里 这里用的是默认的 type 这里要读取1024字节 如果客户端没有发送这么多数据就会造成子连接的阻塞 导致程序无法继续向下执行 所以要执行一些判断
                if (!$buf) {
                    break;
                }
                $out .= $buf;
                if (trim($buf) == "Shut") {
                    break;
                }
                if (substr($buf, -1) == "
    ") { #这里注意 “
    ”换行符是一个字节长度
                    break;
                }
            }
    
            // 写数据
            $in = "数据是 $out";
            echo $in;
            if (!socket_write($msgsock, $in, strlen($in))) echo "socket_write() failed:" . socket_strerror($socket);
        }
        // 结束通信
        socket_close($msgsock);
    }
    socket_close($socket);

    客户端

    <?php
    
    set_time_limit(0);
    $host = "127.0.0.1";
    $port = 12388;
    
    // 创建一个tcp流
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
        or die("socket_create() failed:" . socket_strerror(socket_last_error()));
    
    echo "try to connect to $host:$port...
    ";
    $result = socket_connect($socket, $host, $port)
        or die("socket_connect() failed:" . socket_strerror(socket_last_error()));
    
    $in = "abc 
    ";
    if (!socket_write($socket, $in, strlen($in))) {
        echo "socket_write() failed:" . socket_strerror($socket);
    } else {
        echo "发送成功!
    ";
    }
    
    $out = '';
    while ($buf = socket_read($socket, 1024)) { #这里因为服务端socket子进程已经断开了此次连接所以不会阻塞
        $out .= $buf;
    }
    echo "接受内容为:$out 
    ";
    socket_close($socket);
  • 相关阅读:
    第三天 moyax
    mkfs.ext3 option
    write file to stroage trigger kernel warning
    download fomat install rootfs script
    custom usb-seriel udev relus for compatible usb-seriel devices using kermit
    Wifi Troughput Test using iperf
    learning uboot switch to standby system using button
    learning uboot support web http function in qca4531 cpu
    learngin uboot design parameter recovery mechanism
    learning uboot auto switch to stanbdy system in qca4531 cpu
  • 原文地址:https://www.cnblogs.com/a-flydog/p/5794893.html
Copyright © 2011-2022 走看看