Название: Multicast в FreeBSD
Отправлено: 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
|