crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Multicast в FreeBSD
RaZeR
  опции профиля:
сообщение 9.8.2011, 14:54
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 9.8.2011
Пользователь №: 2796

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Нашел в инете примеры по использованию 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2020, 17:32