2015-04-27 1 views
0

Это скорее концептуальная путаница. Я делаю групповой сервер, который просто перекликается назад дейтаграммой received.Here Это кодМногоадресный эхо-сервер

while (1) { 
     cnt = recvfrom(sock, message, sizeof(message), 0, 
       (struct sockaddr *) &addr, &addrlen); 
     //printf("%d \n",cnt); 
     if (cnt < 0) { 
      perror("recvfrom"); 
      exit(1); 
     } else if (cnt == 0) { 
      break; 
     } 
     printf("%s: message = \"%s\"\n", inet_ntoa(addr.sin_addr), message); 
     addr.sin_addr.s_addr = inet_addr(EXAMPLE_GROUP); 
     cnt = sendto(sock, message, sizeof(message), 0, 
      (struct sockaddr *) &addr, addrlen); 
     if (cnt < 0) { 
      perror("sendto"); 
      exit(1); 
     } 

    } 

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

+1

Серверу не требуется присоединяться к группе многоадресной передачи. Делают только клиенты. – Barmar

+0

, если вы хотите использовать многоадресную рассылку для отправки на сервер, а также для клиентов, используйте разные группы для каждого направления. – Barmar

+0

@Barmar Мне нужно реализовать клиент и сервер в одном файле. Не могли бы вы рассказать. Спецификация выглядит так: сервер отправляет дейтаграмму каждые 15 секунд, он подсчитывает количество хостов в многоадресной рассылке (работает одна и та же программа) при получении своих ответов до 5 секунд, когда каждый процесс перехватывает полученную датаграмму. –

ответ

0

Одним из вариантов является то, что сказала EJP, чтобы отключить групповую кольцевую проверку так, что отправляющий аппарат не получает копию своего собственного многоадресного пакета обратно. Однако имейте в виду, что если вы это сделаете, вы не сможете тестировать с клиентами и сервером все запущенные на том же компьютере больше, начиная с IP_MULTICAST_LOOP is implemented at the IP routing level.

Второй возможный вариант, чтобы избежать бесконечных циклов пакетов, заключался в том, чтобы эхо-сервер отправлял свои пакеты ответа в другую группу многоадресной передачи, чем ту, которую он прослушивает (или даже посылает свои ответы через одноадресную, а не многоадресную рассылку; сервер может вызвать recvfrom(), чтобы узнать адрес источника одноадресной рассылки любого пакета, который он получает, поэтому ему легко узнать, куда отправить ответный пакет обратно)

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

1

Вам необходимо отключить групповую кольцевую проверку через setsockopt().