Russian Qt Forum
Ноябрь 23, 2024, 22:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Multicast в FreeBSD  (Прочитано 2805 раз)
RaZeR
Гость
« : Август 09, 2011, 14:31 »

Здравствуйте.

Нашел в инете примеры по использованию multicast в Qt. Под виндой все прекрасно работает, попытался перенести под FreeBSD, прием сообщений все также прекрасно работает, а при попытке отправки выдает:
Код:
qDebug("error() %d\n", udpSock->error());
qDebug("Error: %s\n", qPrintable(udpSock->errorString()));
qDebug("bytes written %d", bytesWritten);
Цитировать
error() 7
Error: Unable to send a message
bytes written -1

Код:
//инициализация
//#define _WIN_
#define _FREEBSD_

#ifdef _WIN_
#include <ws2tcpip.h>
#include <winsock2.h>
#endif

#ifdef _FREEBSD_
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#endif

---------------------------------------------------------------------------------
UDP::UDP(char *MULTICAST_IP, int MULTICAST_PORT)
{
#ifdef _DEBUG_
    qDebug("Create UDP Socket\n");
#endif

    addrIP.setAddress(MULTICAST_IP);
    addrPort = MULTICAST_PORT;

    udpSock = new QUdpSocket(this);
    bool state = udpSock->bind(QHostAddress::Any, addrPort, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);

    struct ip_mreq mcast;
    int opt = 1;                                        // 0, если на собственный адрес отправлять не нужно
    int ttl = 1;
    int sd = udpSock->socketDescriptor();
    memset(&mcast, 0, sizeof(struct ip_mreq));
    mcast.imr_multiaddr.s_addr = inet_addr(qPrintable(addrIP.toString()));
    mcast.imr_interface.s_addr = htonl(INADDR_ANY);
    setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (const char *)&opt, sizeof(int));
    setsockopt(sd, IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&ttl, sizeof(ttl));
    setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&mcast.imr_interface.s_addr, sizeof(mcast.imr_interface.s_addr));
    setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mcast, sizeof(mcast));

    if(udpSock->socketDescriptor() == -1 || !state)
    {
        delete udpSock;
        return;
    }

    connect(udpSock, SIGNAL(readyRead()), this, SLOT(recv_UDPData()));
}

Код:
//отправка
int UDP::send_UDPData(char *buf, int size)
{
    QByteArray data = QByteArray(buf, size);

#ifdef _DEBUG_
    qDebug("Data: %s", data.data());
#endif

    bytesWritten = udpSock->writeDatagram(data, addrIP, addrPort);

#ifdef _DEBUG_
    qDebug("error() %d\n", udpSock->error());
    qDebug("Error: %s\n", qPrintable(udpSock->errorString()));

    qDebug("bytes written %d", bytesWritten);
    qDebug("Send UDP Compleate\n");
#endif

    return bytesWritten;
}

Кто-нибудь может подсказать, в чем может быть проблема с отправкой мультикаст пакета?
Qt 4.7, FreeBSD 8
« Последнее редактирование: Август 09, 2011, 14:54 от RaZeR » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 20.