绑定127.0.0.1以外的环回地址

时间:2014-12-10 07:14:50

标签: python windows sockets udp

为什么我无法通过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,就像.1地址一样,但没有任何东西只是到达接收端。为了使这更奇怪,如果我绑定/接收127.0.0.2/6666,它可以很好地接收数据。但是,如果我从127.0.0.2发送数据

,请不要这样做

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

1 个答案:

答案 0 :(得分:0)

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

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

告诉我它是否有效。

修改

Server.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))

这对你有用吗?