You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务器重启后socket_bind()绑定失败求助:错误码99无法分配地址

服务器重启后socket_bind()错误排查求助

服务器重启后遇到socket_bind()错误,尝试绑定默认地址0.0.0.0和服务器IP地址均无效,恳请提供排查思路与解决方案。

错误信息

PHP Warning: socket_bind(): unable to bind address [99]: Cannot assign requested address in /var/www/vhosts/domainname.com/httpdocs/module/Admin/src/Controller/DeviceController.php on line 157

相关代码

ob_implicit_flush();
$reqObj = $this->getRequest();
$ethAddr = $reqObj->getParam('ethaddr', 'xx.xx.xxx.xxx'); // default to 0.0.0.0
$port = $reqObj->getParam('port', 222); //default to 222

if (($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP)) === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
}

if (socket_bind($sock, $ethAddr, $port) === false) {
    echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
}

堆栈跟踪

PHP Warning: socket_bind(): unable to bind address [99]: Cannot assign requested address in /module/Admin/src/Controller/DeviceController.php on line 157
Exception writing to Cassandra: Exception: Alert message does not exist for oozt" in /library/AlertMsg/AlertMsg.php:75
Stack trace:
#0 /library/AlertMsg/AlertMsg.php(107): AlertMsg\AlertMsg->getAlertMsg()
#1 /library/Device/DeviceCommunicationDriver.php(275): AlertMsg\AlertMsg->getSmsAlertMsg()
#2 /library/Device/DeviceCommunicationDriver.php(136): Device\DeviceCommunicationDriver->changeStatusMsg()
#3 /library/Device/DeviceCommunicationDriver.php(64): Device\DeviceCommunicationDriver->sendMsg()
#4 /module/Admin/src/Controller/DeviceController.php(190): Device\DeviceCommunicationDriver->processDeviceData()
#5 /vendor/laminas/laminas-mvc/src/Controller/AbstractActionController.php(71): Admin\Controller\DeviceController->readUdpDataAction()
#6 /module/Admin/src/Controller/AppController.php(42): Laminas\Mvc\Controller\AbstractActionController->onDispatch()
#7 /vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Admin\Controller\AppController->onDispatch()
#8 /vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners()
#9 /vendor/laminas/laminas-mvc/src/Controller/AbstractController.php(97): Laminas\EventManager\EventManager->triggerEventUntil()
#10 /vendor/laminas/laminas-mvc/src/DispatchListener.php(132): Laminas\Mvc\Controller\AbstractController->dispatch()
#11 /vendor/laminas/laminas-eventmanager/src/EventManager.php(319): Laminas\Mvc\DispatchListener->onDispatch()
#12 /vendor/laminas/laminas-eventmanager/src/EventManager.php(179): Laminas\EventManager\EventManager->triggerListeners()
#13 /vendor/laminas/laminas-mvc/src/Application.php(325): Laminas\EventManager\EventManager->triggerEventUntil()
#14 /public/index.php(42): Laminas\Mvc\Application->run()
#15 {main}
PHP Warning: socket_bind(): unable to bind address [99]: Cannot assign requested address in /module/Admin/src/Controller/DeviceController.php on line 157
PHP Warning: socket_bind(): unable to bind address [99]: Cannot assign requested address in /module/Admin/src/Controller/DeviceController.php on line 157
PHP Warning: socket_bind(): unable to bind address [99]: Cannot assign requested address in /module/Admin/src/Controller/DeviceController.php on line 157


排查思路与解决方案

  • 修正代码默认值错误:代码注释标注默认地址为0.0.0.0,但实际硬编码为xx.xx.xxx.xxx,先将默认值改为0.0.0.0,排除硬编码错误导致绑定无效IP的问题。
  • 验证服务器网络配置:
    • 执行ip addr show(Linux)或ipconfig(Windows),确认服务器网卡实际拥有的IP地址,确保绑定的地址是本机存在的有效IP。
    • 检查防火墙/安全组规则是否阻止UDP端口222的绑定,可临时关闭防火墙测试是否恢复正常。
  • 检查端口占用情况:
    • 用netstat -anu | grep 222(Linux)或netstat -ano | findstr :222(Windows)查看端口222是否被其他进程占用,若占用则更换端口或停止占用进程。
  • 确认权限问题:
    • 运行PHP的用户(如www-data、apache)是否有绑定端口的权限,端口号小于1024时需要root权限,可切换到1024以上端口,或给PHP进程添加对应权限。
  • 调整系统参数限制:
    • 执行ulimit -n查看文件描述符限制,若过低则修改/etc/security/limits.conf中的nofile参数提升限制。
    • 临时关闭Linux内核的rp_filter参数(echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter),测试是否是IP地址过滤导致的绑定失败。
  • 优化代码逻辑:
    • 添加IP有效性校验,绑定前用filter_var($ethAddr, FILTER_VALIDATE_IP)验证输入IP是否合法,避免无效地址传入。
    • 绑定失败后及时关闭套接字资源,避免泄漏:
      if (socket_bind($sock, $ethAddr, $port) === false) {
          echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n";
          socket_close($sock);
          exit;
      }
      

内容的提问来源于stack exchange,提问作者TGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:25:59