以前はselectを使ってたけどasyncoreが便利。
29,30行目のoppositeに強引に送信関数を設定しているが、どうも美しくない。
どうすべきかなぁ
import fcntl import struct import asyncore TUNSETIFF = 0x400454ca IFF_TUN = 0x0001 IFF_TAP = 0x0002 IFF_NO_PI = 0x1000 class TunTap(asyncore.file_dispatcher): def __init__(self, ifname, flags): self.ifname = ifname self.fd = open('/dev/net/tun', 'r+b') ifr = struct.pack('16sH', ifname, flags) res = fcntl.ioctl(self.fd, TUNSETIFF, ifr) self.ifname = struct.unpack("16sH", res)[0].strip('\x00') asyncore.file_dispatcher.__init__(self, self.fd) def handle_read(self): self.opposite.send(self.recv(2048)) def writable(self): return False t1 = TunTap( 'tap1', IFF_TAP | IFF_NO_PI ) t2 = TunTap( 'tap2', IFF_TAP | IFF_NO_PI ) t1.opposite = t2 t2.opposite = t1 asyncore.loop()
0 件のコメント:
コメントを投稿