# HG changeset patch # User František Kučera # Date 1659861905 -7200 # Node ID 2665ab0bcf445d0c690e9fbb2f5b998a632749ab # Parent d93ea7346b66d9529133bcb5fcdf73b33fe4e50c reuse the UDP socket diff -r d93ea7346b66 -r 2665ab0bcf44 src/Socket.h --- a/src/Socket.h Tue Jul 26 23:22:24 2022 +0200 +++ b/src/Socket.h Sun Aug 07 10:45:05 2022 +0200 @@ -32,17 +32,12 @@ class Socket { private: const static size_t MSG_SIZE = 8192; // TODO: configurable/dynamic + int s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); public: - virtual ~Socket() { - } - - std::string receive() { - char buffer[MSG_SIZE + 1]; - memset(buffer, 0, MSG_SIZE + 1); - - int s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + Socket() { + s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); struct sockaddr_in a; memset((char *) &a, 0, sizeof (a)); @@ -51,13 +46,30 @@ a.sin_port = htons(1234); ::bind(s, (sockaddr*) & a, sizeof (a)); + // int soBufferSize = 1024 * 1024; + // setsockopt(s, SOL_SOCKET, SO_RCVBUF, &soBufferSize, sizeof (soBufferSize)); + // soBufferSize = 0; + // socklen_t soBufferSizeLength = sizeof (soBufferSize); + + // std::cerr << "soBufferSize=" << soBufferSize << std::endl; + // getsockopt(s, SOL_SOCKET, SO_RCVBUF, &soBufferSize, &soBufferSizeLength); + // std::cerr << "soBufferSize=" << soBufferSize << " length=" << soBufferSizeLength << std::endl; + } + + virtual ~Socket() { + close(s); + } + + std::string receive() { + char buffer[MSG_SIZE + 1]; + memset(buffer, 0, MSG_SIZE + 1); + struct sockaddr_in remoteAddress; memset((char *) &remoteAddress, 0, sizeof (remoteAddress)); - socklen_t remoteAddressSize = sizeof(remoteAddress); + socklen_t remoteAddressSize = sizeof (remoteAddress); ssize_t msgSize = recvfrom(s, buffer, sizeof (buffer), 0, (sockaddr*) & remoteAddress, &remoteAddressSize); - close(s); if (msgSize > sizeof (buffer))throw std::logic_error("Invalid Socket message size."); else if (msgSize >= 0) return std::string(buffer, msgSize);