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")
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
def enqueue_send(self, size): overlapped = win32file.OVERLAPPED() buf = win32file.AllocateReadBuffer(size) rc, buf = win32file.WSASend(self.handle, buf, overlapped, 0) overlapped.object = self
def send(self, fd, data, userdata = None ): self.fds[fd][0].object = [userdata, fd] return win32file.WSASend( fd, data, self.fds[fd][0],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)