Windows - Python socket accepterer kun lokale forbindelser

Indlæg af Hanne Mølgaard Plasc

Problem



Server:


import socket

host = ""
port = 4242
backlog = 5
size = 1024
s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)
s.bind((host,port))
s.listen(backlog)
client, address = s.accept()
while 1:

    data = client.recv(size)
    if data:
        client.send(data)
        print(data.decode("utf-8"))


Klient:


import socket
import sys

host = sys.argv[1]
port = 4242
size = 1024

s = socket.socket(socket.AF\_INET, socket.SOCK\_STREAM)
s.connect((host,port))
while True:
    line = input("What to say: ")
    s.send(line.encode("utf-8"))


Nå er jeg lidt forvirret her. Jeg begynder at lære om stikkontakter, så jeg startede på en simpel ekkoserver. Koden jeg har skrevet ovenfor virker smukt, når serveren kører på Arch Linux eller Ubuntu. Når det er på Windows 7 accepterer det kun lokale forbindelser. Jeg er ikke sikker på, om Python har en separat WinSock-implementering, eller hvad, men jeg er forvirret! Hvis du vil, er jeg helt klar over, at dette er frygteligt designet ( accepterer kun på klient!), men jeg vil bare vide, hvorfor Windows ikke accepterer fjernforbindelser.


Hvis det hjælper, på Arch og Ubuntu, kører jeg på Python 3.1, mens jeg er på Win 7 den er på 3,2.

Bedste reference


Det lyder som host='' er i stand til at binde til localhost (127.0.0.1) under Win 7 (jeg har ikke adgang til en Win 7-maskine i øjeblikket).


For at gøre din server tilgængelig på alle (IPv4) grænseflader på værten, bør dette arbejde på Linux, Windows, Mac, osv.:


host = '0.0.0.0'
s.bind((host, 8080))


For at kontrollere, hvilken adresse stikket er bindende for dig, kan du gøre dette:


>>> s.getsockname()
('0.0.0.0', 8080)

Andre referencer 1


Som dokumentationen for Socket siger: [6]



  Nogle adfærd kan være platformafhængige, da der foretages opkald til operativsystemstikket
  API'er.



Jeg er ikke bekendt med Win32-netværksprogrammering, men jeg ville risikere at gætte, at det sandsynligvis er en implementeringsspecifik adfærd, der udløses, når du opretter en stikkontakt uden at binde den til en adresse.


Mit forslag er at flytte et abstraktionsniveau og bruge SocketServer. [7]