summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh')
-rw-r--r--3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh157
1 files changed, 157 insertions, 0 deletions
diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh b/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh
new file mode 100644
index 0000000..9a3f11b
--- /dev/null
+++ b/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh
@@ -0,0 +1,157 @@
+/* vim:ts=8:sts=4:sw=4:noai:noexpandtab
+ *
+ * PGM socket
+ *
+ * Copyright (c) 2010 Miru Limited.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef __PGM_SOCKET_HH__
+#define __PGM_SOCKET_HH__
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include <cerrno>
+#ifndef _WIN32
+# include <cstddef>
+# include <sys/socket.h>
+#else
+# include <ws2tcpip.h>
+#endif
+
+namespace cpgm {
+#define restrict
+#include <pgm/pgm.h>
+};
+
+template <typename Protocol>
+class pgm_socket
+{
+public:
+ /// The protocol type.
+ typedef Protocol protocol_type;
+
+ /// The endpoint type.
+ typedef typename Protocol::endpoint endpoint_type;
+
+ /// The native socket type.
+ typedef struct cpgm::pgm_sock_t* native_type;
+
+ /// Construct a pgm_socket without opening it.
+ pgm_socket()
+ {
+ }
+
+ // Open a new PGM socket implementation.
+ bool open (::sa_family_t family, int sock_type, int protocol, cpgm::pgm_error_t** error)
+ {
+ return cpgm::pgm_socket (&this->native_type_, family, sock_type, protocol, error);
+ }
+
+ /// Close a PGM socket implementation.
+ bool close (bool flush)
+ {
+ return pgm_close (this->native_type_, flush);
+ }
+
+ /// Get the native socket implementation.
+ native_type native (void)
+ {
+ return this->native_type_;
+ }
+
+ // Bind the datagram socket to the specified local endpoint.
+ bool bind (const endpoint_type& addr, cpgm::pgm_error_t** error)
+ {
+ return pgm_bind (this->native_type_, addr.data(), sizeof(addr.data()), error);
+ }
+
+ /// Connect the PGM socket to the specified endpoint.
+ bool connect (cpgm::pgm_error_t** error)
+ {
+ return pgm_connect (this->native_type_, error);
+ }
+
+ /// Set a socket option.
+ bool set_option (int optname, const void* optval, ::socklen_t optlen)
+ {
+ return pgm_setsockopt (this->native_type_, optname, optval, optlen);
+ }
+
+ /// Get a socket option.
+ bool get_option (int optname, void* optval, ::socklen_t* optlen)
+ {
+ return pgm_getsockopt (this->native_type_, optname, optval, optlen);
+ }
+
+ /// Get the local endpoint.
+ endpoint_type local_endpoint() const
+ {
+ endpoint_type endpoint;
+ pgm_getsockname (this->native_type_, &endpoint);
+ return endpoint;
+ }
+
+ /// Disable sends or receives on the socket.
+ bool shutdown (int what)
+ {
+ int optname, v = 1;
+#ifndef _WIN32
+ if (SHUT_RD == what) optname = cpgm::PGM_SEND_ONLY;
+ else if (SHUT_WR == what) optname = cpgm::PGM_RECV_ONLY;
+#else
+ if (SD_RECEIVE == what) optname = cpgm::PGM_SEND_ONLY;
+ else if (SD_SEND == what) optname = cpgm::PGM_RECV_ONLY;
+#endif
+ else {
+ errno = EINVAL;
+ return false;
+ }
+ return pgm_setsockopt (this->native_type_, optname, v, sizeof(v));
+ }
+
+ /// Send some data on a connected socket.
+ int send (const void* buf, std::size_t len, std::size_t* bytes_sent)
+ {
+ return pgm_send (this->native_type_, buf, len, bytes_sent);
+ }
+
+ /// Receive some data from the peer.
+ int receive (void* buf, std::size_t len, int flags, std::size_t* bytes_read, cpgm::pgm_error_t** error)
+ {
+ return pgm_recv (this->native_type_, buf, len, flags, bytes_read, error);
+ }
+
+ /// Receive a datagram with the endpoint of the sender.
+ int receive_from (void* buf, std::size_t len, int flags, std::size_t* bytes_read, endpoint_type* from, cpgm::pgm_error_t** error)
+ {
+ int ec;
+ struct cpgm::pgm_sockaddr_t addr;
+ socklen_t addrlen = sizeof (addr);
+ ec = pgm_recvfrom (this->native_type_, buf, len, flags, bytes_read, &addr, &addrlen, error);
+ from->port (addr.sa_port);
+ from->address (addr.sa_addr);
+/* TODO: set data-destination port */
+ return ec;
+ }
+
+private:
+ native_type native_type_;
+};
+
+#endif /* __PGM_SOCKET_HH__ */