diff --git a/Libraries/LibCore/UDPServer.cpp b/Libraries/LibCore/UDPServer.cpp index 7b230d63e5..ede8ff15fa 100644 --- a/Libraries/LibCore/UDPServer.cpp +++ b/Libraries/LibCore/UDPServer.cpp @@ -30,7 +30,6 @@ #include #include #include -#include namespace Core { @@ -45,41 +44,36 @@ UDPServer::~UDPServer() { } -bool UDPServer::listen(const IPv4Address& address, u16 port) +bool UDPServer::bind(const IPv4Address& address, u16 port) { - if (m_listening) + if (m_bound) return false; int rc; - auto socket_address = SocketAddress(address, port); - auto in = socket_address.to_sockaddr_in(); + auto saddr = SocketAddress(address, port); + auto in = saddr.to_sockaddr_in(); + rc = ::bind(m_fd, (const sockaddr*)&in, sizeof(in)); ASSERT(rc == 0); - rc = ::listen(m_fd, 5); - ASSERT(rc == 0); - m_listening = true; - m_notifier = Notifier::construct(m_fd, Notifier::Event::Read, this); m_notifier->on_ready_to_read = [this] { - if (on_ready_to_accept) - on_ready_to_accept(); + if (on_ready_to_receive) + on_ready_to_receive(); }; return true; } -RefPtr UDPServer::accept() +ByteBuffer UDPServer::receive(size_t size, sockaddr_in& in) { - ASSERT(m_listening); - sockaddr_in in; - socklen_t in_size = sizeof(in); - int accepted_fd = ::accept(m_fd, (sockaddr*)&in, &in_size); - if (accepted_fd < 0) { - perror("accept"); - return nullptr; + auto buf = ByteBuffer::create_zeroed(size); + socklen_t in_len = sizeof(in); + ssize_t rlen = ::recvfrom(m_fd, buf.data(), size, 0, (sockaddr*)&in, &in_len); + if (rlen < 0) { + dbg() << "recvfrom: " << strerror(errno); + return {}; } - - return UDPSocket::construct(accepted_fd); + return buf; } Optional UDPServer::local_address() const diff --git a/Libraries/LibCore/UDPServer.h b/Libraries/LibCore/UDPServer.h index 055a4cdb0d..29dfd29d60 100644 --- a/Libraries/LibCore/UDPServer.h +++ b/Libraries/LibCore/UDPServer.h @@ -26,10 +26,12 @@ #pragma once +#include #include #include #include #include +#include namespace Core { @@ -38,21 +40,26 @@ class UDPServer : public Object { public: virtual ~UDPServer() override; - bool is_listening() const { return m_listening; } - bool listen(const IPv4Address& address, u16 port); + bool is_bound() const { return m_bound; } - RefPtr accept(); + bool bind(const IPv4Address& address, u16 port); + ByteBuffer receive(size_t size, sockaddr_in& from); + ByteBuffer receive(size_t size) + { + struct sockaddr_in saddr; + return receive(size, saddr); + }; Optional local_address() const; Optional local_port() const; - Function on_ready_to_accept; + Function on_ready_to_receive; private: explicit UDPServer(Object* parent = nullptr); int m_fd { -1 }; - bool m_listening { false }; + bool m_bound { false }; RefPtr m_notifier; };