0

在do.py中

servport = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
servport.bind( (socket.gethostname(), 0) )

wrapper = 'doing.py'
pid = os.fork()
if not pid:
       argv = [sys.executable, wrapper, '%s:%d' % servport.getsockname()]
       os.execv(argv[0], argv)
try:
    print "do.py: someone connect to me"
    servport.listen(1)
    (send_sock, got_addr) = servport.accept()
    print "do.py: connected from %s" % str(got_addr)

在做.py

print "doing.py: got %s" % str(sys.argv)
(host, port) = sys.argv[1].split(':')
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect( (host,port) )

我看到'%s:%d' % socket.getsockname()给出 127.0.1.1:36802

但是我的公共IP地址是以98开头的。。.* 如果我在我的盒子(ubuntu)上执行 ifconfig,我的 wlan0 为 192.168。.

我阅读并理解IP地址和127有不同的类别。 。.* 基本上是说数据包的目的地是在同一台机器上运行的另一个应用程序。

我如何编码以便'%s:%d' % socket.getsockname()给出我的 98 .*?


根据建议,如果我更改为servport.bind( ('0.0.0.0', 0) )in do.py

我得到
do.py:有人连接到我
doing.py:得到['doing.py',0.0.0.0:41107']
do.py:连接自('127.0.0.1',43871)

这是否意味着我的数据包实际上是在我的网络之外发送并返回的?<-----

4

1 回答 1

0

参考这个问题: Finding local IP addresses using Python's stdlib

使用 socket.getfqdn 来解析您的合格主机名。

然后使用socket.gethostbyname将其转为可解析的ip地址

像这样

>>> 从套接字导入 gethostbyname,getfqdn

>>> gethostbyname(getfqdn())

'0.0.0.0'

于 2013-09-14T17:56:31.383 回答