Задать вопрос
Ответы пользователя по тегу Компьютерные сети
  • Как передавать много сообщений через Socket?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Без кода сказать можно мало что. Если есть возможность залить на гитхаб, то шансов стало бы больше. Есть 3 подозрительных момента:
    Для каждого сообщения создаётся новый объект SocketOutputStream

    А нужно ли это? Почему бы не использовать этот stream все время пока живет сокет?
    создание SocketOutputStream окружено Poco:Mutex

    Попадает ли непосредственно запись в стрим и flush(деструктор) под этот mutex?
    использую классы SocketOutputStream, чтобы избавиться от ручного управления буферами, хвоставми и т.д. и т.п.

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

    По отладке сетевого кода могу посоветовать логирование вместо отладчика.
    Ответ написан
  • Как реализовать peer-to-peer технологию?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Программировать на чистых сокетах дело достаточно трудоемкое. Кроме того, что вам приходится работать на достаточно низком уровне, для обеспечения их неблокирующей работы(например при ожидании данных от другого клиента) надо использовать или потоки или poll/select.
    Хорошим выходом может стать использования обертки, например из Qt. Так вы получите кросплатформенный код с меньшими затратами. Стоит также взглянуть на более высокоуровневые варианты, например ZeroMQ (не знаю как у них с p2p, но для общения между 2 клиентами это может упростить жизнь).
    В простейшем случае для уведомления о своем присутствии клиент рассылает broadcast udp пакеты с информацией о себе. Основная проблема такого подхода, что такие пакеты будут зарезаны ближайшим маршрутизатором (наивно полагать что нам дадут разослать пакет каждому пользователю интернета). Поэтому такой подход работает только в простой локальной сети. Bittorent умеет хранить информацию децентрализовано, но для первоначального подключения необходимо знать адрес хотя бы одного подключенного участника.
    После того как вы знаете адрес другого клиента вы можете установить с ним непосредственное соединение. На самом деле тут тоже не все так просто. Если он находится за NAT, а до распространения ip-v6 для большинства(?) клиентов так оно и есть, то придется что-то придумывать. По этой теме можно поискать по запросу "p2p over NAT".
    Ответ написан
    Комментировать