adding udp ifaces
parent
d08755bc28
commit
4e29918740
|
@ -212,6 +212,25 @@ Conveyor<Own<IoStream>> UnixNetworkAddress::connect() {
|
|||
return Conveyor<Own<IoStream>>{std::move(io_stream)};
|
||||
}
|
||||
|
||||
Own<Datagram> UnixNetworkAddress::datagram(){
|
||||
SAW_ASSERT(addresses.size() > 0){
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int fd = addresses.front().socket(SOCK_DGRAM);
|
||||
|
||||
int optval = 1;
|
||||
int rc = ::setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
|
||||
SAW_ASSERT(rc == 0){
|
||||
::close(fd);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
addresses.front().bind(fd);
|
||||
/// @todo
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::string UnixNetworkAddress::toString() const {
|
||||
try {
|
||||
std::ostringstream oss;
|
||||
|
|
|
@ -312,6 +312,9 @@ public:
|
|||
void notify(uint32_t mask) override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Helper class which provides potential addresses to NetworkAddress
|
||||
*/
|
||||
class SocketAddress {
|
||||
private:
|
||||
union {
|
||||
|
@ -335,8 +338,6 @@ public:
|
|||
}
|
||||
|
||||
int socket(int type) const {
|
||||
bool is_stream = type & SOCK_STREAM;
|
||||
|
||||
type |= SOCK_NONBLOCK | SOCK_CLOEXEC;
|
||||
|
||||
int result = ::socket(address.generic.sa_family, type, 0);
|
||||
|
@ -403,6 +404,8 @@ public:
|
|||
Own<Server> listen() override;
|
||||
Conveyor<Own<IoStream>> connect() override;
|
||||
|
||||
Own<Datagram> datagram() override;
|
||||
|
||||
std::string toString() const override;
|
||||
|
||||
const std::string &address() const override;
|
||||
|
|
|
@ -92,16 +92,40 @@ public:
|
|||
virtual Conveyor<Own<IoStream>> accept() = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Datagram class. Bound to a local address it is able to receive inbound datagram messages
|
||||
* and send them as well as long as an address is provided as well
|
||||
*/
|
||||
class Datagram {
|
||||
public:
|
||||
virtual ~Datagram() = default;
|
||||
|
||||
virtual void write(void* buffer, size_t length, NetworkAddress& dest) = 0;
|
||||
virtual Conveyor<size_t> writeDone() = 0;
|
||||
|
||||
virtual void read(void* buffer, size_t min_length, size_t max_length) = 0;
|
||||
virtual Conveyor<size_t> readDone() = 0;
|
||||
};
|
||||
|
||||
class NetworkAddress {
|
||||
public:
|
||||
virtual ~NetworkAddress() = default;
|
||||
|
||||
/*
|
||||
* Listen on this address
|
||||
/**
|
||||
* Set up a listener on this address
|
||||
*/
|
||||
virtual Own<Server> listen() = 0;
|
||||
|
||||
/**
|
||||
* Connect to a remote address
|
||||
*/
|
||||
virtual Conveyor<Own<IoStream>> connect() = 0;
|
||||
|
||||
/**
|
||||
* Bind a datagram socket at this address.
|
||||
*/
|
||||
virtual Own<Datagram> datagram() = 0;
|
||||
|
||||
virtual std::string toString() const = 0;
|
||||
|
||||
virtual const std::string &address() const = 0;
|
||||
|
|
Loading…
Reference in New Issue