Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > настройка сокета для отправки на групповой адрес


Автор: petlyura 15.2.2013, 11:13
Код
WSADATA data;
  sockaddr_in addr;
  WSAStartup(0x0101, &data); 


  char name[40];
  int error = gethostname(name, sizeof(name));


  SocketSend = socket(AF_INET, SOCK_DGRAM, 0);
  setmem(&addr, sizeof(addr), 0);
  addr.sin_family = AF_INET;

  addr.sin_port = htons(RemotePort);
  addr.sin_addr.S_un.S_addr = INADDR_ANY;



  struct ip_mreq mcast;

  mcast.imr_multiaddr.s_addr = inet_addr(Address.c_str());
  mcast.imr_interface.s_addr = INADDR_ANY;





  int optval = 1; 
  error = setsockopt(SocketSend, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&optval, sizeof(optval));

  int optval1 = 1; 
  error = setsockopt(SocketSend, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&optval1, sizeof(optval1));

  error = setsockopt(SocketSend, IPPROTO_IP, IP_MULTICAST_IF, (char*)& mcast.imr_interface.s_addr, sizeof( mcast.imr_interface.s_addr));

    
  error = setsockopt(SocketSend, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast));


в общем пакет отправляется и доходит до получателя, если IP-шник в стиле 192.168.Х.Х, etc. Но мне нужно для multicast-адреса 224.0.0.222 (пример) и тут беда, пакет где-то теряется. сниффером слушаю порт. В первом случае видит, во втором - нет :(
что в мультикаст нужно настроить, чтобы работало? зы. может, даже не тут проблема?
плиз, хелп ми, сетевые маги Винграда  smile

спасибо  smile 

Автор: feodorv 15.2.2013, 20:32
http://support.microsoft.com/kb/131978/ru

Автор: petlyura 25.2.2013, 17:13
Цитата(feodorv @ 15.2.2013,  20:32)
http://support.microsoft.com/kb/131978/ru

спасибо большое, но почему-то не работает. мой сверху код не отличается от того, что по ссылке. значение TTL я менял. 
отправка пакета осуществляется так:
Код
  sockaddr_in addr;
  setmem(&addr, sizeof(addr), 0);
  addr.sin_family = AF_INET;
  addr.sin_port = htons(RemotePort);
  
  addr.sin_addr.S_un.S_addr = inet_addr(Address.c_str());

  sendto(SocketSend, buf, len, 0, (sockaddr*)&addr, sizeof(sockaddr_in));



зы. Address - "224.0.0.222"


Автор: feodorv 27.2.2013, 18:44
Цитата(petlyura @  25.2.2013,  18:13 Найти цитируемый пост)
Address - "224.0.0.222"

Цитата

A multicast router does not forward multicast datagrams with destination addresses between 224.0.0.0 and 224.0.0.255, inclusive, regardless of their TTLs. This particular range of addresses is reserved for the use of routing protocols and other low-level topology discovery or maintenance protocols, such as gateway discovery and group membership reporting


Добавлено через 9 минут и 6 секунд
Советую также заглянуть http://www.sockets.com/ch16.htm#Multicast...

Автор: petlyura 4.3.2013, 10:35
Цитата(feodorv @ 27.2.2013,  18:44)
Цитата(petlyura @  25.2.2013,  18:13 Найти цитируемый пост)
Address - "224.0.0.222"

Цитата

A multicast router does not forward multicast datagrams with destination addresses between 224.0.0.0 and 224.0.0.255, inclusive, regardless of their TTLs. This particular range of addresses is reserved for the use of routing protocols and other low-level topology discovery or maintenance protocols, such as gateway discovery and group membership reporting


Добавлено @ 18:53
Советую также заглянуть http://www.sockets.com/ch16.htm#Multicast...

в итоге победил. на 224.0.0.222 отправляется нормально все smile

проблема оказалась здесь
Код
unsigned long ad = inet_addr(AddressSource.c_str()); // тут у меня что-то стандартное а-ля "192.168.Х.Х"
  setsockopt(SocketSend, IPPROTO_IP, IP_MULTICAST_IF, (char *)&ad, sizeof(ad));

надо было указывать адрес источника, откуда пакет отправляется. Зачем, я до конца не понял, но получилось и то рад, а то стопорнулся проект у меня из-за этого

Спасибо, feodorv, за поддержку! 

Тема закрывается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)