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

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

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

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

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

1 Ответ

1 голос
/ 06 декабря 2010

Обычная последовательность операций для прослушивающего сокета 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-адрес сервера, порт сервера).

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

...