Kann 127.0.0.123 nicht an TCP-Socket-Python binden

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()
127.0.0.1 ist die IP-Adresse des Computers, auf dem der Code läuft (alias localhost), 127.0.0.123 existiert normalerweise nicht.
Warum läuft das also gut auf Debian? Ist es nicht so, als wäre Loopback / 24-Netzwerk zum Offline-Testen von Netzwerk-Apps? EDIT: Eigentlich glaube ich, dass es nicht nur /24, sondern /8 ist
Anderer Netzwerkstapel, ping 127.0.0.123funktioniert 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.

Antworten (1)

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
Dieser Alias ​​funktioniert also genauso wie unter Debian?
Ich weiß nicht wirklich, was du meinst. Ich konnte den Alias ​​​​hinzufügen und den Python-Code ausführen und so an 127.0.0.123 binden? Was macht Debian, das Sie brauchen?
Debian erlaubt mir nur, 127.0.0.123 zu binden, also denke ich, dass das Ergebnis dasselbe ist :)
Gerade überprüft und Ihre Lösung funktioniert perfekt, danke :)