`
OrangeHolic
  • 浏览: 260724 次
  • 来自: 北京
社区版块
存档分类
最新评论

UDP socket_read接收数据导致错误Resource temporarily unavailable

    博客分类:
  • PHP
 
阅读更多
项目中经常用到PHP用UDP调用C++服务,我们这边的PHP 请求方法封装如下,一直没有问题出现,今天接入新的服务出现了问题
  
   public static  function request($reqBuffer,$host,$port)
    {

        $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        //设置发送数据超时时间
        socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 500000));
        //设置接收数据超时时间
        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 0, "usec" => 500000));
        if (socket_connect($socket, $host, $port) === false) {
            socket_close($socket);
            throw new Exception('connect server error'.socket_strerror(socket_last_error()), 100);
        }
        if (socket_write($socket, $reqBuffer, strlen($reqBuffer)) === false) {
            socket_close($socket);
            throw new Exception('send request error'.socket_strerror(socket_last_error()), 100);
        }
        if (($rspBuffer = socket_read($socket, 65536)) === false) {
            socket_close($socket);
            throw new Exception('receive response error'.socket_strerror(socket_last_error()), 100);
        }
        socket_close($socket);
        return $rspBuffer;
    }


问题如下:
socket_read  一直返回false  错误信息:Resource temporarily unavailable,而用tcpdump抓包显示C++服务已经回报,抓包数据如下:



ICMP回报表示C++服务 230 发送的UDP包没有程序socket_read没有接收   

这就是问题tcpdump显示数据已经发送  但是socket_read显示Resource temporarily unavailable


后来测试正常的请求才发现 ,服务器发送数据的端口从11188 变成成了11177 ,下面是可以收到的抓包




后来发现socket_read不能接收端口变化的数据,适合与TCP这种保持连接,整个过程端口不变化的socket,而socket_recvfrom可以处理这种情况

然后函数封装换成了下面的方式:
    public static functionrequest($reqBuffer, $host, $port)
    {

        $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        //设置发送数据超时时间
        socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 0, "usec" => 500000));
        //设置接收数据超时时间
        socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 0, "usec" => 500000));

        if (socket_sendto($socket,$reqBuffer, strlen($reqBuffer),0,$host,$port) === false) {
            socket_close($socket);
            throw new Exception('send request errorr' . socket_strerror(socket_last_error()), 100);
        }
        $from = "";
        $port = 0;
        if (socket_recvfrom($socket, $rspBuffer, 65536, 0, $from, $port) === false) {
            socket_close($socket);
            throw new Exception('receive response error' . socket_strerror(socket_last_error()), 100);
        }
        socket_close($socket);
        return $rspBuffer;
    }

现在OK了  不在会用ICMP回报未接收到数据



  • 大小: 14.2 KB
  • 大小: 11.1 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

    rmmod的源码怎么这么麻烦

    rmmod命令的源码,busybox自带的rmmod运行的时候总是去找一个临时文件夹,如果系统不存在则会卸载失败,此程序不检测文件夹,卸载驱动的时候一定会成功

    nginx connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)

    标题中的“nginx connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)”是一个常见的错误信息,这通常发生在Nginx尝试与PHP-FPM(FastCGI进程管理器)通信时,但遇到了资源暂时...

    tomcat报错Service Temporarily Unavailable tomcat解决方式

    Tomcat 报错 Service Temporarily Unavailable 解决方式 Service Temporarily Unavailableerror 是 Tomcat 中常见的一种错误,通常是服务器维护或容量问题引起的。解决这个错误的方法通常是重启服务器,但是有时候...

    socket错误代码对应表

    - **Socket error #10035 - Resource temporarily unavailable**:资源暂时不可用。 - **Socket error #10036 - Operation now in progress**:操作正在进行中。 - **Socket error #10037 - Operation already in ...

    TID_20230626_PCID_1_AEBL_Temporarily_ValidTill_2023-07-31_SN_000894MGE0F12B2F2C363E2E1C1D1A1B.act

    TID_20230626_PCID_1_AEBL_Temporarily_ValidTill_2023-07-31_SN_000894MGE0F12B2F2C363E2E1C1D1A1B.act

    Service Temporarily Unavailable的503错误是怎么回事?

    总的来说,解决"Service Temporarily Unavailable"的503错误,需要结合服务器的实际情况,从硬件、软件、网络等多个层面进行分析和优化。同时,定期进行维护和监控,确保服务器的稳定运行,能够为用户提供更好的访问...

    解决nginx 503 Service Temporarily Unavailable方法示例

    最近网站刷新后经常出现503 Service Temporarily Unavailable错误,有时有可以,联想到最近在nginx.conf里做了单ip访问次数限制,(limit_req_zone $binary_remote_addr zone=allips:20m rate=20r/s;) 把这个数量放大...

    无法卸载模块的解决办法.pdf

    用rmmod卸载模块的时候会弹出错误,如下 – rmmod: can't change directory to '/lib/modules': No such file or directory

    socket常见错误代码解析.pdf

    Socket Error 10035 - Resource temporarily unavailable Socket Error 10035是指资源暂时不可用,这种错误通常是由于系统资源不足或网络连接中断所致。解决方法是等待资源恢复或重新连接Socket。 Socket Error ...

    party:多次打开leveldb句柄

    OpenError: IO error: lock /home/substack/projects/level-party/example/data/LOCK: Resource temporarily unavailable at /home/substack/projects/level-party/node_modules/level/node_modules/level-packager

    冻结井井壁高性能混凝土配制及其施工工艺研究

    研究目的是加快井筒施工速度,提高混凝土施工质量;根据高性能混凝土配制原则、配制途径及配合比试验,配制出符合冻结井施工的高性能混凝土;通过对井筒井壁质量进行观测,井壁质量良好,掘进速度创造出新水平,经济效益...

    win10 64位,Winavr+AVR studio 编译问题解决方案

    /usr/bin/sh: fork: Resource temporarily unavailable 装了WIN10 64位 发现AVR STDIO+WINAVR编译时出现了上述错误,这是WINAVR与64位系统不兼容的缘故 毕竟WINAVR是老物了 不过还是好用 很多朋友用习惯了。 复制到...

    网站出现503(503 Service Temporarily UnavailableThe requested)服务暂时不可用的解决方法小结

    每个网站都对应了一个应用程序池(IIS服务器是如此),当然他们可能是相同的应用程序池,也能是不同的,查看出现503错误网站对应的程序池是否开启。 如果没有关闭应用程序池,那就要看看是否请求到达时应用程序池...

    解决Python出现_warn_unsafe_extraction问题的方法

    在Python编程过程中,有时会遇到一个特定的错误:“AttributeError: ResourceManager instance has no attribute '_warn_unsafe_extraction'”。这个问题通常与Python的setuptools库及其与特定模块(如pymongo)的...

    展讯平台socket使用讲解.doc

    当只有一个Socket时,使用`sci_sock_select`接收数据与直接使用`sci_sock_recv`的效果相同。 #### 五、常见接口调用示例及注意事项 - **sci_sock_select**:用于监听多个Socket的读写事件,提高程序的效率。 - **...

    EAAGAIN errno11

    例如,`errno 11`对应的错误描述是"Resource temporarily unavailable"。 在上面的代码示例中,展示了如何遍历从0到`NUM`(假设是150)的所有整数,调用`strerror`函数获取每个错误代码的描述并打印出来。这可以...

    linux下使用dnw烧写及其出现问题的解答

    但是,在使用dnw烧写时,经常出现问题,例如“usb_bulk_write failed: Resource temporarily unavailable”等错误信息。 在Linux下使用dnw烧写时,需要加载驱动程序,以便dnw工具可以正确地将固件烧写到目标设备中...

    Linux操作系统错误代码解释_中英文对照

    OS error code 11: Resource temporarily unavailable 操作系统错误代码11:资源暂时不可用 OS error code 12: Cannot allocate memory 操作系统错误代码12:无法分配内存 OS error code 13: Permission denied 操作...

Global site tag (gtag.js) - Google Analytics