Здравствуйте.
Нашел в инете примеры по использованию 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