Ejemplo n.º 1
0
 def testAcceptEx(self):
     port = 4680
     running = threading.Event()
     stopped = threading.Event()
     t = threading.Thread(target=self.acceptWorker,
                          args=(port, running, stopped))
     t.start()
     running.wait(2)
     if not running.isSet():
         self.fail("AcceptEx Worker thread failed to start")
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.connect(('127.0.0.1', port))
     win32file.WSASend(s, str2bytes("hello"), None)
     overlapped = pywintypes.OVERLAPPED()
     overlapped.hEvent = win32event.CreateEvent(None, 0, 0, None)
     # Like above - WSARecv used to allow strings as the receive buffer!!
     buffer = " " * 10
     self.assertRaises(TypeError, win32file.WSARecv, s, buffer, overlapped)
     # This one should work :)
     buffer = win32file.AllocateReadBuffer(10)
     win32file.WSARecv(s, buffer, overlapped)
     nbytes = win32file.GetOverlappedResult(s.fileno(), overlapped, True)
     got = buffer[:nbytes]
     self.failUnlessEqual(got, str2bytes("hello"))
     # thread should have stopped
     stopped.wait(2)
     if not stopped.isSet():
         self.fail("AcceptEx Worker thread failed to successfully stop")
Ejemplo n.º 2
0
    def run(self):
        global sock, handle, mtu_size, verbose, now, last_send
        buf = win32file.AllocateReadBuffer(mtu_size)
        while True:
            # wait for data
            l, _ = win32file.ReadFile(handle, buf, self.overlapped_rx)
            # ERROR_IO_PENDING, maybe 0 also
            #assert win32api.GetLastError() == win32file.ERROR_IO_PENDING

            #rc = win32event.WaitForSingleObject(self.overlapped_rx.hEvent, 1000 * keepalive_interval)
            bytes_read = yield

            # overlapped mode, return a PyOVERLAPPEDReadBuffer instead of str
            p = buf[:bytes_read]

            if verbose:
                print 'tunnel recv: '
                #pprint(Ethernet(p))
                if (ord(p[0]) & 0xf0) == 0x40:
                    pprint(IP(p))
                elif (ord(p[0]) & 0xf0) == 0x60:
                    pprint(IP6(p))
                else:
                    print 'Unknown layer 3 protocol'
                    continue  # not support

            #sock.sendall(local_to_netmsg(pack_header(p)))
            rc, bytes_sent = win32file.WSASend(sock.fileno(),
                                               local_to_netmsg(pack_header(p)),
                                               self.overlapped_tx)

            # even send not pending, still generate a IOCP queued message
            bytes_sent = yield
            assert rc == 0 or rc == win32file.WSA_IO_PENDING

            last_send = now
Ejemplo n.º 3
0
 def enqueue_send(self, size):
     overlapped = win32file.OVERLAPPED()
     buf = win32file.AllocateReadBuffer(size)
     rc, buf = win32file.WSASend(self.handle, buf, overlapped, 0)
     overlapped.object = self
Ejemplo n.º 4
0
	def send(self, fd,  data, userdata = None ):
		self.fds[fd][0].object = [userdata, fd]
		return win32file.WSASend( fd, data, self.fds[fd][0],0 )
Ejemplo n.º 5
0
 def enqueue_send(self, data):
     overlapped = win32file.OVERLAPPED()
     rc, _ = win32file.WSASend(self.fileno(), data, overlapped, 0)   
     overlapped.object = self.send_done
     self.keep(overlapped.object)
     self.keep(overlapped)