Ich versuche, TCP-Sockets für mein Projekt zu lernen. Ich werde sie verwenden, um Dateien zwischen Computern zu übertragen.
Die aus einem Tutorial kopierte Server-Client-Kombination läuft gut, solange die IP, die ich zu binden versuche, 127.0.0.1
. Wenn ich es auf etwas weniger Standard ändere, wie 127.0.0.123 OSX sagt, kann ich mich nicht an diese Adresse binden:
socket.error: [Errno 49] Can't assign requested address
Ich habe keine Probleme mit Debian Tough.
Servercode
#!/usr/bin/env python
import socket
TCP_IP = '127.0.0.123'
TCP_PORT = 50050
BUFFER_SIZE = 1024 # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connection address:', addr
while 1:
data = conn.recv(BUFFER_SIZE)
if not data: break
print "received data:", data
conn.send(data) # echo
conn.close()
Kundencode:
#!/usr/bin/env python
import socket
TCP_IP = '127.0.0.123'
TCP_PORT = 50050
BUFFER_SIZE = 1024
MESSAGE = "message sent from client to server"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
s.close()
Auf einem Mac ist für die Loopback-Schnittstelle nur die Adresse 127.0.0.1 konfiguriert. Sie können der benötigten IP jederzeit einen Alias hinzufügen:
sudo ifconfig lo0 alias 127.0.0.123
Ihr Python-Code hat dann für mich funktioniert.
Gehen Sie wie folgt vor, um den Alias zu löschen:
sudo ifconfig lo0 -alias 127.0.0.123
Um dies über Neustarts hinweg dauerhaft zu machen, erstellen Sie org.local.localhost.plist in /Library/LaunchDaemons/. Ändern Sie die Berechtigungen mit:
sudo chmod root:wheel /Library/LaunchDaemons/org.local.localhost.plist
Öffnen Sie die Datei mit
sudo nano /Library/LaunchDaemons/org.local.localhost.plist
und füge folgenden Inhalt hinzu:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.local.localhost</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/ifconfig</string>
<string>lo0</string>
<string>alias</string>
<string>127.0.0.123</string>
<string>up</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Laden Sie schließlich den Launch-Daemon mit:
sudo launchctl load /Library/LaunchDaemons/org.local.localhost.plist
kein Hang
localhost
), 127.0.0.123 existiert normalerweise nicht.fulaphex
kein Hang
ping 127.0.0.123
funktioniert auch nicht unter OS X. Wenn ich mich richtig erinnere, definiert der Standard /8 als für Loopback reserviert, es schreibt nicht vor, dass jede Adresse erreichbar ist.