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
48)地址已在使用:AH00072:make_sock:无法绑定到地址[::]:80
PHP socket_bind 错误(socket地址只有一种用法)