项目中经常用到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),需要的朋友可以参考下
从几个方面讨论tomcat报错Service Temporarily Unavailable tomcat解决方式
用rmmod卸载模块的时候会弹出错误,如下 – rmmod: can't change directory to '/lib/modules': No such file or directory
TID_20230626_PCID_1_AEBL_Temporarily_ValidTill_2023-07-31_SN_000894MGE0F12B2F2C363E2E1C1D1A1B.act
最近网站刷新后经常出现503 Service Temporarily Unavailable错误,有时有可以,联想到最近在nginx.conf里做了单ip访问次数限制,(limit_req_zone $binary_remote_addr zone=allips:20m rate=20r/s;) 把这个数量放大...
一般来说,出现Service Temporarily Unavailable错误多半是因为网站访问量大,造成了流量超限或者并发数大引起的资源超限出现的错误
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
一个利用OpenCV保存摄像数据失败实践(加入线程) 出现的错误不知道如何解决 希望有能人帮忙解析一下错误在哪里。
研究目的是加快井筒施工速度,提高混凝土施工质量;根据高性能混凝土配制原则、配制途径及配合比试验,配制出符合冻结井施工的高性能混凝土;通过对井筒井壁质量进行观测,井壁质量良好,掘进速度创造出新水平,经济效益...
/usr/bin/sh: fork: Resource temporarily unavailable 装了WIN10 64位 发现AVR STDIO+WINAVR编译时出现了上述错误,这是WINAVR与64位系统不兼容的缘故 毕竟WINAVR是老物了 不过还是好用 很多朋友用习惯了。 复制到...
每个网站都对应了一个应用程序池(IIS服务器是如此),当然他们可能是相同的应用程序池,也能是不同的,查看出现503错误网站对应的程序池是否开启。 如果没有关闭应用程序池,那就要看看是否请求到达时应用程序池...
OS error code 11: Resource temporarily unavailable 操作系统错误代码11:资源暂时不可用 OS error code 12: Cannot allocate memory 操作系统错误代码12:无法分配内存 OS error code 13: Permission denied 操作...
主要为大家详细介绍了解决Python出现'_warn_unsafe_extraction'问题的方法,感兴趣的小伙伴们可以参考一下
// [hawkview_err]xxxxcan't open /dev/video0(Resource temporarily unavailable) // 2016/10/25 14:33 wenyuanbo cloase suspend. // register_early_suspend(&dev->early_suspend); vfe_print("register_...
错误提示:Service Temporarily Unavailable The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.解决方法 mod_bw-0.8.gz mod_...
// [hawkview_err]xxxxcan't open /dev/video0(Resource temporarily unavailable) // 2016/10/25 14:33 wenyuanbo cloase suspend. // register_early_suspend(&dev->early_suspend); vfe_print("register_...