Comportamento estranho do soquete (um computador - meu laptop - aceita uma conexão com meu servidor, outro - meu PC - não)

0

Eu escrevi 2 programas em Python 2.7. Um cria um soquete de host enquanto o outro cria um soquete de cliente. Então eles tentam se conectar. Eu tinha meu programa host no meu PC e coloquei meu programa cliente no meu telefone que estava conectado ao WIFI na mesma rede do meu PC. Defino o programa cliente (no meu telefone, que está na minha LAN), para conectar ao endereço IP local do meu PC. Eu verifiquei se há falhas no meu código e descobri que é impecável. No entanto, quando tentei executá-lo, tive um comportamento muito estranho em troca:

  1. A porta está correta. O nome do host está correto. Eu tento conectar. Nada acontece. Nenhuma conexão é estabelecida.
  2. Eu redefinir meu PC.
  3. Eu tento de novo. Mesmo resultado.
  4. Eu desligo meu firewall local e público.
  5. Agora eu recebo algo, mas apenas no meu dispositivo cliente: [Erro 111] Conexão recusada.
  6. Eu ligo meus firewalls novamente.
  7. Mesmo resultado que em 1. (sem conexão)
  8. Eu executo o programa host no meu laptop. Eu tento conectar. Funciona!
  9. Reinicializo meu roteador e executo meu programa host no PC novamente. Mesmo resultado que em 1.
  10. Agora, também executo o programa cliente no meu PC, conectando-o ao "localhost". Funciona.
  11. Eu faço o mesmo que em 10. configurando o programa cliente para conectar-me novamente ao endereço IP local do meu PC. Erro:

    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
    

Em 6. Cheguei à conclusão de que o problema está relacionado ao PC e que meus programas funcionam bem.

Alguns intels:

  • Windows 7 em PC e laptop.
  • Estou usando o Python 2.7.
  • Laptop e smartphone são conectados à rede via Wi-Fi, PC via cabel.
  • Tentei portas diferentes para garantir que não fossem o problema.

provavelmente não é relevante, mas aqui está o código para o host e o cliente http://pastebin.com/raw/wswMi5SV

O que está acontecendo?

Cosinux
fonte
1
Pode ou não ser o seu código, mas a sua declaração "Eu verifiquei falhas no meu código e descobri que ela é perfeita" <- é uma declaração sem sentido. Você nunca sabe realmente se o seu código é perfeito .. Pode faltar falhas específicas .. mas dizer que é perfeito é um absurdo. Talvez algum código tenha uma falha de segurança devido à plataforma, então você não pode realmente dizer que é impecável. Você poderia dizer que não há falhas que possa determinar. E você optou por não compartilhar o código, porque você acha que é impecável. De qualquer forma, o seu tipo questão de fronteiras SO vs superuser..You pode precisar de fazer mais solução de problemas de algum tipo
barlop
portanto, seu programa, quando executado em um computador específico, aceita uma conexão pela primeira vez e falha na segunda vez. Considerando que, ao executar em outros computadores, sempre aceita uma conexão?
barlop 01/05/19
você pode tentar cygwin e nc -l -p 1234 ou nc -l 1234 (qualquer que seja o comando nc para obter um servidor de escuta) e tente conectar-se a ele, veja se ele tem o mesmo problema que o seu programa. (talvez sempre fazer -p -l para ser seguro,)
barlop
Veja, o que eu quis dizer com impecável é que ele funciona em um computador diferente. É também como as postagens na internet dizem que isso deve ser feito. Se você quiser ver o código, eu posso mostrá-lo. É realmente simples, algumas linhas. Para responder ao segundo comentário: Ele não funciona no meu PC, mas no meu laptop. O comportamento estranho é que, se eu ativar o firewall, nada acontece (o host ainda está ouvindo e o cliente ainda tenta se conectar), enquanto que, se desativado, a conexão é recusada. Quanto ao terceiro comentário, tentarei isso agora e informarei sobre os resultados.
Cosinux
eu gostaria de ver o código - estou curioso. Além disso, verifique os resultados do netstat (netstat -aon), .. veja o IP em que está ouvindo, é 127.0.0.1 é por exemplo 192.168.xy (permitindo a conexão da LAN), é 0.0.0.0 (permitindo que qualquer pessoa se conecte ) Você também pode tentar o wireshark (um farejador de pacotes), embora possa não ser bom testar uma conexão com o 127.0.0.1, mas você pode conectar outro computador ao computador e executar o wireshark no computador e ver o que está acontecendo.
Barlop 01/05/19

Respostas:

0

No momento, você está vinculando localhostapenas uma interface interna. Os programas vinculados a 127.0.0.1não são acessíveis pela rede, isso ocorre por design. Isso pode ser visto quando você recebe uma "conexão recusada" quando se conecta ao firewall desativado. Quando você envia um TCP SYN para uma porta fechada, o sistema operacional envia um TCP RST de volta ao cliente para indicar que a porta está fechada.

Quando você diz que a ligação ao 0.0.0.0não funcionou, pode ser mais específico? Como isso falha exatamente?

Uma coisa que você pode tentar é:

server.bind(("", port))

Se bem me lembro, isso tentará vincular a todas as interfaces disponíveis. Não sei ao certo o que você tentou anteriormente, mas isso deve resolver seu problema.

prateek61
fonte
Obrigado pelo seu esforço. Mas parece haver um problema complexo com o meu computador. Eu fiz muitos testes e descobri que há um problema no meu PC. Provavelmente, o problema está em algum lugar nas configurações do meu PC, pois tentei várias abordagens diferentes para fazer meus programas funcionarem e não resolvi o problema, enquanto deixava de fora a possibilidade de qualquer outra coisa ser o problema. Descobri que a conexão é estabelecida se eu hospedar um soquete de servidor no meu telefone. O problema ocorre apenas com o meu PC. Programa funciona bem no meu laptop.
Cosinux
Acredito que a ligação a diferentes interfaces não funcionará. Eu já tentei 0.0.0.0, 127.0.0.1 e 192.168.1.4.
Cosinux
Qualquer tentativa resultará em erro de conexão recusada . Também tentei conectar meu telefone ao computador via rede celular, configurando o encaminhamento de porta para o meu PC, mas não funcionou.
Cosinux
Você pode fornecer a saída de um netstat no laptop e PC com o programa em execução?
Prateek61