QNX and BLACKBERRY support
UDP Multicast for QNX git-svn-id: svn://db.shs.com.ru/pip@133 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -23,7 +23,11 @@
|
||||
#ifdef QNX
|
||||
# include <net/if_dl.h>
|
||||
# include <hw/nicinfo.h>
|
||||
# include <sys/dcmd_io-net.h>
|
||||
# ifdef BLACKBERRY
|
||||
# include <netinet/in.h>
|
||||
# else
|
||||
# include <sys/dcmd_io-net.h>
|
||||
# endif
|
||||
#endif
|
||||
#ifdef WINDOWS
|
||||
# include <io.h>
|
||||
@@ -333,11 +337,15 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) {
|
||||
return true;
|
||||
}
|
||||
PIFlags<Parameters> params = parameters();
|
||||
#ifndef QNX
|
||||
//#ifndef QNX
|
||||
if (!params[Broadcast])
|
||||
;//piCoutObj << "Warning: \"Broadcast\" parameter not set, \"joinMulticastGroup(\"" << group << "\")\" may be useless!";
|
||||
parseAddress(path(), &ip_, &port_);
|
||||
#ifndef QNX
|
||||
struct ip_mreqn mreq;
|
||||
#else
|
||||
struct ip_mreq mreq;
|
||||
#endif
|
||||
memset(&mreq, 0, sizeof(mreq));
|
||||
#ifdef LINUX
|
||||
//mreq.imr_address.s_addr = INADDR_ANY;
|
||||
@@ -345,8 +353,13 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) {
|
||||
const PIEthernet::Interface * ci = il.getByAddress(ip_);
|
||||
if (ci != 0) mreq.imr_ifindex = ci->index;*/
|
||||
#endif
|
||||
#ifndef QNX
|
||||
if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY;
|
||||
else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii());
|
||||
#else
|
||||
if (params[PIEthernet::Broadcast]) mreq.imr_interface.s_addr = INADDR_ANY;
|
||||
else mreq.imr_interface.s_addr = inet_addr(ip_.dataAscii());
|
||||
#endif
|
||||
/*#ifndef WINDOWS
|
||||
PIEthernet::InterfaceList il = interfaces();
|
||||
const PIEthernet::Interface * ci = il.getByAddress(ip_);
|
||||
@@ -361,7 +374,20 @@ bool PIEthernet::joinMulticastGroup(const PIString & group) {
|
||||
if (params[PIEthernet::MulticastLoop]) ethSetsockoptInt(sock, IPPROTO_IP, IP_MULTICAST_LOOP);
|
||||
applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL());
|
||||
if (!mcast_groups.contains(group)) mcast_groups << group;
|
||||
#endif
|
||||
//#else
|
||||
// parseAddress(path(), &ip_, &port_);
|
||||
// struct ip_mreq mreq;
|
||||
// memset(&mreq, 0, sizeof(mreq));
|
||||
// mreq.imr_interface.s_addr = inet_addr(ip_.dataAscii());
|
||||
// mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii());
|
||||
// if (ethSetsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
|
||||
// piCoutObj << "Can`t join multicast group " << group << ", " << ethErrorString();
|
||||
// return false;
|
||||
// }
|
||||
// if (params[PIEthernet::MulticastLoop]) ethSetsockoptInt(sock, IPPROTO_IP, IP_MULTICAST_LOOP);
|
||||
// applyOptInt(IPPROTO_IP, IP_MULTICAST_TTL, multicastTTL());
|
||||
// if (!mcast_groups.contains(group)) mcast_groups << group;
|
||||
//#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -374,20 +400,27 @@ bool PIEthernet::leaveMulticastGroup(const PIString & group) {
|
||||
return false;
|
||||
}
|
||||
PIFlags<Parameters> params = parameters();
|
||||
#ifndef QNX
|
||||
/// TODO windows
|
||||
parseAddress(path(), &ip_, &port_);
|
||||
#ifndef QNX
|
||||
struct ip_mreqn mreq;
|
||||
#else
|
||||
struct ip_mreq mreq;
|
||||
#endif
|
||||
memset(&mreq, 0, sizeof(mreq));
|
||||
#ifndef QNX
|
||||
if (params[PIEthernet::Broadcast]) mreq.imr_address.s_addr = INADDR_ANY;
|
||||
else mreq.imr_address.s_addr = inet_addr(ip_.dataAscii());
|
||||
#else
|
||||
if (params[PIEthernet::Broadcast]) mreq.imr_interface.s_addr = INADDR_ANY;
|
||||
else mreq.imr_interface.s_addr = inet_addr(ip_.dataAscii());
|
||||
#endif
|
||||
mreq.imr_multiaddr.s_addr = inet_addr(group.dataAscii());
|
||||
if (ethSetsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) == -1) {
|
||||
piCoutObj << "Can`t leave multicast group " << group << ", " << ethErrorString();
|
||||
return false;
|
||||
}
|
||||
mcast_groups.removeAll(group);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -436,7 +469,7 @@ bool PIEthernet::listen(bool threaded) {
|
||||
PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii());
|
||||
PRIVATE->addr_.sin_family = AF_INET;
|
||||
#ifdef QNX
|
||||
PRIVATE->addr_.sin_len = sizeof(*addr_);
|
||||
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
||||
#endif
|
||||
opened_ = false;
|
||||
int tries = 0;
|
||||
@@ -577,7 +610,7 @@ int PIEthernet::write(const void * data, int max_size) {
|
||||
PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_s.dataAscii());
|
||||
PRIVATE->addr_.sin_family = AF_INET;
|
||||
#ifdef QNX
|
||||
PRIVATE->addr_.sin_len = sizeof(*addr_);
|
||||
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
||||
#endif
|
||||
//piCoutObj << "connect SingleTCP" << ip_s << ":" << port_s << "...";
|
||||
if (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) != 0) {
|
||||
@@ -607,7 +640,7 @@ int PIEthernet::write(const void * data, int max_size) {
|
||||
PRIVATE->addr_.sin_addr.s_addr = inet_addr(ip_.dataAscii());
|
||||
PRIVATE->addr_.sin_family = AF_INET;
|
||||
#ifdef QNX
|
||||
PRIVATE->addr_.sin_len = sizeof(*addr_);
|
||||
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
||||
#endif
|
||||
//piCoutObj << "connect to " << ip << ":" << port_;
|
||||
connected_ = (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) == 0);
|
||||
@@ -872,6 +905,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
|
||||
ci.netmask = getSockAddr(ret->ifa_netmask);
|
||||
ci.mac.clear();
|
||||
# ifdef QNX
|
||||
# ifndef BLACKBERRY
|
||||
int fd = ::open((PIString("/dev/io-net/") + ci.name).dataAscii(), O_RDONLY);
|
||||
if (fd != 0) {
|
||||
nic_config_t nic;
|
||||
@@ -879,6 +913,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
|
||||
::close(fd);
|
||||
ci.mac = macFromBytes(PIByteArray(nic.permanent_address, 6));
|
||||
}
|
||||
# endif
|
||||
# else
|
||||
# ifdef MAC_OS
|
||||
PIString req = PISystemInfo::instance()->ifconfigPath + " " + ci.name + " | grep ether";
|
||||
|
||||
Reference in New Issue
Block a user