GH #137: FreeBSD Bcast/Mcast tests fail

This commit is contained in:
alex
2013-06-09 00:27:53 -05:00
parent 460cccddf9
commit a766004fc7
2 changed files with 27 additions and 8 deletions

View File

@@ -36,6 +36,7 @@
#include "UDPEchoServer.h" #include "UDPEchoServer.h"
#include "Poco/Net/DatagramSocket.h" #include "Poco/Net/DatagramSocket.h"
#include "Poco/Net/SocketAddress.h" #include "Poco/Net/SocketAddress.h"
#include "Poco/Net/NetworkInterface.h"
#include "Poco/Net/NetException.h" #include "Poco/Net/NetException.h"
#include "Poco/Timespan.h" #include "Poco/Timespan.h"
#include "Poco/Stopwatch.h" #include "Poco/Stopwatch.h"
@@ -45,6 +46,7 @@ using Poco::Net::Socket;
using Poco::Net::DatagramSocket; using Poco::Net::DatagramSocket;
using Poco::Net::SocketAddress; using Poco::Net::SocketAddress;
using Poco::Net::IPAddress; using Poco::Net::IPAddress;
using Poco::Net::NetworkInterface;
using Poco::Timespan; using Poco::Timespan;
using Poco::Stopwatch; using Poco::Stopwatch;
using Poco::TimeoutException; using Poco::TimeoutException;
@@ -98,22 +100,38 @@ void DatagramSocketTest::testBroadcast()
{ {
UDPEchoServer echoServer; UDPEchoServer echoServer;
DatagramSocket ss(IPAddress::IPv4); DatagramSocket ss(IPAddress::IPv4);
#if (POCO_OS != POCO_OS_FREE_BSD)
SocketAddress sa("255.255.255.255", echoServer.port()); SocketAddress sa("255.255.255.255", echoServer.port());
#else
NetworkInterface ni = NetworkInterface::forName("em0");
SocketAddress sa(ni.broadcastAddress(1), echoServer.port());
#endif
// not all socket implementations fail if broadcast option is not set
/*
try try
{ {
int n = ss.sendTo("hello", 5, sa); int n = ss.sendTo("hello", 5, sa);
// not all socket implementations fail if broadcast option is not set fail ("broadcast option not set - must throw");
// fail ("broadcast option not set - must throw");
n = n + 1; // to silence gcc
} }
catch (IOException&) catch (IOException&)
{ {
} }
*/
ss.setBroadcast(true); ss.setBroadcast(true);
#if (POCO_OS == POCO_OS_FREE_BSD)
int opt = 1;
poco_socklen_t len = sizeof(opt);
ss.impl()->setRawOption(IPPROTO_IP, IP_ONESBCAST, (const char*) &opt, len);
ss.impl()->getRawOption(IPPROTO_IP, IP_ONESBCAST, &opt, len);
assert (opt == 1);
#endif
int n = ss.sendTo("hello", 5, sa); int n = ss.sendTo("hello", 5, sa);
assert (n == 5); assert (n == 5);
char buffer[256]; char buffer[256] = { 0 };
n = ss.receiveBytes(buffer, sizeof(buffer)); n = ss.receiveBytes(buffer, 5);
assert (n == 5); assert (n == 5);
assert (std::string(buffer, n) == "hello"); assert (std::string(buffer, n) == "hello");
ss.close(); ss.close();
@@ -136,8 +154,9 @@ CppUnit::Test* DatagramSocketTest::suite()
CppUnit_addTest(pSuite, DatagramSocketTest, testEcho); CppUnit_addTest(pSuite, DatagramSocketTest, testEcho);
CppUnit_addTest(pSuite, DatagramSocketTest, testSendToReceiveFrom); CppUnit_addTest(pSuite, DatagramSocketTest, testSendToReceiveFrom);
#if (POCO_OS != POCO_OS_FREE_BSD) // TODO #if (POCO_OS != POCO_OS_FREE_BSD) // works only with local net bcast and very randomly
CppUnit_addTest(pSuite, DatagramSocketTest, testBroadcast); CppUnit_addTest(pSuite, DatagramSocketTest, testBroadcast);
#endif #endif
return pSuite; return pSuite;
} }

View File

@@ -77,10 +77,10 @@ Poco::UInt16 UDPEchoServer::port() const
void UDPEchoServer::run() void UDPEchoServer::run()
{ {
_ready.set();
Poco::Timespan span(250000); Poco::Timespan span(250000);
while (!_stop) while (!_stop)
{ {
_ready.set();
if (_socket.poll(span, Socket::SELECT_READ)) if (_socket.poll(span, Socket::SELECT_READ))
{ {
try try
@@ -88,7 +88,7 @@ void UDPEchoServer::run()
char buffer[256]; char buffer[256];
SocketAddress sender; SocketAddress sender;
int n = _socket.receiveFrom(buffer, sizeof(buffer), sender); int n = _socket.receiveFrom(buffer, sizeof(buffer), sender);
_socket.sendTo(buffer, n, sender); n = _socket.sendTo(buffer, n, sender);
} }
catch (Poco::Exception& exc) catch (Poco::Exception& exc)
{ {