Сервер вещает только первому клиенту - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь передать сообщение с сервера всем клиентам, но только один клиент получает сообщение.

Я хочу запустить этот сервер и два или более экземпляров этого клиента (взято из Donahoo, Calvert, "Сокеты TCP / IP в C", 1e; я могу вставить код на этот вопрос по запросу).

Программы работают нормально с одним клиентом, но при запуске двух клиентов только один (первый) когда-либо получает сообщение, тогда как второй экземпляр просто застревает (на bind).

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

$ ./BroadcastSender localhost 1337 hey &

Что касается клиентов, я попробовал два варианта, первый:

$ ./BroadcastReceiver 1337 & ./BroadcastReceiver 1337 &

Во втором варианте я добавил while (1) {} после close(sock) и затем запустил как:

$ ./BroadcastReceiver 1337 &
$ ./BroadcastReceiver 1337 &

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

Я неправильно запускаю сервер / клиентов или в коде чего-то не хватает? Я новичок в сокетах, поэтому я не вижу, есть ли что-нибудь, скажем, в коде сервера, говорящем: «Я собираюсь транслировать только одному клиенту».

Не могли бы вы дать мне несколько указателей в правильном направлении? Есть и другие вопросы и ответы о вещании, но я не нашел ни одного, который бы касался этой конкретной проблемы. Спасибо.

1 Ответ

0 голосов
/ 11 ноября 2018

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

Командная строка при запуске 2 процессов на 2 машинах должна выглядеть примерно так:

$ ./BroadcastSender 127.0.255.255 1337 hey &

, когда 127.0.255.255 - ваша маска подсети

--- редактировать (спасибо @ Джереми) ---

вы также можете привязать два сокета к одному и тому же порту UDP, используя setsockopt с флагами SO_REUSEADDR / SO_REUSEPORT

...