Странное поведение сокетов (один компьютер - мой ноутбук - примет соединение с моим сервером, другой - мой компьютер - не будет)

0

Я написал 2 программы на Python 2.7. Один создает сокет хоста, а другой - сокет клиента. Затем они пытаются подключиться. У меня была хост-программа на моем ПК, и я поместил клиентскую программу на телефон, который был подключен к WIFI в той же сети, что и мой ПК. Я установил клиентскую программу (на моем телефоне, которая находится в моей локальной сети) для подключения к локальному IP-адресу моего ПК. Я проверил ошибки в своем коде и обнаружил, что он безупречен. Однако когда я попытался запустить его, я получил очень странное поведение взамен:

  1. Порт правильный. Имя хоста правильное. Я пытаюсь подключиться. Ничего не произошло. Соединение не установлено.
  2. Я перезагружаю свой компьютер.
  3. Я попробую это снова. Тот же результат.
  4. Я отключаю как локальный, так и публичный брандмауэр.
  5. Теперь я что-то получаю, но только на моем клиентском устройстве: [Errno 111] Соединение отказано.
  6. Я снова включаю свои брандмауэры.
  7. Тот же результат, что и в 1. (нет связи)
  8. Я запускаю программу хоста на своем ноутбуке. Я пытаюсь подключиться. Оно работает!
  9. Я перезагружаю роутер и снова запускаю свою хост-программу на ПК. Тот же результат, что и в 1.
  10. Теперь я также запускаю клиентскую программу на своем ПК, подключая ее к «localhost». Оно работает.
  11. Я делаю то же, что и в 10. Настройка клиентской программы для повторного подключения к локальному IP-адресу моего ПК. Ошибка:

    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        s.connect(cn)
      File "C:\Python27\lib\socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
    

В 6. Я пришел к выводу, что проблема связана с ПК и что мои программы работают нормально.

Некоторые интелы:

  • Windows 7 на ПК и ноутбуке.
  • Я использую Python 2.7.
  • Ноутбук и смартфон подключены к сети через WIFI, ПК через кабель.
  • Я пробовал разные порты, чтобы убедиться, что они не были проблемой.

вероятно не так актуально, но вот код для хоста и клиента http://pastebin.com/raw/wswMi5SV

Что здесь происходит?

Cosinux
источник
1
Это может быть или не быть ваш код, но ваше утверждение «Я проверил ошибки в своем коде и обнаружил, что оно безупречно» & lt; - утверждение бессмысленное. Вы никогда не знаете, действительно ли ваш код безупречен ... В нем могут отсутствовать определенные недостатки ... но говорить, что он безупречен, - это чепуха. Возможно, какой-то код имеет недостаток безопасности из-за платформы, поэтому вы не можете сказать, что он безупречен. Можно сказать, что нет недостатка, который вы можете определить. И вы решили не делиться кодом, потому что вы думаете, что он безупречен. Во всяком случае, ваш вопрос вроде границы, так что вы являетесь суперпользователем. Возможно, вам придется больше устранять неполадки.
barlop
Таким образом, ваша программа при запуске на определенном компьютере в первый раз принимает соединение и во второй раз не работает. В то время как при работе на других компьютерах всегда принимает соединение?
barlop
вы можете попробовать cygwin и nc -l -p 1234 или nc -l 1234 (в зависимости от того, какая команда nc предназначена для получения прослушивающего сервера), и попробовать подключиться к нему, чтобы увидеть, имеет ли он ту же проблему, что и ваша программа. (возможно всегда делайте -l -p, чтобы быть в безопасности,)
barlop
Понимаете, я имел в виду, что под безупречной работой он работает на другом компьютере. Кроме того, как сообщения в Интернете говорят, что это должно быть сделано. Если вы хотите увидеть код, я могу показать его вам. Это действительно просто, несколько строк. Чтобы ответить на второй комментарий: он не работает на моем ПК, но работает на моем ноутбуке. Странное поведение состоит в том, что если я включаю брандмауэр, ничего не происходит (хост все еще слушает, а клиент все еще пытается подключиться), а если отключить его, соединение отказывается. Что касается третьего комментария, я попробую это сейчас и сообщу вам о результатах.
Cosinux
Я хотел бы увидеть код - мне любопытно. Кроме того, проверьте результаты netstat (netstat -aon), .. посмотрите IP, который он прослушивает, это 127.0.0.1 это, например, 192.168.x.y (разрешить подключение к локальной сети), это 0.0.0.0 (разрешить подключение любому). Вы также можете попробовать wireshark (анализатор пакетов), хотя это может не пригодиться для тестирования соединения с 127.0.0.1, но вы можете подключить другой компьютер к компьютеру и запустить wireshark на компьютере и посмотреть, что происходит.
barlop

Ответы:

0

Вы в настоящее время связаны с localhost который является только внутренним интерфейсом. Программы, которые связаны с 127.0.0.1 не доступны по сети, это по замыслу. Это можно увидеть, когда вы получаете «отказано в соединении», когда вы соединяетесь с выключенным межсетевым экраном. Когда вы отправляете TCP SYN на закрытый порт ОС отправит обратно TCP RST вернуться к клиенту, чтобы указать, что порт закрыт.

Когда вы говорите, привязка к 0.0.0.0 не работает, вы можете быть более конкретным? Как это терпит неудачу точно?

Одна вещь, которую вы можете попробовать это:

server.bind(("", port))

Если я правильно помню, это попытается привязать все доступные интерфейсы. Я не уверен, что вы пробовали ранее, но это должно решить вашу проблему.

prateek61
источник
Спасибо за ваши усилия. Но, похоже, у меня сложная проблема с компьютером. Я провел много испытаний и обнаружил, что есть проблема с моим ПК. Проблема, вероятно, где-то в настройках моего ПК, так как я пробовал много разных подходов к тому, чтобы заставить мои программы работать, и я не решил проблему, хотя я исключил возможность чего-либо еще, являющегося проблемой. Я обнаружил, что соединение устанавливается, если я размещаю серверный сокет на своем телефоне. Проблема возникает только с моим ПК. Программа отлично работает на моем ноутбуке.
Cosinux
Я считаю, что привязка к различным интерфейсам не будет работать. Я уже пробовал 0.0.0.0, 127.0.0.1 и 192.168.1.4.
Cosinux
Любая попытка приведет к В соединении отказано ошибка. Я также попытался подключить телефон к компьютеру через сотовую сеть, настроив переадресацию портов на мой компьютер, но это не сработало.
Cosinux
Можете ли вы предоставить вывод netstat на ноутбук и ПК с запущенной программой?
prateek61