Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- import struct
- import asyncio
- @asyncio.coroutine
- def tcp_echo_client(server, port, loop):
- try:
- try:
- reader, writer = yield from asyncio.wait_for(
- asyncio.open_connection(server, port, loop=loop),
- 30.0,
- loop=loop
- )
- except asyncio.TimeoutError:
- print('Timeout while establishing a connection')
- return
- writer.write(struct.pack('!H', port))
- yield from writer.drain()
- try:
- data = yield from asyncio.wait_for(
- reader.readexactly(6),
- 30.0, # Timeout after 30 seconds
- loop=loop
- )
- res = struct.unpack('!BBBBH', data)
- remote_ip, port_used = res[0:4], res[4]
- print('Connection established on port: {}'.format(port_used))
- print('Egress IP address: {}'.format('.'.join(map(str, remote_ip))))
- except asyncio.TimeoutError:
- print('Timeout waiting for response')
- except asyncio.IncompleteReadError:
- print('Error receiving data')
- finally:
- writer.close()
- except ConnectionError:
- print('Error during connection on port {}'.format(port))
- def main():
- server_name = sys.argv[1]
- try:
- port = int(sys.argv[2])
- if port < 1 or port > 65536:
- raise ValueError()
- except ValueError:
- print('Error: invalid port value. Admissible range [0-65536]')
- sys.exit()
- loop = asyncio.get_event_loop()
- loop.run_until_complete(tcp_echo_client(server_name, port, loop))
- loop.close()
- sys.exit()
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement