【问题标题】:Binding other than 127.0.0.1 loopback addresses绑定 127.0.0.1 以外的环回地址
【发布时间】:2015-02-08 07:20:20
【问题描述】:

为什么我不能通过 UDP 套接字发送数据,当我将它绑定到例如127.0.0.2,而不是 127.0.0.1?接收似乎有效

这是我的接收端

>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
>>> sock.bind(("127.0.0.1", 6666))
>>> sock.recvfrom(1024)
('01', ('127.0.0.1', 7777))

这就是我发送数据的方式

>>> sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
>>> sock.bind(('127.0.0.1', 7777))
>>> sock.sendto(b'01',('127.0.0.1',6666))
2

现在如果在发送中我说喜欢

>>> sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
>>> sock.bind(('127.0.0.2', 7777))
>>> sock.sendto(b'01',('127.0.0.1',6666))
2

接收端没有任何反应。 sendto 返回 2,就像使用 0.1 地址一样,但没有任何东西到达接收端。更奇怪的是,如果我绑定/接收 127.0.0.2/6666,它可以接收数据就好了。但同样,如果我从 127.0.0.2 发送数据,则不会

这是 Python 2.7.5,我在 Windows 7 上运行它。我正在尝试构建 MT 环境,我可以在同一台计算机内模拟到多个 IP 地址的连接。我不知道这是 python 功能还是 windows 或者可能是用户错误...

【问题讨论】:

    标签: python windows sockets udp


    【解决方案1】:

    您需要再次运行 sock.recvfrom(1024) 以从套接字缓冲区接收下一个 1024 字节数据。

    然后你会在接收端看到(b'01', ('127.0.0.2', 7777))

    告诉我它是否有效。

    编辑:

    服务器.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*- 
    
    import socket
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM )
    sock.bind(("127.0.0.1", 6666))
    while 1:
        data = sock.recvfrom(1024)
        print data
    

    client.py

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import socket
    
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    sock.bind(('127.0.0.1', 7777))
    sock.sendto(b'01',('127.0.0.1',6666))
    
    sock.close()
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
    sock.bind(('127.0.0.2', 7777))
    sock.sendto(b'02',('127.0.0.1',6666))
    sock.close()
    

    我可以得到

    ('01', ('127.0.0.1', 7777))
    ('02', ('127.0.0.2', 7777))
    

    这对你有用吗?

    【讨论】:

    • 是的,我当然这样做了。我还发现了一些 rawcap.exe 程序,它显然会嗅探环回 IF。我可以看到从 .1 地址发送的工具字节,但不是从 .2 地址发送的。所以人们可能会得出结论,它是发送端不起作用......
    • @fastfox 你的意思是你甚至没有看到接收端的消息?但它在我身边有效。也许您需要先关闭套接字绑定(127.0.0.1, 7777),然后打开另一个终端并创建一个新的套接字绑定到(127.0.0.2, 7777),然后再试一次。
    • 是的,我的意思是,如果发件人不是 127.0.0.1,我只是在接收端看不到任何东西。如果它真的对你有用,那就太奇怪了。我试图重新打开口译员,甚至重新启动几次。我在一些 linux 机器上尝试了相同的行并且在那里工作得很好。
    • @fastfox 我已经更新了我的答案。再试一次,告诉我发生了什么。
    • Noup。我只是得到'01'。但是,现在当我玩弄你的脚本时,我意识到如果我在你的 server.py 中添加这个 'sock.sendto(b'01',('127.0.0.2',7777))',就在 'bind' 之后,我得到了'01'和'02'数据包!几乎就像有某种内部防火墙阻止 .2 -> .1,直到它从 .1 -> .2 打开。
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多