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()
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
sin ladera
localhost
), 127.0.0.123 generalmente no existe.fulahex
sin ladera
ping 127.0.0.123
tampoco 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.