На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Широковещательные UDP , как отправить/получить?
      Всем привет!

      Нужно сделать удаленное управление програмой которая запущена на другом компе.
      Хочу избежать введения адреса компа. Для этого хочу посталь широковещательное вещание.
      Комп на котором запущена программа будет посылать свой IP.
      Другой комп будет слушать и принимать нужные параметры для подключения. И после этого подключаться.

      Итак, надо послать широковещательное сообщение.

      Делаю так:
      ExpandedWrap disabled
        #define BUFLEN 512  //Max length of buffer
        #define PORT 7125   //The port on which to listen for incoming data
        #define SERVER "239.254.1.2"
         
            int iResult = 0;
            WSADATA wsaData;
            iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
         
         
            int mySocket = socket(AF_INET, SOCK_DGRAM, 0);
            if (mySocket < 0)
            {
                int n = 0;
            }
         
            int enableBroadcast = 1;
            if (setsockopt(mySocket, SOL_SOCKET, SO_BROADCAST, (char*)&enableBroadcast, sizeof(enableBroadcast)) < 0)
            {
                int n = 0;
            }
            sockaddr_in myAddress;
            myAddress.sin_family = AF_INET;
            myAddress.sin_port = htons(67);//вешаем на порт
            myAddress.sin_addr.s_addr = htonl(INADDR_ANY);
         
            if (bind(mySocket, (sockaddr*)&myAddress, sizeof(myAddress)) < 0)
            {
                int n = 0;
            }
            sockaddr_in to;
            to.sin_family = AF_INET;
            to.sin_port = htons(PORT);
            to.sin_addr.s_addr = inet_addr(SERVER);//htonl(INADDR_BROADCAST);
            to.sin_addr.S_un.S_addr = inet_addr(SERVER);
         
            socklen_t toLen = sizeof(to);
            char *mess = "trololo";
            while(1)
            {
                int n = sendto(mySocket, mess, 7, 0, (sockaddr*)&to, toLen);
         
                Sleep(500);
            }



      Получение пробую сделать на другом компе:

      ExpandedWrap disabled
        #define BUFLEN 512  //Max length of buffer
        #define PORT 7125   //The port on which to listen for incoming data
        #define SERVER "239.254.1.2"
         
         
            struct sockaddr_in si_other;
            int s, slen = sizeof(si_other);
            char buf[BUFLEN];
            char message[BUFLEN];
            WSADATA wsa;
         
            //Initialise winsock
            printf("\nInitialising Winsock...");
            if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
            {
                printf("Failed. Error Code : %d", WSAGetLastError());
                exit(EXIT_FAILURE);
            }
            printf("Initialised.\n");
         
            //create socket
            if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
            {
                printf("socket() failed with error code : %d", WSAGetLastError());
                exit(EXIT_FAILURE);
            }
         
            //setup address structure
            memset((char *)&si_other, 0, sizeof(si_other));
            si_other.sin_family = AF_INET;
            si_other.sin_port = htons(PORT);
            si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
         
            //start communication
            while (1)
            {
                printf("Enter message : ");
         
                //receive a reply and print it
                //clear the buffer by filling null, it might have previously received data
                memset(buf, '\0', BUFLEN);
                //try to receive some data, this is a blocking call
                if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)
                {
                    printf("recvfrom() failed with error code : %d", WSAGetLastError());
                    DWORD dw = WSAGetLastError();
                    int n = 0;
                }
         
         
            }
         
            closesocket(s);
            WSACleanup();


      Слать вроде шлет, но получить не получается.


      Помогите плиз кто может!
        Цитата Oleg_Smith @
        #define SERVER "239.254.1.2"

        IP у сервера точно такой? Думаю, проблема в этом. Широковещательные UDP работают только в пределах одной локалки. Первый же шлюз их не пропустит.
          Широковещательный запрос не шлется на один сервер-комп.
          Он шлется ВСЕМ компам данной ЛВС
          И адрес этот 255.255.255.255 - т.е.INADDR_BROADCAST, если вы шлете только в пределах своей локалки.
          Если вы шлете в чужую сеть, где есть комп с адресом 239.254.1.2
          у вас должен быть адрес отсылки 239.254.1.255.
          Причем не факт,что пограничный маршрутизатор его выпустит...
            1. Работать все это будет только в пределах одного широковещательного домена.
            2. Адрес 239.254.1.2 мультикастовый, и прибиндить его плохая идея.
            3. Как правильно сказал Олег, вам нужен броадкаст, то бишь слать надо на dst ip INADDR_BROADCAST, все хосты широковещательного домена получат этот пакет.
            Цитата
            Причем не факт,что пограничный маршрутизатор его выпустит...

            Не выпустит, иначе бы интернеты тотчас легли, от кучи вирья срущего броадкастом.
              Цитата Gonarh @
              Не выпустит, иначе бы интернеты тотчас легли, от кучи вирья срущего броадкастом.

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

              Цитата Gonarh @
              Адрес 239.254.1.2 мультикастовый, и прибиндить его плохая идея.

              Согласен, плюс за внимательность :yes:
              Цитата
              Все адреса в диапазоне 224.0.0.0 – 238.255.255.255 предназначены для использования групповой передачей в масштабе Интернет.
              Адреса вида 239.Х.Х.Х зарезервированы для внутреннего использования в частных сетях. Т.е. это специальный адрес, по сути представляющий номер группы в частной сети (т.е. не видимой из Интернета)

              А все мультикастовые адреса - это ВАЩЕ не IP-адреса, а просто 32-битный числовой идентификатор номера группы.
              Так что совсем непонятно, зачем топикстартеру этот адрес нужен.
              Для групповой рассылки нужен IGMP.
              Похожая тема уже была однажды на форуме
              открывается неизвестный порт
              Сообщение отредактировано: Oleg2004 -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0241 ]   [ 16 queries used ]   [ Generated: 11.12.24, 12:34 GMT ]