项目中经常用到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命令的源码,busybox自带的rmmod运行的时候总是去找一个临时文件夹,如果系统不存在则会卸载失败,此程序不检测文件夹,卸载驱动的时候一定会成功
标题中的“nginx connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)”是一个常见的错误信息,这通常发生在Nginx尝试与PHP-FPM(FastCGI进程管理器)通信时,但遇到了资源暂时...
Tomcat 报错 Service Temporarily Unavailable 解决方式 Service Temporarily Unavailableerror 是 Tomcat 中常见的一种错误,通常是服务器维护或容量问题引起的。解决这个错误的方法通常是重启服务器,但是有时候...
- **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
总的来说,解决"Service Temporarily Unavailable"的503错误,需要结合服务器的实际情况,从硬件、软件、网络等多个层面进行分析和优化。同时,定期进行维护和监控,确保服务器的稳定运行,能够为用户提供更好的访问...
最近网站刷新后经常出现503 Service Temporarily Unavailable错误,有时有可以,联想到最近在nginx.conf里做了单ip访问次数限制,(limit_req_zone $binary_remote_addr zone=allips:20m rate=20r/s;) 把这个数量放大...
用rmmod卸载模块的时候会弹出错误,如下 – rmmod: can't change directory to '/lib/modules': No such file or directory
Socket Error 10035 - Resource temporarily unavailable Socket Error 10035是指资源暂时不可用,这种错误通常是由于系统资源不足或网络连接中断所致。解决方法是等待资源恢复或重新连接Socket。 Socket Error ...
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
研究目的是加快井筒施工速度,提高混凝土施工质量;根据高性能混凝土配制原则、配制途径及配合比试验,配制出符合冻结井施工的高性能混凝土;通过对井筒井壁质量进行观测,井壁质量良好,掘进速度创造出新水平,经济效益...
/usr/bin/sh: fork: Resource temporarily unavailable 装了WIN10 64位 发现AVR STDIO+WINAVR编译时出现了上述错误,这是WINAVR与64位系统不兼容的缘故 毕竟WINAVR是老物了 不过还是好用 很多朋友用习惯了。 复制到...
每个网站都对应了一个应用程序池(IIS服务器是如此),当然他们可能是相同的应用程序池,也能是不同的,查看出现503错误网站对应的程序池是否开启。 如果没有关闭应用程序池,那就要看看是否请求到达时应用程序池...
在Python编程过程中,有时会遇到一个特定的错误:“AttributeError: ResourceManager instance has no attribute '_warn_unsafe_extraction'”。这个问题通常与Python的setuptools库及其与特定模块(如pymongo)的...
当只有一个Socket时,使用`sci_sock_select`接收数据与直接使用`sci_sock_recv`的效果相同。 #### 五、常见接口调用示例及注意事项 - **sci_sock_select**:用于监听多个Socket的读写事件,提高程序的效率。 - **...
例如,`errno 11`对应的错误描述是"Resource temporarily unavailable"。 在上面的代码示例中,展示了如何遍历从0到`NUM`(假设是150)的所有整数,调用`strerror`函数获取每个错误代码的描述并打印出来。这可以...
但是,在使用dnw烧写时,经常出现问题,例如“usb_bulk_write failed: Resource temporarily unavailable”等错误信息。 在Linux下使用dnw烧写时,需要加载驱动程序,以便dnw工具可以正确地将固件烧写到目标设备中...
OS error code 11: Resource temporarily unavailable 操作系统错误代码11:资源暂时不可用 OS error code 12: Cannot allocate memory 操作系统错误代码12:无法分配内存 OS error code 13: Permission denied 操作...