socket_bind()无法绑定地址。

4
我正在尝试为我正在开发的小项目创建一个Web Socket服务器。
我已经设置好了服务器(位于家里),并且端口转发了80和22。我阅读了这篇教程:这里 每当我通过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
@Dharman 您是什么意思?那服务器应该怎么启动呢?因为在客户端中,'var socket = new WebSocket(host)' 仍然需要一个host。 - Phorce
ws://MY_IP_NOT_LAN:8000 这个已经足够建立连接了。然而这并不能解决你的问题,这是服务器端的基础。 - Dharman
1
尝试在不同的端口上运行它(您需要在路由器上进行端口转发)。 - Dharman
@Dharman 我已经在另一个端口上运行它,现在它可以工作了。“Socket绑定到localhost:3132”,“开始监听Socket。”然而,当我进入我的客户端时,它不想连接.. 只是挂起。但我还没有将端口3132转发到我的服务器(局域网IP),所以这样做是一个好主意吗? - Phorce
3个回答

6
我猜问题出在Linux服务器上。 以root身份运行netstat -a -p -n命令,了解哪个进程正在使用该端口。然后,可能需要通过SO_REUSEADDR进行setsockopt(2)(有关更多信息,请参见socket(7))。 TCP协议有一些指定的延迟时间(例如keepalive等)。请参见tcp(7)。 我建议阅读一本好的Linux系统编程书籍,如Advanced Linux Programming,以及一些网络编程材料。

3
您可以使用以下设置重新使用地址:
if ( ! socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) 
{ 
    echo socket_strerror(socket_last_error($sock)); 
    exit; 
}

2

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

lsof -i:port_no

使端口空闲。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接