socket_bind() 无法绑定地址

Posted

技术标签:

【中文标题】socket_bind() 无法绑定地址【英文标题】:socket_bind() unable to bind address 【发布时间】:2013-02-23 14:20:55 【问题描述】:

我正在尝试为我正在处理的一个小项目创建一个 Web 套接字服务器。

我已经设置了服务器(位于家里)并转发了 80 和 22 端口。我阅读了本教程:here

每当我 ssh 进入我的服务器以运行“startDarmon.php”时,我都会收到以下错误:

PHP Warning:  socket_bind(): unable to bind address [98]: Address already in use in  
/var/www/server/socket.class.php on line 48
2013-02-23 14:15:38 System: Socket bound to localhost:8000.
2013-02-23 14:15:38 System: Start listening on Socket

我认为这是阻止我的客户端连接到服务器的原因。所以在 startDarmon.php 文件中我有:

$WebSocket = new socketWebSocket('MY_IP_NOT_LAN_IP',8000);

在我的客户端文件中,我有:

var host = "ws://MY_IP_NOT_LAN:8000/server/startDaemon.php";

有人对为什么这不允许我建立连接有任何建议吗?

【问题讨论】:

据我所知你不需要这个server/startDaemon.php @Dharman 你是什么意思?服务器将如何启动?因为在客户端,var socket = new WebSocket(host) 还是需要主机] ws://MY_IP_NOT_LAN:8000 这足以获得连接。但是,这并不能解决您的问题,它基于服务器端 尝试在不同的端口上运行它(你需要在你的路由器上做端口转发) @Dharman 我在另一个端口上运行了它,现在它可以工作了。 "Socket bound to localhost:3132", "开始监听 Socket。"但是,当我进入我的客户端时,它不想连接..只是挂起..但我还没有将端口 3132 转发到我的服务器(LAN IP),所以这是个好主意吗? 【参考方案1】:

我猜问题出在 Linux 服务器上。

在根目录下运行netstat -a -p -n 命令(例如使用sudo)以了解哪个进程正在使用该端口。然后也许做一个setsockopt(2) 和SO_REUSEADDR (更多信息请参见socket(7))。

TCP 协议有一些以分钟为单位的特定延迟(例如,keepalive 等...)。参见例如tcp(7)

我确实建议阅读一本关于 Linux 系统编程的好书,例如 Advanced Linux Programming,也许还有一些关于网络编程的资料。

【讨论】:

【参考方案2】:

您可以使用以下设置重复使用地址:

if ( ! socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) 
 
    echo socket_strerror(socket_last_error($sock)); 
    exit; 

【讨论】:

【参考方案3】:

另一个应用程序已在使用您尝试使用的端口。您可以运行

lsof -i:port_no

使端口空闲。

【讨论】:

以上是关于socket_bind() 无法绑定地址的主要内容,如果未能解决你的问题,请参考以下文章

Apache 错误:地址已在使用中:make_sock:无法绑定到地址 [::]:443

PHP:TCP 套接字,“无法绑定地址”

48)地址已在使用:AH00072:make_sock:无法绑定到地址[::]:80

PHP socket_bind 错误(socket地址只有一种用法)

Docker:(13)权限被拒绝:AH00072:make_sock:无法绑定到地址 0.0.0.0:80

web-socket php中的问题