2012-02-23 2 views
2

У меня есть сервер Windows, на котором запущены IIS и node.js с socket.io для приложения интерактивной доски, которое я разрабатываю. Я хочу, чтобы и веб-сайт IIS, и сервер node.js прослушивали порт 80, но были связаны с разными IP-адресами.привязка socket.io к определенному 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 при запуске модифицированного кода

+0

Хорошо, мой измененный код работает, если я установил порт на 8080. Я получаю ошибку EACCES при попытке использовать 80 – TylerEKnight

+0

порт 80 запрещен поскольку он принадлежит судоустройствам (пользователям root), вы можете заставить его использовать «sudo node app.js», но это не очень хорошая практика. – sfiore

ответ

0

Я понял!

Проблема заключается в том, что IIS и поведение пула сокетов. IIS автоматически резервирует порт 80 для всех IP-адресов (даже если они в настоящее время не привязаны к сайту). Что мне нужно было сделать, это использовать команду netsh, чтобы переопределить привязки по умолчанию и связать IP-адреса с помощью команды netsh.

Вот что я сделал. Это решение работает для IIS 7 в Windows Server 2008 R2.

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

В моем случае у меня есть только один активный сайт, обслуживаемый IIS, и только один IP-адрес связан с ним. Это освободило мой вторичный IP-адрес для прослушивания узла и порт 80.

7

я вижу, никто не ответил, так что я выложу это, не уверен, это поможет вам:

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

в основном просто переключает вызовы на прослушивание.

+0

Это ошибка разрешения, не так ли? Это работает, если вы запускаете его как sudo? Не то, чтобы это рекомендованное решение. – mindandmedia

+0

вот ссылка на аналогичный вопрос: http://stackoverflow.com/questions/9164915/node-js-eacces-error-when-listening-on-most-ports – mindandmedia

+0

Ну, я получаю EACCES, когда использую порт 80 с измененным методом, но я не получаю никакой ошибки при использовании порта 80 с первым методом (тот, который не привязывается к определенному IP). Это окно, и команда запускается как администратор. – TylerEKnight

Смежные вопросы