Nano Hash - криптовалюты, майнинг, программирование

Передача управляющей информации между клиент-сервером при программировании сокетов в C

Я кодирую серверно-клиентское программирование на C с использованием API сокетов, где я пытаюсь отправить управляющую информацию клиенту для использования другого TCP-соединения. Всякий раз, когда сервер создает новый сокет (TCP), я хочу, чтобы он уведомлял клиента об использовании нового сокета для дальнейшей связи. В настоящее время я подумал об отправке пакета UDP клиенту для уведомления. Как только клиент получает пакет, он отправляет ACK обратно на сервер и в то же время переключается на другое TCP-соединение. Я хочу знать, лучше ли передавать управляющие данные по сети, кроме использования UDP, так как это ненадежно. Спасибо.

Я хотел бы уточнить, чего я пытаюсь достичь. Я собираюсь измерить такие параметры, как пропускная способность, задержка, окно приема и т. д. в качестве метрики для TCP-соединения IPv4 и IPv6. Основываясь на наблюдаемой производительности, я буду переключаться между двумя протоколами, которые обеспечивают лучшую производительность. Как только будет принято решение о переключении, я должен уведомить партнера (может быть клиентом или сервером в зависимости от типа пропускной способности, которую я измеряю). . Я начинаю с соединения IPv4 и одновременно открываю другое соединение — IPv6 для измерения пропускной способности и задержки.

Если соединение IPv6 обеспечивает лучшую производительность, мне нужно указать клиенту переключиться на IPv6. В этом случае оба соединения открыты для периодического мониторинга полосы пропускания для принятия решения о переключении. Итак, у меня есть два вопроса по этому аспекту. 1. Является ли хорошей идеей поддерживать два соединения одновременно. Я могу создать другое соединение только тогда, когда мне нужно измерить метрику, поскольку путь, пройденный между двумя машинами, вряд ли изменится. Если да, я могу передать управляющую информацию, используя другое TCP-соединение, чтобы сообщить клиенту о переключении. Таким образом я также могу измерить пропускную способность и уведомить клиента

Если у двух два TCP-соединения не очень хорошая идея, я могу использовать UDP для отправки управляющей информации. Я избегаю отправки управляющей информации о соединении, используемом для передачи фактических данных, поскольку это будет накладным. Мой код будет работать как промежуточное ПО для передачи данных, где приложение будет вызывать мои функции/макросы для передачи данных, а внутренний код позаботится об измерении пропускной способности и принятии решения о переключении. хочу добиться. Заранее благодарим за отзыв

06.12.2010

  • Как сервер взаимодействует с клиентом перед переключением? У них уже открыто существующее TCP-соединение? Возможно, вам следует подробнее рассказать об архитектуре — этот вопрос оставляет простор для воображения. Если у вас уже есть открытое TCP-соединение, вы можете использовать его для связи. Если вы разговариваете с новым клиентом, которого вы раньше не видели, UDP может работать, но чтобы справиться с ненадежностью, рассмотрите возможность ожидания ACK и, если он не будет получен в течение нескольких секунд, повторите его отправку. 06.12.2010
  • Похоже на повторную реализацию протокола FTP? 06.12.2010
  • Просто добавить. Когда я отправляю фактические данные по любому соединению, скажем, IPv4, я также буду измерять пропускную способность, используя те же данные для этого соединения. для IPv4 и другой для IPv6 сопоставимы. Здесь под пропускной способностью я подразумеваю пропускную способность, хотя существуют и другие методы измерения пропускной способности. Идея состоит в том, чтобы отправить минимальное количество пакетов для измерения пропускной способности. 08.12.2010

Ответы:


1

Обычная последовательность операций для прослушивающего TCP-сокета на стороне сервера:

int fd1 = socket(...);  // Create socket - assuming TCP, not UDP
bind(fd1, ...);         // Bind it to a local address
listen(fd1, ...);       // Set it in listen mode

int fd2;

while ((fd2 = accept(fd1, ...)) != -1)  // Accept an incoming connection
{
    ...communicate with client via fd2...
    close(fd2);         // When finished
}

close(fd1);

Теперь, когда вы получаете fd2, у него есть сокет с локальным эфемерным портом, отличным от порта, к которому подключен fd1 (исправление согласно EJP). Нет необходимости сообщать какую-либо конкретную информацию клиенту; реализация TCP/IP занимается этим за вас. У клиента будет сокет, подключенный к fd2, с портом (вероятно, эфемерным портом) на его машине, подключенной к серверу, и эфемерным портом сервера.

Дело в том, что завершенное соединение будет иметь уникальный 4-кортеж (IP-адрес клиента, порт клиента, IP-адрес сервера, порт сервера).

Когда дело доходит до обработки, существуют различные способы борьбы с ней. Вы можете использовать итеративный сервер, который обрабатывает один запрос, прежде чем обрабатывать любые другие. Или вы можете создать параллельный сервер одним из двух способов. Один из способов — это многопоточный сервер, где поток (из пула или вновь созданный для каждого входящего соединения) обрабатывает новый запрос, в то время как основной поток возвращается, чтобы принять новые входящие запросы. В качестве альтернативы вы создаете разветвляющийся сервер, на котором основной серверный процесс разветвляется, а дочерний процесс обрабатывает новое соединение, в то время как родительский процесс закрывает соединение и возвращается к прослушиванию следующего запроса на соединение.

06.12.2010
  • «... с другим локальным эфемерным портом». Нет. Это то же самое, что и прослушивающий порт. На стороне сервера не задействованы эфемерные порты. Поскольку 4-кортеж уникален, нет необходимости в новом порте на стороне сервера. В остальном правильно. 06.12.2010
  • Спасибо. accept() будет иметь такое же соединение, как IPv4. Пожалуйста, обратитесь к моим комментариям выше для краткого описания проблемы. Я собираюсь реализовать разные потоки в отличие от процессов (разветвления), поскольку они используют одно и то же адресное пространство и легко обмениваются данными между различными потоками, поскольку этот мой код будет выступать в качестве среднего уровня для приложений. 08.12.2010
  • @user369823 user369823: вы можете отредактировать свой вопрос — и лучше сделать это, чем добавлять три довольно полных комментария, объясняющих, что вы хотите сделать. 08.12.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..