为什么我不能绑定到Mac OS X上的127.0.0.1?

我试图在Mac OS X上设置一个简单的Web服务器,当我运行bind时,我不断收到错误。 这是我正在运行(这个抄本使用GNU Guile,但只是作为一个方便的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 

这给了我错误In procedure bind: can't assign requested address

所以我再次尝试,允许任何地址。

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

这工作正常。 但是这很奇怪,因为ifconfig lo0

 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 

所以回环设备被分配给127.0.0.1 。 所以我的问题是,为什么我不能绑定到该地址?

谢谢。

更新: 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 

这不完全是一个答案,因为它不直接解决你的问题…但它看起来好像你的问题是特别狡猾。 也就是说,在我的OS X 10.6系统中,我使用例如使用guil代码的同样的问题。 另一方面,下面的工作很好:

 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() 

如果我运行这个代码,我可以看到套接字侦听:

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

并连接到端口8080做你所期望的:

 $ telnet localhost 8080 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. hello Connection closed by foreign host. 

事实上,就我而言,问题在于结构中未初始化的字段与语义套接字地址无关。

我添加了一个memset(&sa, 0, sizeof sa) ,现在它绑定了。

几乎可以肯定的是,Guile实现遇到了同样的问题:初始化struct sockaddr_in的logging字段。 症状是完全一样的,在任何情况下: INADDR_ANY绑定,但INADDR_LOOPBACK拒绝与相同的errno

编辑:对不起,如果我不清楚; 我指的是我添加到某人被删除的问题。 也就是说,在另一个Lisp方言的执行中遇到了同样的问题。 我添加了我的观察,以及一些gdbdebugging会话跟踪,显示bind调用之前struct sockaddr_in的内容。 地址显示正确初始化了sin_familysin_addrsin_port字段。 然而,在结构的头部(在达尔文,在其他平台上缺席)的sin_len字段是未初始化的,以及sin_zero填充数组。