#!/usr/bin/env python2 import sys,socket,time,threading IF_DEVICE="eth0" IP_ADDR="10.0.2.15" PORT=13531 try: SO_BINDTODEVICE=socket.SO_BINDTODEVICE except: SO_BINDTODEVICE=25 class Server(threading.Thread): def __init__(self, dev, port): threading.Thread.__init__(self) self.sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) if dev: self.sk.setsockopt(socket.SOL_SOCKET, SO_BINDTODEVICE, dev) self.sk.bind(('', port)) def run(self): while True: (data, addr) = self.sk.recvfrom(1024) print(("recv:%s from %s" % (data, str(addr)))) if data == 'finish': break # flush rt_cache. def flush_rt_cache(): f = open('/proc/sys/net/ipv4/route/flush', 'w') f.write('flush') # any message is ok. f.close() # create a rt_cache which is not bound to dev. # send a dummy packet to ssh port. (any port is ok) def create_dummy_rt_cache(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((IP_ADDR, 22)) s.send('dummy') s.close() def connect_and_send(msg): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, SO_BINDTODEVICE, IF_DEVICE) s.connect((IP_ADDR, PORT)) s.send(msg) if __name__ == '__main__': flush_rt_cache() create_dummy_rt_cache() # start a server thread. server = Server(IF_DEVICE, PORT) server.start() # start clients. but never connect to the server. for count in range(10): time.sleep(1) connect_and_send("count=%d" % count) print(("sent:count=%s" % count)) # revive the connection. flush_rt_cache() # now, successfully connect to the server. connect_and_send('finish') server.join()