Por que não posso ligar a 127.0.0.1 no Mac OS X?

2

Estou tentando configurar um servidor da Web simples no Mac OS X e continuo recebendo um erro quando executo bind . Aqui está o que estou executando (esta transcrição usa o GNU Guile, mas apenas como uma interface conveniente para o posix).

(define addr (inet-aton "127.0.0.1"))                     ; get internal representation of 127.0.0.1
(define sockaddr (make-socket-address AF_INET addr 8080)) ; make a struct sockaddr
(define sock (socket PF_INET SOCK_STREAM 0))              ; make a socket
(bind sock sockaddr)                                      ; bind the socket to the address

Isso me dá o erro In procedure bind: can't assign requested address .

Então tentei novamente, permitindo qualquer endereço .

(define anyaddr (make-socket-address AF_INET INADDR_ANY 8080)) ; allow any address
(bind sock anyaddr)

E isso funciona bem. Mas é estranho, porque ifconfig lo0 diz

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
  inet6 ::1 prefixlen 128 
  inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
  inet 127.0.0.1 netmask 0xff000000 

Portanto, o dispositivo de loopback é atribuído a 127.0.0.1 . Então, minha pergunta é: por que não posso me vincular a esse endereço?

Obrigado.

Atualização: a saída de route get 127.0.0.1 é

   route to: localhost
destination: localhost
  interface: lo0
      flags: <UP,HOST,DONE,LOCAL>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
   49152     49152         0         0         0         0     16384         0 
    
por Noah Lavine 06.02.2011 / 21:53

2 respostas

2

Isso não é exatamente uma resposta, já que isso não resolve diretamente o seu problema ... mas parece que o seu problema é particular para enganar. Ou seja, no meu OS X 10.6 sistema, eu tenho o mesmo problema que você faz usando o código de guile de você exemplo. Por outro lado, o seguinte funciona bem:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 8080))
s.listen(5)

c, addr = s.accept()
c.send('hello\n')
c.close()

Se eu executar este código, posso ver o soquete ouvindo:

netstat -f inet -an | grep 8080
tcp4       0      0  127.0.0.1.8080         *.*                    LISTEN

E a conexão à porta 8080 faz o que você esperaria:

$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hello
Connection closed by foreign host.
    
por 07.02.2011 / 00:12
0

De fato, no meu caso, o problema é com os campos não inicializados na estrutura que não têm nada a ver com o endereço de soquete semântico.

Eu adicionei um memset(&sa, 0, sizeof sa) e agora ele liga.

É quase certo que a implementação do Guile estava se deparando com o mesmo problema: inicializando apenas os campos documentados de struct sockaddr_in . Os sintomas eram exatamente os mesmos, em qualquer caso: INADDR_ANY binding, ainda INADDR_LOOPBACK recusando com o mesmo errno .

Editar: desculpe se não estou claro; Estou me referindo a algo que adicionei à pergunta que alguém removeu. Ou seja, encontrei exatamente o mesmo problema na implementação (por pura coincidência) de outro dialeto Lisp. Eu adicionei minhas observações, juntamente com alguns rastreios da sessão de depuração gdb mostrando o conteúdo do struct sockaddr_in antes da chamada bind . O endereço mostrou os campos sin_family , sin_addr e sin_port inicializados corretamente. No entanto, o campo sin_len na cabeça da estrutura (presente em Darwin, ausente em outras plataformas) não foi inicializado, bem como uma matriz de preenchimento sin_zero no final.

    
por 10.03.2016 / 07:10

Tags