/** * @file * @author 2012-2014 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) * @copyright Simplified BSD * * @cond * This program is free software: you can redistribute it and/or modify * it under the terms of the FreeBSD license as published by the FreeBSD * project. * * 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. * * You should have received a copy of the FreeBSD license along with this * program. If not, see . * @endcond */ #ifndef SOCKETCLIENT_H_9A0B2A88 #define SOCKETCLIENT_H_9A0B2A88 #include "uscxml/Common.h" // for USCXML_API #include "uscxml/concurrency/EventBase.h" #include #include #include #ifdef _WIN32 # include #else # include /* For sockaddr_in */ #endif #include #include "uscxml/concurrency/tinythread.h" // for recursive_mutex, etc extern "C" { #include #include #include } namespace uscxml { class USCXML_API Socket { public: Socket(int domain, int type, int protocol); virtual ~Socket(); void setBlockSizeRead(size_t size); protected: void setupSockAddr(const std::string& address, int port); evutil_socket_t _socketFD; tthread::recursive_mutex _mutex; size_t _blockSizeRead; struct sockaddr_in _sin; boost::shared_ptr _base; }; class USCXML_API ServerSocket : public Socket { public: class Connection { public: struct bufferevent* bufferEvent; int fd; void reply(const char* data, size_t size); }; ServerSocket(int domain, int type, int protocol); virtual ~ServerSocket(); void listen(const std::string& address, int port); virtual void readCallback(const char* data, size_t size, Connection& conn) {}; protected: void bind(); static void acceptCallback(evutil_socket_t listener, short event, void *ctx); static void errorCallback(struct bufferevent *bev, short error, void *ctx); static void readCallback(struct bufferevent *bev, void *ctx); std::map _connections; struct event* _listenerEvent; static std::set _instances; }; class USCXML_API ClientSocket : public Socket { public: ClientSocket(int domain, int type, int protocol); virtual ~ClientSocket(); virtual void readCallback(const char* data, size_t size) {}; void connect(const std::string& address, int port); int write(const char* data, size_t size); protected: static void readCallback(struct bufferevent *bev, void *ctx); static void errorCallback(struct bufferevent *bev, short error, void *ctx); struct bufferevent* _clientEvent; }; } #endif /* end of include guard: SOCKETCLIENT_H_9A0B2A88 */