Двусторонняя связь в программировании сокетов с использованием C - PullRequest
10 голосов
/ 25 июля 2011

У меня есть небольшое сомнение в программировании сокетов. Я могу отправить свои данные от клиента к серверу, и мой сервер обрабатывает данные. О / п обработанных данных, я хочу отправить обратно моему клиенту. Таким образом, мы можем «записать» данные обратно клиенту, используя тот же сокет. Я имею в виду, что сервер прослушивает порт перед тем, как принимать соединение и получать данные, поэтому мне нужно, чтобы мой клиент прослушивал какой-то другой порт (связывал его с другим сокетом) и заставлял сервер подключаться к этому сокету и передавать данные обратно. , Любой пример или объяснение или ссылки будут оценены. Заранее большое спасибо.

Ответы [ 5 ]

14 голосов
/ 25 июля 2011

Проверьте Руководство по сетевому программированию Beej Прежде всего.

Базовый сценарий соединения сервер / клиент выглядит следующим образом:

  • Сервер listen() с фиксированным портом с заданным сокетом.
  • Клиент connect() s к порту сервера; клиент получает сокет.
  • Сервер accept() s соединение, а accept() возвращает новый сокет для соединения.
  • (Сервер продолжает прослушивать исходный порт с исходным сокетом.)

Для конкретного соединения с клиентом сервер write() s подключается к новому сокету, который он получил при accept() входящем соединении. У занятого сервера будет много-много сокетов, но ему понадобится всего лишь 1025 * на один порт. Все соединения подключаются к этому одному порту, но стек сетевых протоколов операционной системы разделяет данные и делает их доступными для конкретного соединения.

11 голосов
/ 25 июля 2011

Вам не нужно новое гнездо.

Сокет - это дуплексное соединение, вы можете отправлять данные в обоих направлениях, и вы даже можете закрыть сокет в одном направлении (больше не хотите писать), но все же отправляете данные в другом направлении.

2 голосов
/ 12 ноября 2014

Технически это правильно, сокет является дуплексным, и вы можете отправлять данные в тот же сокет, из которого читаете:

   SOCKET s = socket()
   ... //Connect
   int size = receive(s,...);
   //make response 
   send(s, ...);

Но на практике это зависит от того, что вы собираетесь делать. Можно вывесить сокет, если у вас следующая ситуация:

  1. Процесс 1 отправляет очень большие данные (<100 КБ) через сокет за одну отправку работа </p>

  2. Процесс 2 получает данные от 1 порциями и отправляет небольшие пакеты 1 (~ 20b). Это не

    подтверждения, но некоторые внешние события. Ситуация переходит в видеовстречу, где буфер отправки 2 заполнен, и он прекращает отправку подтверждений 1. 2 и 1 висят в своих операциях отправки, делая тупик. В этом случае я бы рекомендовал использовать две розетки. Один для чтения, один для записи.

2 голосов
/ 25 июля 2011

Ваш сокет является двунаправленным, поэтому нет необходимости создавать другой сокет.Если вы не используете какое-либо промежуточное программное обеспечение, такое как Pub / Sub, нет необходимости создавать другой сокет для обеспечения двунаправленной связи.

1 голос
/ 01 ноября 2012

(поздний ответ, поэтому, в основном, для тех, кто приходит сюда за помощью)

Недавно я создал пример клиент-серверного приложения, которое близко следует Руководству Beej по сетевому программированию (которое также было рекомендовано KerrekСБ в своем ответе).Если вы ищете простой рабочий пример взаимодействия клиент / сервер, возможно, это поможет:

https://github.com/countvajhula/dummyclientserver

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...