mirror of https://github.com/minexew/Shrine.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.2 KiB
90 lines
2.2 KiB
#!/usr/bin/env python |
|
|
|
from __future__ import print_function |
|
|
|
import socket |
|
import struct |
|
import sys |
|
import time |
|
|
|
TCP_IP = '127.0.0.1' |
|
TCP_PORT = 7777 |
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|
sock.connect((TCP_IP, TCP_PORT)) |
|
|
|
# socket #0 is never used |
|
socks = [False] |
|
|
|
CMD_SOCKET = 1 |
|
CMD_CLOSE = 2 |
|
CMD_CONNECT_TCP = 3 |
|
CMD_SEND = 4 |
|
CMD_RECV = 5 |
|
CMD_HELLO = 0xAA |
|
|
|
def recvall(sock, count): |
|
s = b'' |
|
|
|
while len(s) < count: |
|
part = sock.recv(count - len(s)) |
|
if part is None: break |
|
s += part |
|
|
|
return s |
|
|
|
while True: |
|
cmd = ord(sock.recv(1)) |
|
#print('%02X' % cmd) |
|
if cmd is None: break |
|
|
|
if cmd == CMD_HELLO: |
|
print('hello!') |
|
sock.send(b'\xAA') |
|
elif cmd == CMD_CLOSE: |
|
sockfd = ord(sock.recv(1)) |
|
print('close(%d)' % (sockfd)) |
|
|
|
socks[sockfd].close() |
|
socks[sockfd] = None |
|
sock.send(struct.pack('B', 0)) |
|
elif cmd == CMD_CONNECT_TCP: |
|
sockfd, length = struct.unpack('BB', recvall(sock, 2)) |
|
hostname = recvall(sock, length).decode() |
|
port, = struct.unpack('H', recvall(sock, 2)) |
|
print('connectTcp(%d, %s, %d)' % (sockfd, hostname, port)) |
|
|
|
try: |
|
socks[sockfd].connect((hostname, port)) |
|
rc = 0 |
|
except socket.error as e: |
|
print(e) |
|
rc = 0xff |
|
|
|
sock.send(struct.pack('B', rc)) |
|
elif cmd == CMD_RECV: |
|
sockfd, length, flags = struct.unpack('BBB', recvall(sock, 3)) |
|
#print('recv(%d, %d, %d)' % (sockfd, length, flags)) |
|
|
|
try: |
|
data = socks[sockfd].recv(length) |
|
except socket.error as e: |
|
print(e) |
|
data = b'' |
|
|
|
sock.send(struct.pack('B', len(data))) |
|
sock.send(data) |
|
elif cmd == CMD_SEND: |
|
sockfd, length, flags = struct.unpack('BBB', recvall(sock, 3)) |
|
data = recvall(sock, length) |
|
#print('send(%d, %s, %d)' % (sockfd, data, flags)) |
|
|
|
rc = socks[sockfd].send(data) |
|
sock.send(struct.pack('B', rc)) |
|
elif cmd == CMD_SOCKET: |
|
af, type = struct.unpack('BB', recvall(sock, 2)) |
|
id = len(socks) |
|
print("socket(%d, %d)" % (af, type)) |
|
|
|
socks.append(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) |
|
sock.send(struct.pack('B', id))
|
|
|