Replies (23)

  • @maxlapshin, почему только?
  • @Zert, а где ты ещё на connect получаешь EADDRINUSE? Не на bind, а на conect
  • @maxlapshin, ой, точно. Как они этого добились?
  • @Zert, судя по коду, делают ручной DNS, а для этого делают bind к какому-то фиксированному порту, что как бы немного предсказуемо
  • @maxlapshin, А как связан ручной DNS с портом клиентского сокета?
  • @Totktonada, не знаю. У меня исключение валится со стектрейсом из DNS, хотя адрес я везде в тестах пишу 127.0.0.1 Может это какой ебучий коллбек
  • @maxlapshin, Из connect(2)
    EADDRINUSE
    Local address is already in use.

    Возможно просто не хватило локальных динамически-выделяемых портов
  • @maxlapshin, Я бы предположил, что bind делается для того, чтобы привязаться к конкретному интерфейсу, но указывается зачем-то еще и порт. Впрочем, я со спецификой node.js не знаком вообще.
  • @Arepo, я понимаю, что MacOS — это то ещё днище, но ненастолько же =)
  • @maxlapshin, а причём тут макос?
  • @Arepo, я под маком разрабатываю, а здесь всё что касается юникса в очень убогом состоянии. Например, больше 1024 файлов открыть невозможно никак
  • @maxlapshin, конеретно EADDRINUSE для connect() прописан и в посиксе
    [EADDRINUSE]
    Attempt to establish a connection that uses addresses that are already in use.
    pubs.opengroup.org
  • @Arepo, мне кажется, что здесь это скорее какая-то копипаста. Ты знаешь, когда реально может возникнуть EADDRINUSE при коннекте? Что за условия?
  • @maxlapshin, ну, объяснения тут нет. Могу предположить, что такое может возникнуть если действительно не удалось выделить исходящий порт из пула. Ну или более приземлённые варианты: мы уже делали connect() на этот дескриптор чуть раньше
  • @Arepo, в тикетах у народа было подозрение на эфемерные порты, но мне до этого лимита далеко. Поэтому я предполагаю где-то наивный бинд к порту
  • @maxlapshin, очень сомнительно, в ноде же всё асинхронно, если бы они биндили что-то на один порт, то все постоянно бы получали подобные ошибки. До лимита может быть и не так дплеко, если учитывать time_wait, попробуйте SO_REUSEADDR
  • @Arepo, у меня валится в
    http.get({
    host : "127.0.0.1",
    port : 5670,
    auth : "admin:admin0",
    path : path
    }, function(res) {
  • @Arepo, Кстати, да. Мне первым делом в голову SO_REUSEADDR пришел, но почему-то подумалось, что ошибка была бы другая.
  • @maxlapshin, если повторяется и нода свежая — постите багрепорт вместе со стектрейсом. Я довольно активно использую ноду в разных варианты работы с сетью: и в качестве сервера с тысячами соединений, так и в виде краулеров с тучей коннектов — таких проблем не было.
    Насколько я помню, в ноде SO_REUSEADDR ставился по умолчанию с самых первых версий и точно ставился в 0.10 и 0.8, так что подозрительно вдвойне
  • @Arepo, это было на 0.8.8 Я обновил до 0.10, теперь посмотрю что было. Баг с 0.8 известен.
  • @Zert, fixed: долбились
  • @ass-kovalev, exactly
  • @maxlapshin, можно сначала сделать bind, а потом connect.
    но это для тонких извращенцев, которым надо connect с определенного привелигированного порта.