diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-03-17 09:05:43 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-03-17 09:05:43 -0700 |
commit | 7e80d7e551a0a2edc3fa3e6b6eb7379863c3ac04 (patch) | |
tree | 02da2dfacfda5b6965e12d4e30b69d52851743cd /node/Socket.hpp | |
parent | ce09d00679f22e4e71219bb1af2da6b974e04573 (diff) | |
download | infinitytier-7e80d7e551a0a2edc3fa3e6b6eb7379863c3ac04.tar.gz infinitytier-7e80d7e551a0a2edc3fa3e6b6eb7379863c3ac04.zip |
Bunch of work in progress on new socket multiplexer and plumbing for TCP jailbreaking... Don't try to build, won't yet.
Diffstat (limited to 'node/Socket.hpp')
-rw-r--r-- | node/Socket.hpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/node/Socket.hpp b/node/Socket.hpp new file mode 100644 index 00000000..687834a2 --- /dev/null +++ b/node/Socket.hpp @@ -0,0 +1,139 @@ +/* + * ZeroTier One - Global Peer to Peer Ethernet + * Copyright (C) 2011-2014 ZeroTier Networks LLC + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +#ifndef ZT_SOCKET_HPP +#define ZT_SOCKET_HPP + +#include <list> + +#include "Constants.hpp" +#include "InetAddress.hpp" +#include "AtomicCounter.hpp" +#include "SharedPtr.hpp" +#include "NonCopyable.hpp" + +#ifdef __WINDOWS__ +#include <WinSock2.h> +#include <WS2tcpip.h> +#include <Windows.h> +#endif + +/** + * Maximum discrete message length supported by all socket types + */ +#define ZT_SOCKET_MAX_MESSAGE_LEN 4096 + +namespace ZeroTier { + +class SocketManager; + +/** + * Base class of all socket types + * + * Socket implementations are tightly bound to SocketManager. + */ +class Socket : NonCopyable +{ + friend class SharedPtr<Socket>; + friend class SocketManager; + +public: + enum Type + { + ZT_SOCKET_TYPE_UDP_V4, + ZT_SOCKET_TYPE_UDP_V6, + ZT_SOCKET_TYPE_TCP + }; + + virtual ~Socket() {} + + /** + * @return Socket type + */ + inline Type type() const + throw() + { + return _type; + } + + /** + * @return True if this is a TCP socket + */ + inline bool isTCP() const + throw() + { + return (_type == ZT_SOCKET_TYPE_TCP); + } + + /** + * @return True if socket is available for sending/receiving of data + */ + virtual bool isOpen() const = 0; + + /** + * Send a ZeroTier message packet + * + * @param to Destination address (ignored in connected TCP sockets) + * @param msg Message data + * @param msglen Message length (max 16384 bytes) + * @return True if send appears successful on our end, false if e.g. address type unreachable from this socket + */ + virtual bool send(const InetAddress &to,const void *msg,unsigned int msglen) = 0; + +protected: + // Called only by SocketManager, should return false if socket is no longer open/valid (e.g. connection drop or other fatal error) + virtual bool notifyAvailableForRead(const SharedPtr<Socket> &self,SocketManager *sm) = 0; + virtual bool notifyAvailableForWrite(const SharedPtr<Socket> &self,SocketManager *sm) = 0; + +private: +#ifdef __WINDOWS__ + Socket(Type t,SOCKET sock) : + _sock(sock), + _type(t) + { + } +#else + Socket(Type t,int sock) : + _sock(sock), + _type(t) + { + } +#endif + +#ifdef __WINDOWS__ + SOCKET _sock; +#else + int _sock; +#endif + Type _type; + + AtomicCounter __refCount; +}; + +}; // namespace ZeroTier + +#endif |