Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не принимаются broadcast пакеты, сокеты в Linux 
:(
    Опции темы
Proger89
Дата 23.5.2010, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток.
У меня есть код на С с использованием сокетов, который ожидает входящие дейтаграмы на определенном порту.
Вот он:
Код

#define UDP_PORT   8921
...
void *udp_thread_func(void* p) {
    struct sockaddr_in si_me, si_other;
    int sock_fd, slen = sizeof (si_other);
    char buf[UDP_BUFLEN];

    if ((sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
        PANIC("socket");

    memset((char *) & si_me, 0, sizeof (si_me));-
    si_me.sin_family = AF_INET;
    si_me.sin_port = htons(UDP_PORT);
    si_me.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(sock_fd, (struct sockaddr *) & si_me, sizeof (si_me)) == -1)
        PANIC("bind");


    for (EVER) {
        if (recvfrom(sock_fd, buf, UDP_BUFLEN, 0, (struct sockaddr *) & si_other, &slen) == -1)
            PANIC("recvfrom()");
        printf("Received packet from %s:%d\nData: %s\n\n",
                inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf);
         ...

    }
}

 Проблема в том, что когда я послыю броадкаст дейтаграмму, то recvfrom ничего не получает (блокиреутся  и бесконечно ждет).
Дейтаграмма приходит. Вот распечатка tcpdump-а:
Код

linux-lodi:/home/proger # tcpdump -i wlan0 udp port 8921
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 96 bytes
00:09:10.083971 IP 192.168.1.100.55026 > 255.255.255.255.8921: UDP, length 14
00:10:55.367671 IP 192.168.1.100.55026 > 255.255.255.255.8921: UDP, length 14
00:11:14.104317 IP 192.168.1.100.55026 > 255.255.255.255.8921: UDP, length 14



Код я посылаю из программы написаной на Qt/C++ вот код отсылки дейтаграммы:
Код

UDPService::UDPService(QWidget *parrent) : QWidget(parrent)
{
    m_pUDPsocket = new QUdpSocket;


}

void UDPService::startService() {
    QByteArray datagram = "client?address";

    m_pUDPsocket->writeDatagram(datagram.data(), datagram.size(),
                             QHostAddress::Broadcast, UDP_SERVER_PORT);
}


Помогите пожалуйста... В чем может быть проблема?
Заранее благодарен.
PM   Вверх
MAKCim
Дата 23.5.2010, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

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



установите SO_BROADCAST через setsockopt на сокете, принимающем пакеты


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Proger89
Дата 23.5.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я исправил код на следующий:
Код

void *udp_thread_func(void* p) {
    struct sockaddr_in si_me, si_other;
    int sock_fd, slen = sizeof (si_other);
    char buf[UDP_READ_BUFLEN];

    if ((sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
        PANIC("socket");

    
    memset((char *) & si_me, 0, sizeof (si_me));
    si_me.sin_family = AF_INET;
    si_me.sin_port = htons(UDP_PORT);
    si_me.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(sock_fd, (struct sockaddr *) & si_me, sizeof (si_me)) == -1)
        PANIC("bind");

    int val = 1;
    int res = setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val));

    for (EVER) {
        if (recvfrom(sock_fd, buf, UDP_READ_BUFLEN, 0, (struct sockaddr *) & si_other, &slen) == -1)
            PANIC("recvfrom()");

        printf("Received packet from %s:%d\nData: %s\n\n",
                inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf);

    }
}


но результат тот же - пакетики не принимаются.
Что я делаю не так?
PM   Вверх
Proger89
Дата 25.5.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Все оказалось очень просто.
Нужно было отключить фаервол. Всем спасибо за участие.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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