Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прием и передача мультикастовых сообщений. Через один и тот же сокет. 
:(
    Опции темы
GL_basik
Дата 20.12.2006, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



Теоритически возможно передавать и принимать мультикастовые сообщения через один и тот же сокет. Я сделал обычный сокет, настроил его для работы по мультикасту. Теперь столкнулся с проблемой. Если я даю команду на прием сообщения, то выполнение программы останавливается и ожидает пока что-нибудь придет. А мне необходимо чтоб выполнение программы не останавливалось. И, если ничего не пришло, снова шла передача. Как можно решить данную задачу?
Да привожу пример кода:

Код

  //описание переменных 
  int iOptVal = 64;
  char RecvBuf[1024];

  TCHAR szError[100];                          // Error message string
  SOCKET Sock = INVALID_SOCKET;     // Datagram window socket


  struct ip_mreq mreq;                          // Used in adding or dropping
                                                             // multicasting addresses

  SOCKADDR_IN source_sin,                 // Source socket address
                          dest_sin;                    // Destination socket address

  WSADATA WSAData;                           // Contains details of the
                                                             // Winsock implementation

  // Initialize Winsock
  char iResult = WSAStartup(MAKEWORD(2,2), &WSAData);
  if (iResult != 0)
  {
    ShowMessage("Ñåòü íå ðàáîòàåò");
    return;
  }

  //создаем сокет
  if ((Sock = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
  {
    ShowMessage("Allocating socket failed!");
    return;
  }

  //источник
  source_sin.sin_family = AF_INET;
  source_sin.sin_port = htons (SOURCE_PORT);
  source_sin.sin_addr.s_addr = htonl (INADDR_ANY);

  // Associate the source socket's address with the socket, Sock.
  if (bind (Sock, (struct sockaddr FAR *) &source_sin,
            sizeof (source_sin)) == SOCKET_ERROR)
  {
    ShowMessage("Binding socket failed!");
    closesocket (Sock);
    return;
  }
  //время жизни пакетов TTL
  if (setsockopt (Sock,
                  IPPROTO_IP,
                  IP_MULTICAST_TTL,
                  (char FAR *)&iOptVal,
                  sizeof (int)) == SOCKET_ERROR)
  {
    ShowMessage("setsockopt failed!");
    closesocket (Sock);
    return;
  }

  // Join the multicast group from which to receive datagrams.
  mreq.imr_multiaddr.s_addr = inet_addr (DEST_MCAST);
  mreq.imr_interface.s_addr = INADDR_ANY;
  if (setsockopt (Sock,
                  IPPROTO_IP,
                  IP_ADD_MEMBERSHIP,
                  (char FAR *)&mreq,
                  sizeof (mreq)) == SOCKET_ERROR)
  {
    ShowMessage("setsockopt failed!");
    closesocket (Sock);
    return;
  }

  //мультикастовая группа
  dest_sin.sin_family = AF_INET;
  dest_sin.sin_port = htons (DESTINATION_PORT);
  dest_sin.sin_addr.s_addr = inet_addr (DEST_MCAST);

  int iRecvLen = sizeof (source_sin);

  do //собственно принимаем и передаем, пока поток не остановлен
  {
    if (Form1->Multi_Param.send_flag)
    {
      Form1->Multi_Param.send_flag=false;
      // Send a message to the multicasting address.
      if (sendto (Sock,
                  Form1->Multi_Param.multi_mess,
                  strlen (Form1->Multi_Param.multi_mess),
                  0,
                  (struct sockaddr FAR *) &dest_sin,
                  sizeof (dest_sin)) == SOCKET_ERROR)
      {
        ShowMessage("sendto failed!");
        closesocket (Sock);
        return;
      }
    }
    else
    {
      // Receive data from the multicasting group server.
//Вот здесь программа останавливается и ждет пока придет сообщение!!!
      int Errnum=recvfrom (Sock,
                           RecvBuf,
                           100,
                           0,
                           (struct sockaddr FAR *) &source_sin,
                           &iRecvLen);
      if (Errnum == SOCKET_ERROR)
      {
        ShowMessage("recvfrom failed!");
        closesocket (Sock);
        return;
      }
    }
  }
  while (!Terminated); //óáèëè ïðèëîæåíèå Æ-(
  // Disable sending on Sock before closing it.
  shutdown (Sock, 0x01);
  // Close Sock.
  closesocket (Sock);
  WSACleanup();

PM MAIL   Вверх
GL_basik
Дата 21.12.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



Что никто ничего не посоветует?
Видимо придется организовывать еще один поток и настроить там асинхронный сокет на прием.... 
PM MAIL   Вверх
dumb
Дата 22.12.2006, 02:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



Цитата(GL_basik @  21.12.2006,  16:25 Найти цитируемый пост)
еще один поток и настроить там асинхронный сокет

масло масляное.

в "еще одном потоке" можно уже обычный блокирующий сокет делать.
либо твой изначальный сокет сделать неблокирующим.
и еще кучка вариантов...
PM MAIL   Вверх
GL_basik
Дата 22.12.2006, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



dumb, я, по-моему, и спрашивал как 
Цитата(dumb @  22.12.2006,  02:46 Найти цитируемый пост)
изначальный сокет сделать неблокирующим.

но что-то никто не ответил....

PM MAIL   Вверх
dumb
Дата 22.12.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 32
Всего: 158



GL_basik, есть такое чУдное средство - поиск.

Код

int value = 1;
ioctlsocket( sock, FIONBIO, &value);


при этом немного меняется схема работы с сокетом, так что советую воспользоваться таки поиском: инфы и примеров - море.
PM MAIL   Вверх
GL_basik
Дата 25.12.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 5.9.2006

Репутация: нет
Всего: нет



dumb, Спасибо за подсказку, теперь я знаю в каком напрвлении искать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0725 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.