#python #python-3.x #socks
Вопрос:
Недавно я начал использовать TCP с Python. Я пытался использовать Socks4 в качестве прокси-сервера, но, похоже, это не работает. Код приведен ниже.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('148.77.34.200',54321)) # A random proxy I found
sock.send('x04x01x00x50xbcxb8x15x6cx43x68x61x64x00'.encode())
#| VER | FUNC | PORT | IP | Username |
#| 0x04| 0x1 | 80 (0x50)|188.184.21.108 |Chad(not my name)|
print('Sent data')
a = sock.recv(8)
print(f'Received data {a}')
sock.close()
Извините, если код немного запутан. В любом случае, я запускал программу, но она либо выдавала эту ошибку,
Traceback (most recent call last):
File "D:/Users/Aarav/OneDrive/Documents/testproxy.py", line 7, in <module>
a = sock.recv(8)
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
или он висел на носке.recv и вернулся b’ ‘.
Кто — нибудь знает, как устранить эту проблему, или у кого есть документация, которая могла бы помочь?
P.S. Я не планирую использовать pysocks или запрашивать[носки], пожалуйста, не давайте этого в качестве ответа.
ОТРЕДАКТИРУЙТЕ причину, по которой моя программа терпела неудачу, потому что, когда UTF-8 преобразует символы, отличные от ascii, она возвращает их не так, как я ожидал. Я использовал bytearray([0x04,0x01,0x00,0x50,0xbc,0xb8,0x15,0x6c,0x43,0x68,0x61,0x64,0x00])
вместо 'x04x01x00x50xbcxb8x15x6cx43x68x61x64x00'.encode()
этого, и это сработало идеально
Комментарии:
1. Это может быть способ, которым вы кодируете строку. Попробуйте использовать массив байтов:
sock.send(bytearray([0x04,0x01,0x00,0x50,0xbc,0xb8,0x15,0x6c,0x43,0x68,0x61,0x64,0x00]))
2. Вы используете
encode()
преобразование строки в байты с использованием UTF-8, Которое не будет выводить то, что вы ожидаете для символов, отличных от ASCII > 0x7F (т. Е. >xbc
— > >0xC2 0xBC
и т. Д.). Таким образом, вы на самом деле отправляете неправильный запрос SOCKS4 (вы можете проверить это с помощью анализатора пакетов). Вместо этого используйте массив байтов или, по крайней мере, укажите кодировкуencode()
, которая не изменит байты, которые вы пытаетесь отправить, например ISO-8859-1.3. О, спасибо. Мои сетевые знания практически отсутствуют, и почти нет документации. Ответы сработали хорошо.