adding udp ifaces

fb-udp
Claudius Holeksa 2022-01-07 00:29:29 +01:00
parent d08755bc28
commit 4e29918740
3 changed files with 50 additions and 4 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;