Семинар 5: Работа с сокетами

Сразу задание

Сегодня тот редкий случай, когда вам не обязательно использовать GNS3, всё можно сделать на своей машине.

В ходе сегодняшнего семинара вам нужно написать клиент-серверное приложения, использующее механизм сетевых сокетов. Не так важно, что именно будет делать ваше приложение, можно взять за основу текстовый чат, а можно проявить креативность.

Для написания можно пользоваться любым языком программирования, если он позволяет взаимодействовать с сокетами напрямую, например, C/C++, python - подойдут, а Javascript - нет.

Приложение должно использовать как протокол UDP, так и TCP (не одновременно). Просто предусмотрите 2 режима запуска (ну или 2 приложения написать).

Единственная сложность, с которой придётся разобраться - это что в TCP данные передаются как поток, не как отдельные сообщения. Это значит, что ваши данные могут разбиваться в произвольных местах. Более того, в таком виде они могут отдаваться в ваше приложение. Например, вы хотите передать число, для этого передаёте int32, т.е. 4 байта, а прийти может только первые 2. На принимающей стороне нужно предусмотреть обработку такой ситуации. Даже если вы будете писать чат, всё равно границы сообщений должны быть, т.е. пользователь не должен видеть два сообщения (визуально), если было отправлено одно.

В качестве подсказки пользуйтесь схемами с лекции:

Схема работы с TCP

Подсказка по TCP с лекции

Схема работы с UDP

Подсказка по UDP с лекции

netcat

Это инструмент, который поможет вам в тестировании. Существуют немного отличающиеся версии, поэтому обязательно посмотрите справку того, что вы используете.

Этот инструмент позволяет передавать данные поверх TCP или UDP. При этом, при использовании TCP может запускаться как клиент (подключаясь к серверу) или как сервер (занимая порт и выводя данные от подключенного клиента). Всё, что будет подано на вход будет отправлено, всё, что будет получено, будет выведено на стандартный вывод. Этим можно пользоваться, перенаправляя эти 2 потока. Например так: python3 -c "print('\x00\x00\x00\x03AAA\n')" | nc -l 192.168.1.111 45666 | hexdump -C.

Вам нужно будет разобраться как выбрать режим работы: TCP/UDP и клиент/сервер, как указать, куда подключаться и какой endpoint (пару IP адрес + порт) занимать (последнее нужно серверу).