Как отправить пакет на сервер

Уважаемые коллеги подскажите как отправить пакет на сервер?
Для тестирования проекта на Linux мне иногда приходилось отправлять файл пакета на сервер.
Там с этим справлялась простая программка netcat выглядело это так:
cat /path/to/filePack | nc remote_ip> port>
И в консоль падал ответ от сервера.
Сейчас хотелось бы что то подобное сделать с помощью python.
Погуглил и родил что то такое:
1 2 3 4 5 6 7 8 9 10
pack = open('trsTest').read() sock = socket.socket() sock.connect(('remote_ip', port)) sock.send(pack.encode()) data = sock.recv(1024) sock.close() print(data)
Как вы догадались не то
И сервер на том конце вместо этого:
ATTENTION! User '240 383 489' (192.456.45.221:64645) try connect to unexists TRS-channel {6D877BEB-55A5-457B-8962-F9030961E7E6}
Ответили вот это:
ATTENTION! User 'aР·Р' (192.456.45.221:64645) try connect to unexists TRS-channel {E27BBBD0-A180-D26D-9055-7B45E280B062}
А IDE написала:
1 2 3 4
Traceback (most recent call last): File "M:/assistant/pyTestAs/test", line 99, in module> data = sock.recv(1024) ConnectionResetError: [WinError 10054] Удаленный хост принудительно разорвал существующее подключение
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Почему если отправить пакет UDP и конечного адресата в сети не существует, то пакет не отправляется?
Добрый день! Вопрос для расширения кругозора. Мониторю свой трафик с помощью WireShark и.
Как отправить файлы на сервер по нажатию по кнопке минуя событие change, и как отправить вместе с файлом другие данные?
Проблема в том что как только устанавливаются файлы для отправки они сразу-же отправляются, я так.
Как правильно отправить пакет?
Доброе время суток! подскажите как правильно отправить покет чтобы выполнялось следующее.
Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и.
Как программно отправить udp пакет?
нужно отправить udp пакт на определенный url через сокеты что то не могу! кто может помогите!и.
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как отправить пакет с определенного порта?
Подскажите возможно ли отправить пакет с определенного порта?1
Как отправить пакет через sendbuf определенному клиенту?
Соеденение осуществляется через встроеные компоненты socket билдера. предположим ко мне.

Как маршрутизатор узнаёт кому какой пакет отправить
Здравствуйте! Недавно я начал играться с сетью, кидать туда-сюда сообщения через TCP. В общем всё.
Как принять и отправить один и тот же пакет. Перенаправление пакетов
Всем привет. Есть такая цель. Нужно принимать ВЕСЬ трафик, который приходит на интерфейс и не.
Как перехватить и не дать отправить определенный пакет определенного приложения
В приложении нужно именно определенный пакет не давать отсылать хочу научиться делать это на C#.
Или воспользуйтесь поиском по форуму:
Отправка сетевых пакетов с помощью Python?
Привет, нужно написать программу, которая будет отсылать tcp, upd, ip и icmp пакеты. Причем юзер должен сам указывать соответствующие поля пакетов (версии, заголовки, флаги, адреса, порты, данные и т.д).
Советуют использовать libpcap для этих целей. Посмотрел на PyPi, там дофига всего. Не знаю, какую выбрать. Хочу делать это все на Python 3.5, боюсь что многие модули устарели и написаны под вторую ветку.
У кого есть какие идеи?
Заранее спасибо!
- Вопрос задан более трёх лет назад
- 2685 просмотров
Создание сетевых соединений из низкоуровнего кода asyncio в Python
В разделе рассмотрены низкоуровневые методы цикла событий модуля asyncio , при помощи которых можно создать и открыть сетевые потоковые соединения следующих видов TCP, UDP и Unix.
Прежде чем что-то делать с циклом событий, его необходимо создать или получить функциями, описанными в разделе «Создание, запуск и получение цикла событий».
Содержание:
- loop.create_connection() открывает TCP соединение,
- loop.create_datagram_endpoint() открывает UDP соединение,
- loop.create_unix_connection() открывает Unix соединение,
- Пример UDP сервера и клиента.
loop.create_connection(protocol_factory, host=None, port=None, *, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None, happy_eyeballs_delay=None, interleave=None) :
Метод loop.create_connection() открывает TCP соединение с заданным адресом, указанным host и port . Представляет собой сопрограмму.
Семейство сокетов может быть AF_INET или AF_INET6 в зависимости от хоста или аргумента family , если он предоставлен.
Аргумент protocol_factory должен быть вызываемым объектом, возвращающим реализацию протокола модуля asyncio .
Метод loop.create_connection() попытается установить соединение в фоновом режиме. В случае успеха — возвращает пару (transport, protocol) .
Хронологический синопсис основной операции выглядит следующим образом:
- Соединение установлено и для него создан транспорт.
- Объект аргумента protocol_factory вызывается без аргументов и ожидается, что он вернет экземпляр протокола.
- Экземпляр протокола связывается с транспортом, вызывая его метод Protocol.connection_made() .
- В случае успеха возвращается кортеж (transport, protocol) .
Созданный транспорт представляет собой зависящий от реализации двунаправленный поток.
- ssl :
- если задано и не равно False , то создается транспорт SSL/TLS (по умолчанию создается простой транспорт TCP),
- если ssl является объектом ssl.SSLContext , то этот контекст используется для создания транспорта,
- если ssl имеет значение True , то используется контекст по умолчанию, возвращаемый из ssl.create_default_context() .
Изменено в Python 3.6: Параметр сокета TCP_NODELAY устанавливается по умолчанию для всех соединений TCP.
Новое в Python 3.7: Добавлен параметр ssl_handshake_timeout .
Новое в Python 3.8: Добавлены параметры happy_eyeballs_delay и interleave .
Изменено в версии 3.11: Добавлен параметр ssl_shutdown_timeout .
Смотрите также функцию asyncio.open_connection() — это высокоуровневый альтернативный API. Он возвращает пару (StreamReader, StreamWriter) , которые могут быть использованы непосредственно в коде async/await .
loop.create_datagram_endpoint(protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, reuse_address=None, reuse_port=None, allow_broadcast=None, sock=None) :
Метод loop.create_datagram_endpoint() создает UID соединение (соединение дейтаграммы). Представляет собой сопрограмму.
Семейство сокетов может быть AF_INET , AF_INET6 или AF_UNIX , в зависимости от хоста или аргумента family , если он предоставлен.
Тип сокета будет SOCK_DGRAM .
Аргумент protocol_factory должен быть вызываемым объектом, возвращающим реализацию протокола модуля asyncio .
В случае успеха — возвращает пару (transport, protocol)
Примечание. Аргумент reuse_address не поддерживается с версии Python 3.8.1 и полностью удален в Python 3.11, поскольку использование SO_REUSEADDR представляет серьезную проблему безопасности для UDP соединений. Явная передача reuse_address=True вызовет исключение.
Когда несколько процессов с разными UID назначают сокеты на одинаковый адрес сокета UDP с помощью SO_REUSEADDR , входящие пакеты могут случайным образом распределяться между сокетами.
Для поддерживаемых платформ, аргумент reuse_port может использоваться как замена аналогичной функциональности. В случае reuse_port=True , вместо него будет использоваться SO_REUSEPORT , что специально предотвращает присвоение сокетам одного и того же адреса сокета процессам с разными UID.
- local_addr , если задан, то представляет собой кортеж (local_host, local_port) , используемый для локальной привязки сокета. Значения local_host и local_port ищутся с помощью loop.getaddrinfo() .
- remote_addr , если задан, является кортежем (remote_host, remote_port) , используемым для подключения сокета к удаленному адресу. Значения remote_host и remote_port ищутся с помощью loop.getaddrinfo() .
- family , proto , flags — это необязательное семейство адресов, протокол и флаги, передаваемые в loop.getaddrinfo() для разрешения хоста. Все они должны быть целыми числами из соответствующих констант модуля socket .
- reuse_port указывает ядру разрешить привязку этой конечной точки к тому же порту, к которому привязаны другие существующие конечные точки, если все они устанавливают этот флаг при создании. Этот параметр не поддерживается в Windows и некоторых системах Unix. Если в системе константа SO_REUSEPORT не определена, то эта возможность не поддерживается.
- allow_broadcast сообщает ядру разрешить этой конечной точке отправлять сообщения на широковещательный адрес.
- sock — это уже подключенный объект socket.socket() , который будет использоваться транспортом. Если указаны, local_addr и remote_addr , то следует их опустить, т.е. должны быть None .
Смотрите примеры протокола эхо-клиента UDP и примеры протокола эхо-сервера UDP.
Изменено в Python 3.8.1: аргумент reuse_address больше не поддерживается из соображений безопасности.
Изменено в Python 3.8: Добавлена поддержка Windows.
Изменено в Python 3.11: аргумент reuse_address , отключенный в Python 3.9.0, 3.8.1, 3.7.6 и 3.6.10, полностью удален.
loop.create_unix_connection(protocol_factory, path=None, *, ssl=None, sock=None, server_hostname=None, ssl_handshake_timeout=None, ssl_shutdown_timeout=None) :
Метод loop.create_unix_connection() создает соединение Unix. Представляет собой сопрограмму.
Семейство сокетов будет AF_UNIX . Тип сокета будет SOCK_STREAM .
В случае успеха возвращается кортеж (transport, protocol) .
Аргумент path — это имя сокета домена Unix и является обязательным, если не указан аргумент sock . Поддерживаются абстрактные сокеты Unix, str, байты и пути Path.
Смотрите документацию по методу loop.create_connection() для получения информации об остальных аргументах этого метода.
Новое в Python 3.7: добавлен аргумент ssl_handshake_timeout .
Изменено в Python 3.7: теперь аргумент path может быть объектом path .
Изменено в Python 3.11: добавлен аргумент ssl_shutdown_timeout .
Пример UDP сервера и клиента.
UDP сервер.
UDP эхо-сервер, используя метод loop.create_datagram_endpoint() , отправляет обратно клиенту полученные данные:
import asyncio class EchoServerProtocol: def connection_made(self, transport): self.transport = transport def datagram_received(self, data, addr): message = data.decode() print('Received %r from %s' % (message, addr)) print('Send %r to %s' % (message, addr)) self.transport.sendto(data, addr) async def main(): print("Starting UDP server") # Get a reference to the event loop as we plan to use # low-level APIs. loop = asyncio.get_running_loop() # One protocol instance will be created to serve all # client requests. transport, protocol = await loop.create_datagram_endpoint( lambda: EchoServerProtocol(), local_addr=('127.0.0.1', 9999)) try: await asyncio.sleep(3600) # Serve for 1 hour. finally: transport.close() asyncio.run(main())
UDP клиент.
UDP эхо-клиент, используя метод loop.create_datagram_endpoint() , отправляет данные и закрывает транспорт, когда получает ответ:
import asyncio class EchoClientProtocol: def __init__(self, message, on_con_lost): self.message = message self.on_con_lost = on_con_lost self.transport = None def connection_made(self, transport): self.transport = transport print('Send:', self.message) self.transport.sendto(self.message.encode()) def datagram_received(self, data, addr): print("Received:", data.decode()) print("Close the socket") self.transport.close() def error_received(self, exc): print('Error received:', exc) def connection_lost(self, exc): print("Connection closed") self.on_con_lost.set_result(True) async def main(): # Get a reference to the event loop as we plan to use # low-level APIs. loop = asyncio.get_running_loop() on_con_lost = loop.create_future() message = "Hello World!" transport, protocol = await loop.create_datagram_endpoint( lambda: EchoClientProtocol(message, on_con_lost), remote_addr=('127.0.0.1', 9999)) try: await on_con_lost finally: transport.close() asyncio.run(main())
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Сопрограммы и механизмы их запуска модулем asyncio
- Что такое аwaitable объект модуля asyncio
- Функция run() модуля asyncio
- Менеджер контекста Runner() модуля asyncio
- Функция create_task() модуля asyncio
- Группы задач TaskGroup() модуля asyncio
- Класс Task() модуля asyncio
- Функция sleep() модуля asyncio
- Функция gather() модуля asyncio
- Функция shield() модуля asyncio
- Асинхронный менеджер timeout() модуля asyncio
- Асинхронный менеджер timeout_at() модуля asyncio
- Функция wait_for() модуля asyncio
- Функция as_completed() модуля asyncio
- Функция wait() модуля asyncio
- Функция to_thread() модуля asyncio
- Функция run_coroutine_threadsafe() модуля asyncio
- Функции current_task() и all_tasks() модуля asyncio
- Использование очереди asyncio.Queue
- Примитивы синхронизации задач в asyncio
- Запуск внешних программ из кода asyncio
- Работа с сетевыми соединениями модуля asyncio
- Объект Future модуля asyncio Python и связанные функции
- Создание и получение текущего цикла событий, модуль asyncio
- Создание, запуск и остановка цикла событий модуля asyncio
- Планирование обратных вызовов из цикла событий asyncio
- Создание Future и Task из цикла событий asyncio
- Немедленное выполнение задач модулем asyncio
- Создание пулов потоков и процессов из цикла событий asyncio
- Создание TCP, UDP и Unix соединений из цикла событий asyncio
- Создание сетевых серверов из цикла событий asyncio
- Создание субпроцесса из цикла событий asyncio
- Работа с сокетами напрямую из цикла событий asyncio
- Передача файлов из цикла событий asyncio
- Наблюдение за дескрипторами файлов из цикла событий asyncio
- DNS запросы из цикла событий asyncio
- Сигналы Unix в циклах событий asyncio
- Параллелизм и многопоточность в цикле событий asyncio
- Объекты Transport и Protocol в цикле событий asyncio
- Включение режима отладки в asyncio
- Обработка исключений в цикле событий модуля asyncio
- Исключения модуля asyncio Python
Клиент-серверная модель в Питоне и сокеты
В этой статье мы рассмотрим клиент-серверную архитектуру на примере Python.
Питон – это универсальный язык программирования. С его помощью можно создать как бизнес-приложение, так и клиент-серверную модель. Второй вариант становится все более популярным и распространенным у разработчиков. Все это благодаря простому синтаксису Python.
В данной статье речь зайдет о так называемом сетевом программировании. Предстоит изучить не только клиент-серверные модели в Python, но и сокеты. В конце будет рассмотрен пример элементарного чата, написанного на этом языке программирования.
Протоколы
Сетевое программирование – это часть, отвечающая за обмен электронными материалами между сервером и клиентом. Соответствующими компонентами модели могут выступать не только физические servers и компьютеры, а также иное оборудование.
В основе клиент-серверной модели иногда заложена логическая реализация: в пределах одного стола или конкретного железа. Все манипуляции здесь будут применять некоторый свод правил по доставке, инкапсуляции и очередности пакетов и сетевого взаимодействия. Подобный принцип носит название протокола передачи данных.
В Питоне программное обеспечение сетевого характера обычно используют протоколы транспортного уровня двух видов: TCP и UDP.
О TCP
TCP протокол в Python встречается тогда, когда нужно обеспечить между компьютерами двусторонний канал обмена информации. Здесь требуется запомнить следующие сведения:
- При его задействовании пакеты будут обязательно доставляться с соблюдением порядка очередности и авто разбиением электронных материалов на пакеты. Предусматривается также контроль передачи информации.
- TCP не выделяется особой скоростью функционирования.
- Потерянные пакеты будут повторно и многократно отправляться. Это приводит к увеличению количества операций.
Соответствующий вариант гарантирует, что клиент точно получит всю необходимую информацию.
Кратко о UDP
UDP – это низкоуровневый протокол. Он позволяет устройствам отправлять и получать данные отдельными пакетами. Логическое соединение здесь будет отсутствовать.
UDP не выделяется надежностью. Клиент не получает никаких гарантий полноценного получения передаваемых сведений. Это создает определенные помехи при управлении протоколами в приложениях, где в основе заложена полнота получение электронных материалов и файлов. Подобные особенности приводят к тому, что при сетевом программировании в Python чаще встречается TCP.
Сокет – это…
Совет – своеобразный абстрактный объект, который представляет собой конечную точку соединения. Socket в Python можно использовать как файл. Он предусматривает считывание и получение электронных материалов.
Сокет – конечные точки двунаправленного канала связи. Взаимодействуют:
- в процессе;
- между процессами на одном устройстве;
- между процессами на разном оборудовании.
Реализовываются через разнообразные типы каналов. Содержат в себе несколько параметров. Среди них выделяют две составляющие – IP-адрес и порт.
Порты и адреса
Когда server принимает соединение, он присваивает своему сокету конкретный порт. Port – это число в заголовках пакетов TCP, UDP, которое указывает, для какого софта в системе используется IP-пакет.
Здесь требуется уяснить следующее:
- Ports с номерами 0-1023 не допустимо. Связано это с тем, что они уже зарезервированы под служебные сетевые протоколы.
- Клиент, отправляя информацию, тоже создает собственный socket.
- Два сокета по каждую сторону «системы» будут образовывать виртуальное соединение. По нему осуществляется передача электронных материалов.
- При использовании TCP создаются два сокета: один слушатель (listen) и второй – socket обмена данными. Первый переходит в ожидание и активизируется при новом соединении. Второй носит название accept.
При помощи этих сведений составить грамотный код, который будет поддерживать работу в сети, станет проще. Но без грамотного управления модель «clients server» реализовать проблематично.
Лексика
Каждый рассматриваемый компонент имеет собственную лексику. Программисту предстоит уяснить такие данные:
- Domain – это семейство protocols, используемое в виде транспортного механизма. Соответствующие значения выступают в качестве констант.
- Type – тип связи между имеющимися конечными точками. Обычно Sock_Stream применяется для протоколов, ориентированных на непосредственное соединение. Sock_Dgram – без «подключения».
- Protocol – чаще всего это – нуль. Он применяется для идентификации варианта протокола в пределах типа и домена.
- Hostname. Идентификатор сетевого интерфейса.
- Port – каждый сервер слушает клиентов, которые вызывают один или несколько портов. Порт может быть номером Fixnum, строчкой с номером портал или именем службы.
Теперь стоит выяснить, что собой представляет модуль сокета. Эта информация пригодится как новичкам, так и опытным программистам.
О модуле socket
Для того, чтобы создать сокет, требуется использовать функцию под названием socket.socket() через модуль socket. У него такой синтаксис:
А вот описание имеющихся параметров:
- _family – AF_UNIX или AF_INET;
- _type – Sock_Stream или Sock_Dgram;
- protocol – обычно не прописывается, по умолчанию – 0.
При наличии объекта «со кет» можно задействовать функции для клиентского или серверного programming.
Подключение сервера
Вот методы, которые помогут подключить сервер:
- s.bind – связка адреса сокетом;
- s.listen – установка и запуск прослушивателя TCP;
- s.accept – пассивное принятие TCP-клиентского соединения, ожидая блокировки.
У сокета есть метод s.connect. Он активно проводит инициирование подключения к серверу TCP.
Общие методы
Каждый socket может использовать такие общие methods:
- s.recv – получение сообщения;
- s.send – передача текста;
- s.recvfrom – получение сообщения UDP;
- s.sendto – передача текста UDP;
- s.close – закрытие socket;
- socket.gethostname – возврат имени хоста.
Теперь, когда понятия import socket, а также client, server и print разобраны, можно взглянуть на пример элементарного чата на Питоне. Это – network приложение.
Пример чата
Сначала требуется написать серверную часть. А именно – то, что принимает соединение. Пример – по порту 5050. Сначала осуществляется подключение:
Далее – непосредственное создание в коде:
Нужно связать рассмотренный ранее компонент с интерфейсом и портом:
Теперь – создать средство принятия сообщений и их отправки:
А вот клиентская часть:
Остается настроить шифрование. Стоит прибегнуть к самому простому варианту – алгоритм XOR. Его ключевая идея – если есть некоторая величина, есть некий ключ шифрования, то можно через него зашифровать исходные электронные материалы. Для этого побитно применяется операция XOR.
В виде кода это выглядит так:
Теперь остается лишь соединить все части кода и посмотреть на получившийся результат. Пример элементарен и примитивен, но для новичков он отлично подходит.
Вот туториалы, которые помогут лучше разобраться в рассмотренной тематике. А специализированные компьютерные дистанционные курсы дадут наиболее развернутую информацию по интересующему направлению.