本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!
指定连接到Internet的网卡:
Get the IP address for the interface that you want.
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915,
struct.pack('256s', ifname[:15])
)[20:24])
You can use it like this:
>>> get_ip_address('lo')
'127.0.0.1'
>>> get_ip_address('eth0')
'38.113.228.130'
Create a new socket bind it to your interface.
import socket
s = socket.socket()
s.bind((get_ip_address('eth0'), 0))
And then:
s.connect(('http://www.google.com/', 80))
比较好的参考链接:
在Windows和Linux系统上面socket模块里面有的内容有一些都不一样o(╯□╰)o,在Windows上OK:
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)# Enable promiscuous mode
In [3]: socket.SIO_RCVALL
Out[3]: 2550136833L
In [4]: socket.RCVALL_ON
Out[4]: 1
在Linux上会出现错误:
In [47]: socket.RCVALL_ON
...
AttributeError: 'module' object has no attribute 'RCVALL_ON'
...
AttributeError: 'module' object has no attribute 'SIO_RCVALL'
不过在文章: