No se puede vincular 127.0.0.123 a tcp socket python

Estoy tratando de aprender sockets TCP para mi proyecto. Los usaré para transferir archivos entre computadoras.

El combo de cliente del servidor copiado de algún tutorial funciona bien siempre y cuando la ip que estoy tratando de vincular sea 127.0.0.1. Cuando lo cambio a algo menos estándar, como dice 127.0.0.123 OSX, no puedo vincularme a esta dirección:
socket.error: [Errno 49] Can't assign requested address

No tengo problemas en Debian Hard.

código del servidor

#!/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()

Codigo del cliente:

#!/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 es la dirección IP de la computadora en la que se ejecuta el código (también conocido como localhost), 127.0.0.123 generalmente no existe.
Entonces, ¿por qué esto funciona bien en Debian? ¿No es como loopback es una red /24 para probar aplicaciones de red sin conexión? EDITAR: En realidad, creo que no solo es /24 sino /8
Pila de red diferente, ping 127.0.0.123tampoco funciona en OS X. Si no recuerdo mal, el estándar define /8 como reservado para loopback, no exige que se pueda acceder a todas las direcciones.

Respuestas (1)

En una Mac, la interfaz de loopback solo tiene configurada la dirección 127.0.0.1. Siempre puede agregar un alias a la IP que necesita:

sudo ifconfig lo0 alias 127.0.0.123

Su código Python funcionó para mí entonces.

Para eliminar el alias, haga lo siguiente:

sudo ifconfig lo0 -alias 127.0.0.123

Para que esto sea persistente durante los reinicios, cree org.local.localhost.plist en /Library/LaunchDaemons/. Cambia los permisos con:

sudo chmod root:wheel /Library/LaunchDaemons/org.local.localhost.plist

Abre el archivo con

sudo nano /Library/LaunchDaemons/org.local.localhost.plist

y agrega el siguiente contenido:

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

Finalmente cargue el demonio de lanzamiento con:

sudo launchctl load /Library/LaunchDaemons/org.local.localhost.plist
Entonces, ¿este alias funcionará de la misma manera que en Debian?
Realmente no sé lo que quieres decir. ¿Pude agregar el alias y ejecutar el código python, vinculando así a 127.0.0.123? ¿Qué hace Debian que necesitas?
Debian solo me permite vincular 127.0.0.123, así que creo que el resultado es el mismo :)
Acabo de comprobar y su solución funciona perfectamente, gracias :)