【问题标题】:socket.io binding to a specific ip addresssocket.io 绑定到特定的 ip 地址
【发布时间】:2012-03-14 05:28:19
【问题描述】:

我有一个运行 IIS 和带有 socket.io 的 node.js 的 Windows 服务器,用于我正在开发的交互式白板应用程序。我希望 IIS 网站和 node.js 服务器都侦听端口 80,但绑定到不同的 IP 地址。

据我所知,socket.io 无法指定 ip 地址。这个限制可以通过创建一个 http 服务器实例来克服。我是 socket.io 和 node.js 的新手,尝试这样做有点迷失。我将包含原始服务器代码(侦听特定端口)以及我在特定 IP 地址上实例化服务器的尝试。

原创

(function() {
  var io;
  io = require('socket.io').listen(80);
  io.sockets.on('connection', function(socket) {
    socket.on('drawClick', function(data) {
      socket.broadcast.emit('draw', {
        x: data.x,
        y: data.y,
        type: data.type
      });
    });
  });
}).call(this);

修改

(function() {
    var host = "10.70.254.76";
var port = 80;

var http = require("http").createServer();
var io = require("socket.io").listen(http);

http.listen(port, host);
io.sockets.on('connection', function(socket) {
    socket.on('drawClick', function(data) {
        socket.broadcast.emit('draw', {
            x: data.x,
            y: data.y,
            type: data.type
        });
    });
});
}).call(this);

我得到错误:启动修改后的代码时监听 EACCES

【问题讨论】:

  • 好的,如果我将端口设置为 8080,我的修改后的代码可以工作。尝试使用 80 时出现 EACCES 错误
  • 端口 80 被禁止,因为它属于 sudoers(root 用户),您可以使用“sudo node app.js”强制它,但不是一个好习惯。

标签: node.js socket.io


【解决方案1】:

我看到没有人回答,所以我会发布这个,不确定它是否会帮助你:

var io = require('socket.io');
var server = http.createServer();
server.listen(8080, 'localhost');
var socket = io.listen(server);

基本上只需切换通话即可收听。

【讨论】:

  • 这是权限错误,对吧?如果您将其作为 sudo 运行,它是否有效?这不是推荐的解决方案。
  • 这里有一个类似问题的链接:stackoverflow.com/questions/9164915/…
  • 好吧,当我将端口 80 与修改后的方法一起使用时,我得到了 EACCES,但是当我将端口 80 与第一种方法(未绑定到特定的方法)一起使用时,我没有收到任何错误知识产权)。这是一个 windows 框,命令正在以管理员身份运行。
  • 没关系,我发现这实际上是 IIS 行为方式的问题。我在上面添加了我的解决方案。
  • @ämbi:我们可以添加多个 IP 地址吗?我需要创建一个只能从一个 IP 地址访问的 Web 服务……我相信可以将其用作一个不错的解决方案?
【解决方案2】:

我明白了!

问题实际上在于 IIS 和它的套接字池行为。 IIS 自动为所有 IP 地址保留端口 80(即使它们当前未绑定到站点)。 我要做的是使用 netsh 命令覆盖默认绑定并通过 netsh 命令绑定 IP 地址。

这就是我所做的。此解决方案适用于 Windows Server 2008 R2 中的 IIS 7。

netsh http add iplisten ipaddress x.x.x.x
net stop http
net start http
net start w3svc

在我的情况下,我只有一个由 IIS 提供服务的活动网站,并且只有一个 IP 绑定到它。这释放了我的辅助 IP 地址,以便节点监听它和端口 80。

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2023-02-12
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    相关资源
    最近更新 更多