2014-12-03 2 views
0

У меня есть клиентский и серверный программы UDP. Поскольку я пытаюсь подключить более одного клиента для подключения к серверу с использованием разных компьютеров, я получаю положительный ответ, то есть я могу подключить свой сервер к нескольким клиентам.Более 1 клиент на эхо-сервере udp

Итак, на мой вопрос, когда я нарушаю ctrl + c, чтобы разбить сервер, я хочу напечатать IP-адреса всех клиентов, связанных с сервером в то время. Как это сделать? Я знаю, как печатать IP-адрес, когда один клиент подключен к серверу, но как мне печатать для нескольких клиентов?

+1

Есть несколько проблем с тем, что вы хотите; Прежде всего, «перегрузка» «CTRL-C», чтобы сделать то, что не должно делать, сделает вашу программу очень странной и как вы отмените/убьете программу? Во-вторых, поскольку это UDP, у вас на самом деле нет * подключений * от клиентов, но вы все равно можете сохранить список всех клиентов, которые взаимодействуют с сервером. Что касается ловушки 'CTRL-C', выполните поиск терминов * signal * и * break *. –

+0

UDP без установления соединения. В UDP нет концепции «клиент, подключенный к серверу». Вы можете печатать/хранить каждый клиентский IP-адрес при каждом обмене UDP, любое сообщение UDP содержит информацию отправителя (IP + -порт). Если вы используете 'recvfom', есть параметр, который может быть заполнен этими данными. См .: http://linux.die.net/man/2/recv –

ответ

1

Для этого не существует встроенного механизма. UDP является бесконтактным, поэтому сокеты не «помнят», с кем они общались.

Чтобы распечатать все клиенты, с которыми связывался ваш сервер, вам необходимо их отслеживать самостоятельно. Вам, вероятно, понадобится набор (вы можете найти некоторые версии с открытым исходным кодом наборов в C, если вы не хотите их строить самостоятельно), или даже простой связанный список может сделать, в зависимости от вашего дела. После каждого recvfrom добавьте клиента в список set/list. После завершения каждого запроса удалите клиента из набора/списка.

Затем вам нужно настроить обработчик для реагирования на^C. В нем вы просто печатаете набор/список.

Смежные вопросы