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


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

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


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))

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


Спасибо за ваши усилия. Но, похоже, у меня сложная проблема с компьютером. Я провел много испытаний и обнаружил, что есть проблема с моим ПК. Проблема, вероятно, где-то в настройках моего ПК, так как я пробовал много разных подходов к тому, чтобы заставить мои программы работать, и я не решил проблему, хотя я исключил возможность чего-либо еще, являющегося проблемой. Я обнаружил, что соединение устанавливается, если я размещаю серверный сокет на своем телефоне. Проблема возникает только с моим ПК. Программа отлично работает на моем ноутбуке.
— Cosinux

Я считаю, что привязка к различным интерфейсам не будет работать. Я уже пробовал 0.0.0.0, 127.0.0.1 и 192.168.1.4.
— Cosinux

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

Можете ли вы предоставить вывод netstat на ноутбук и ПК с запущенной программой?
— prateek61
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.