📄 socketft.h
字号:
#ifndef CRYPTOPP_SOCKETFT_H#define CRYPTOPP_SOCKETFT_H#include "config.h"#ifdef SOCKETS_AVAILABLE#include "network.h"#include "queue.h"#ifdef USE_WINDOWS_STYLE_SOCKETS# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_)# error Winsock 1 is not supported by this library. Please include this file or winsock2.h before windows.h.# endif#include <winsock2.h>#include "winpipes.h"#else#include <sys/time.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#endifNAMESPACE_BEGIN(CryptoPP)#ifdef USE_WINDOWS_STYLE_SOCKETStypedef ::SOCKET socket_t;#elsetypedef int socket_t;const socket_t INVALID_SOCKET = -1;// cygwin 1.1.4 doesn't have SHUT_RDconst int SD_RECEIVE = 0;const int SD_SEND = 1;const int SD_BOTH = 2;const int SOCKET_ERROR = -1;#endif#ifndef socklen_ttypedef TYPE_OF_SOCKLEN_T socklen_t; // see config.h#endif//! wrapper for Windows or Berkeley Socketsclass Socket{public: //! exception thrown by Socket class class Err : public OS_Error { public: Err(socket_t s, const std::string& operation, int error); socket_t GetSocket() const {return m_s;} private: socket_t m_s; }; Socket(socket_t s = INVALID_SOCKET, bool own=false) : m_s(s), m_own(own) {} Socket(const Socket &s) : m_s(s.m_s), m_own(false) {} virtual ~Socket(); bool GetOwnership() const {return m_own;} void SetOwnership(bool own) {m_own = own;} operator socket_t() {return m_s;} socket_t GetSocket() const {return m_s;} void AttachSocket(socket_t s, bool own=false); socket_t DetachSocket(); void CloseSocket(); void Create(int nType = SOCK_STREAM); void Bind(unsigned int port, const char *addr=NULL); void Bind(const sockaddr* psa, socklen_t saLen); void Listen(int backlog=5); // the next three functions return false if the socket is in nonblocking mode // and the operation cannot be completed immediately bool Connect(const char *addr, unsigned int port); bool Connect(const sockaddr* psa, socklen_t saLen); bool Accept(Socket& s, sockaddr *psa=NULL, socklen_t *psaLen=NULL); void GetSockName(sockaddr *psa, socklen_t *psaLen); void GetPeerName(sockaddr *psa, socklen_t *psaLen); unsigned int Send(const byte* buf, size_t bufLen, int flags=0); unsigned int Receive(byte* buf, size_t bufLen, int flags=0); void ShutDown(int how = SD_SEND); void IOCtl(long cmd, unsigned long *argp); bool SendReady(const timeval *timeout); bool ReceiveReady(const timeval *timeout); virtual void HandleError(const char *operation) const; void CheckAndHandleError_int(const char *operation, int result) const {if (result == SOCKET_ERROR) HandleError(operation);} void CheckAndHandleError(const char *operation, socket_t result) const {if (result == SOCKET_ERROR) HandleError(operation);}#ifdef USE_WINDOWS_STYLE_SOCKETS void CheckAndHandleError(const char *operation, BOOL result) const {assert(result==TRUE || result==FALSE); if (!result) HandleError(operation);} void CheckAndHandleError(const char *operation, bool result) const {if (!result) HandleError(operation);}#endif //! look up the port number given its name, returns 0 if not found static unsigned int PortNameToNumber(const char *name, const char *protocol="tcp"); //! start Windows Sockets 2 static void StartSockets(); //! calls WSACleanup for Windows Sockets static void ShutdownSockets(); //! returns errno or WSAGetLastError static int GetLastError(); //! sets errno or calls WSASetLastError static void SetLastError(int errorCode);protected: virtual void SocketChanged() {} socket_t m_s; bool m_own;};class SocketsInitializer{public: SocketsInitializer() {Socket::StartSockets();} ~SocketsInitializer() {try {Socket::ShutdownSockets();} catch (...) {}}};class SocketReceiver : public NetworkReceiver{public: SocketReceiver(Socket &s);#ifdef USE_BERKELEY_STYLE_SOCKETS bool MustWaitToReceive() {return true;}#else ~SocketReceiver(); bool MustWaitForResult() {return true;}#endif bool Receive(byte* buf, size_t bufLen); unsigned int GetReceiveResult(); bool EofReceived() const {return m_eofReceived;} unsigned int GetMaxWaitObjectCount() const {return 1;} void GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack);private: Socket &m_s; bool m_eofReceived;#ifdef USE_WINDOWS_STYLE_SOCKETS WindowsHandle m_event; OVERLAPPED m_overlapped; bool m_resultPending; DWORD m_lastResult;#else unsigned int m_lastResult;#endif};class SocketSender : public NetworkSender{public: SocketSender(Socket &s);#ifdef USE_BERKELEY_STYLE_SOCKETS bool MustWaitToSend() {return true;}#else ~SocketSender(); bool MustWaitForResult() {return true;} bool MustWaitForEof() { return true; } bool EofSent();#endif void Send(const byte* buf, size_t bufLen); unsigned int GetSendResult(); void SendEof(); unsigned int GetMaxWaitObjectCount() const {return 1;} void GetWaitObjects(WaitObjectContainer &container, CallStack const& callStack);private: Socket &m_s;#ifdef USE_WINDOWS_STYLE_SOCKETS WindowsHandle m_event; OVERLAPPED m_overlapped; bool m_resultPending; DWORD m_lastResult;#else unsigned int m_lastResult;#endif};//! socket-based implementation of NetworkSourceclass SocketSource : public NetworkSource, public Socket{public: SocketSource(socket_t s = INVALID_SOCKET, bool pumpAll = false, BufferedTransformation *attachment = NULL) : NetworkSource(attachment), Socket(s), m_receiver(*this) { if (pumpAll) PumpAll(); }private: NetworkReceiver & AccessReceiver() {return m_receiver;} SocketReceiver m_receiver;};//! socket-based implementation of NetworkSinkclass SocketSink : public NetworkSink, public Socket{public: SocketSink(socket_t s=INVALID_SOCKET, unsigned int maxBufferSize=0, unsigned int autoFlushBound=16*1024) : NetworkSink(maxBufferSize, autoFlushBound), Socket(s), m_sender(*this) {} void SendEof() {ShutDown(SD_SEND);}private: NetworkSender & AccessSender() {return m_sender;} SocketSender m_sender;};NAMESPACE_END#endif // #ifdef SOCKETS_AVAILABLE#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -