1 #ifndef CRYPTOPP_SOCKETFT_H 2 #define CRYPTOPP_SOCKETFT_H 6 #if !defined(NO_OS_DEPENDENCE) && defined(SOCKETS_AVAILABLE) 12 #ifdef USE_WINDOWS_STYLE_SOCKETS 13 # if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) 14 # error Winsock 1 is not supported by this library. Please include this file or winsock2.h before windows.h. 21 #include <sys/types.h> 22 #include <sys/socket.h> 28 #ifdef USE_WINDOWS_STYLE_SOCKETS 34 const int SD_RECEIVE = 0;
35 const int SD_SEND = 1;
36 const int SD_BOTH = 2;
52 Err(socket_t s,
const std::string& operation,
int error);
53 socket_t GetSocket()
const {
return m_s;}
59 Socket(socket_t s = INVALID_SOCKET,
bool own=
false) : m_s(s), m_own(own) {}
60 Socket(
const Socket &s) : m_s(s.m_s), m_own(false) {}
63 bool GetOwnership()
const {
return m_own;}
64 void SetOwnership(
bool own) {m_own = own;}
66 operator socket_t() {
return m_s;}
67 socket_t GetSocket()
const {
return m_s;}
68 void AttachSocket(socket_t s,
bool own=
false);
69 socket_t DetachSocket();
72 void Create(
int nType = SOCK_STREAM);
73 void Bind(
unsigned int port,
const char *addr=NULL);
74 void Bind(
const sockaddr* psa, socklen_t saLen);
75 void Listen(
int backlog = SOMAXCONN);
78 bool Connect(
const char *addr,
unsigned int port);
79 bool Connect(
const sockaddr* psa, socklen_t saLen);
80 bool Accept(Socket& s, sockaddr *psa=NULL, socklen_t *psaLen=NULL);
81 void GetSockName(sockaddr *psa, socklen_t *psaLen);
82 void GetPeerName(sockaddr *psa, socklen_t *psaLen);
83 unsigned int Send(
const byte* buf,
size_t bufLen,
int flags=0);
84 unsigned int Receive(
byte* buf,
size_t bufLen,
int flags=0);
85 void ShutDown(
int how = SD_SEND);
87 void IOCtl(
long cmd,
unsigned long *argp);
88 bool SendReady(
const timeval *timeout);
89 bool ReceiveReady(
const timeval *timeout);
91 virtual void HandleError(
const char *operation)
const;
92 void CheckAndHandleError_int(
const char *operation,
int result)
const 93 {
if (result == SOCKET_ERROR)
HandleError(operation);}
94 void CheckAndHandleError(
const char *operation, socket_t result)
const 95 {
if (result == static_cast<socket_t>(SOCKET_ERROR))
HandleError(operation);}
96 #ifdef USE_WINDOWS_STYLE_SOCKETS 97 void CheckAndHandleError(
const char *operation, BOOL result)
const 99 void CheckAndHandleError(
const char *operation,
bool result)
const 104 static unsigned int PortNameToNumber(
const char *
name,
const char *protocol=
"tcp");
106 static void StartSockets();
108 static void ShutdownSockets();
110 static int GetLastError();
112 static void SetLastError(
int errorCode);
115 virtual void SocketChanged() {}
121 class SocketsInitializer
124 SocketsInitializer() {Socket::StartSockets();}
128 class SocketReceiver :
public NetworkReceiver
131 SocketReceiver(Socket &s);
133 #ifdef USE_BERKELEY_STYLE_SOCKETS 134 bool MustWaitToReceive() {
return true;}
137 bool MustWaitForResult() {
return true;}
139 bool Receive(
byte* buf,
size_t bufLen);
140 unsigned int GetReceiveResult();
141 bool EofReceived()
const {
return m_eofReceived;}
143 unsigned int GetMaxWaitObjectCount()
const {
return 1;}
149 #ifdef USE_WINDOWS_STYLE_SOCKETS 150 WindowsHandle m_event;
151 OVERLAPPED m_overlapped;
153 bool m_resultPending;
155 unsigned int m_lastResult;
161 class SocketSender :
public NetworkSender
164 SocketSender(Socket &s);
166 #ifdef USE_BERKELEY_STYLE_SOCKETS 167 bool MustWaitToSend() {
return true;}
170 bool MustWaitForResult() {
return true;}
171 bool MustWaitForEof() {
return true; }
174 void Send(
const byte* buf,
size_t bufLen);
175 unsigned int GetSendResult();
178 unsigned int GetMaxWaitObjectCount()
const {
return 1;}
183 #ifdef USE_WINDOWS_STYLE_SOCKETS 184 WindowsHandle m_event;
185 OVERLAPPED m_overlapped;
187 bool m_resultPending;
189 unsigned int m_lastResult;
194 class SocketSource :
public NetworkSource,
public Socket
197 SocketSource(socket_t s = INVALID_SOCKET,
bool pumpAll =
false,
BufferedTransformation *attachment = NULL)
198 : NetworkSource(attachment), Socket(s), m_receiver(*this)
205 NetworkReceiver & AccessReceiver() {
return m_receiver;}
206 SocketReceiver m_receiver;
210 class SocketSink :
public NetworkSink,
public Socket
213 SocketSink(socket_t s=INVALID_SOCKET,
unsigned int maxBufferSize=0,
unsigned int autoFlushBound=16*1024)
214 : NetworkSink(maxBufferSize, autoFlushBound), Socket(s), m_sender(*this) {}
216 void SendEof() {ShutDown(SD_SEND);}
219 NetworkSender & AccessSender() {
return m_sender;}
220 SocketSender m_sender;
225 #endif // SOCKETS_AVAILABLE 227 #endif // CRYPTOPP_SOCKETFT_H Base class for all exceptions thrown by the library.
bool error(const char *fmt, const Args &...args)
The operating system reported an error.
#define NAMESPACE_BEGIN(x)
Abstract base classes that provide a uniform interface to this library.
Library configuration file.
void HandleError(const leveldb::Status &status)
Handle database error by throwing dbwrapper_error exception.
#define TYPE_OF_SOCKLEN_T
Classes for an unlimited queue to store bytes.
bool CloseSocket(SOCKET &hSocket)
Close socket and set hSocket to INVALID_SOCKET.
#define CRYPTOPP_ASSERT(exp)