132 lines
4.2 KiB
C
132 lines
4.2 KiB
C
|
|
#ifndef _BASE_SOCKET_H_
|
|||
|
|
#define _BASE_SOCKET_H_
|
|||
|
|
|
|||
|
|
/******************************************************************
|
|||
|
|
*
|
|||
|
|
* $ ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> $
|
|||
|
|
*
|
|||
|
|
* - <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> -
|
|||
|
|
*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>װ<EFBFBD>֧࣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
*****************************************************************/
|
|||
|
|
#ifdef _MSC_VER
|
|||
|
|
#define socklen_t int
|
|||
|
|
#include <winsock.h>
|
|||
|
|
#else
|
|||
|
|
#define INVALID_SOCKET -1
|
|||
|
|
#define SOCKET_ERROR -1
|
|||
|
|
#define SOCKET int
|
|||
|
|
#define WSAGetLastError() errno
|
|||
|
|
#define WSAEWOULDBLOCK EWOULDBLOCK
|
|||
|
|
#define closesocket close
|
|||
|
|
#define OUT
|
|||
|
|
|
|||
|
|
#include <errno.h>
|
|||
|
|
#include <sys/socket.h>
|
|||
|
|
#include <fcntl.h>
|
|||
|
|
#include <netinet/in.h>
|
|||
|
|
#include <netdb.h>
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
namespace net
|
|||
|
|
{
|
|||
|
|
/* <09><><EFBFBD><EFBFBD>TCP<43><EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
class BaseSocket
|
|||
|
|
{
|
|||
|
|
protected:
|
|||
|
|
SOCKET socket_; //<2F><EFBFBD><D7BD><EFBFBD>
|
|||
|
|
sockaddr_in local_addr_; //<2F>ı<F3B6A8B5><C4B1>ص<EFBFBD>ַ
|
|||
|
|
sockaddr_in remote_addr_; //Զ<>̵<EFBFBD>ַ
|
|||
|
|
bool block_flag_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
bool connected_; //<2F>Ƿ<EFBFBD><C7B7>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool connectint_; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
protected:
|
|||
|
|
//<2F>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
|
virtual void OnConnected();
|
|||
|
|
//<2F>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD>ӶϿ<D3B6><CFBF><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
|
virtual void OnDisconnected();
|
|||
|
|
//<2F>ṩ<EFBFBD><E1B9A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪ͨ<CDA8><D6AA><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
|||
|
|
virtual void OnError(int errorCode);
|
|||
|
|
protected:
|
|||
|
|
//<2F>̳<EFBFBD><CCB3><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ش˺<D8B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>еIJ<D0B5><C4B2><EFBFBD>
|
|||
|
|
virtual void Connected();
|
|||
|
|
//<2F>̳<EFBFBD><CCB3><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ش˺<D8B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>еIJ<D0B5><C4B2><EFBFBD>
|
|||
|
|
virtual void Disconnected();
|
|||
|
|
//<2F>̳<EFBFBD><CCB3><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ش˺<D8B4><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>еIJ<D0B5><C4B2><EFBFBD>
|
|||
|
|
virtual void SocketError(int nErrorCode);
|
|||
|
|
public:
|
|||
|
|
BaseSocket();
|
|||
|
|
virtual ~BaseSocket();
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>SOCKET
|
|||
|
|
inline SOCKET getSocket()
|
|||
|
|
{
|
|||
|
|
return socket_;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>SOCKET
|
|||
|
|
void setSocket(const SOCKET socket);
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>true<75><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false<73><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inline bool getBlockMode()
|
|||
|
|
{
|
|||
|
|
return block_flag_;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>true<75><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>false<73><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
int setBlockMode(const bool block);
|
|||
|
|
//<2F>ж<EFBFBD>SOCKET<45>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
|||
|
|
inline bool connected()
|
|||
|
|
{
|
|||
|
|
return connected_;
|
|||
|
|
}
|
|||
|
|
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2>ر<EFBFBD><D8B1><EFBFBD><D7BD><EFBFBD>
|
|||
|
|
void Close();
|
|||
|
|
//<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>,sd<73><64>ʾ<EFBFBD>Ͽ<EFBFBD><CFBF>ķ<EFBFBD>ʽ,<2C>ֱ<EFBFBD><D6B1><EFBFBD>SD_RECEIVE<56><45>SD_SEND<4E><44>SD_BOTH
|
|||
|
|
int shutDown(const int sd);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>32λ<32><CEBB>IP<49><50>ַ<EFBFBD><D6B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><F3B6A8B5>ƶ<EFBFBD><C6B6>ĵ<EFBFBD>ַ<EFBFBD>Ͷ˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
int bind(const u_long addr, const int port);
|
|||
|
|
//ͨ<><CDA8>ָ<EFBFBD><D6B8>IP<49><50>ַ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ͷ˿ڰ<DAB0>ָ<EFBFBD><D6B8><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD>Ͷ˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
//int bind(const char* addr, const int port);
|
|||
|
|
//<2F><>ȡ<EFBFBD>ı<F3B6A8B5><C4B1>ص<EFBFBD>ַ<EFBFBD>Ͷ˿ڵ<CBBF>sockaddr_in<69>ṹ
|
|||
|
|
inline void getLoaclAddr(sockaddr_in* addr_in)
|
|||
|
|
{
|
|||
|
|
*addr_in = local_addr_;
|
|||
|
|
}
|
|||
|
|
//<2F><>ȡԶ<C8A1>̵ĵ<CCB5>ַ<EFBFBD>Ͷ˿ڵ<CBBF>sockaddr_in<69>ṹ
|
|||
|
|
inline void getRemoteAddr(sockaddr_in* addr_in)
|
|||
|
|
{
|
|||
|
|
*addr_in = remote_addr_;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Զ<EFBFBD>̵<EFBFBD>ַ<EFBFBD><D6B7>Ϣ
|
|||
|
|
inline void setRemoteAddr(const sockaddr_in* addr_in)
|
|||
|
|
{
|
|||
|
|
remote_addr_ = *addr_in;
|
|||
|
|
}
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>
|
|||
|
|
int getRecvBufSize(int* size);
|
|||
|
|
//<2F><><EFBFBD>ý<EFBFBD><C3BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>
|
|||
|
|
int setRecvBufSize(int size);
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>
|
|||
|
|
int getSendBufSize(int* size);
|
|||
|
|
//<2F><><EFBFBD>÷<EFBFBD><C3B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>
|
|||
|
|
int setSendBufSize(int size);
|
|||
|
|
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>backlog<6F><67>ʾÿ<CABE>οɽ<CEBF><C9BD>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD>
|
|||
|
|
int listen(const int backlog = 5);
|
|||
|
|
//ͨ<><CDA8>32λIP<49><50>ַ<EFBFBD><D6B7><EFBFBD>ӵ<EFBFBD><D3B5>ƶ<EFBFBD><C6B6>Ķ˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int connect(const u_long addr, const int port, bool block);
|
|||
|
|
//ͨ<><CDA8>IP<49><50>ַ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ķ˿ڣ<CBBF><DAA3><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//int connect(const char* addr, const int port, bool block);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>ӣ<EFBFBD>wait_msec<65><63>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>socket<65><74><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>SOCKET_ERROR-1<><31>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int accept(SOCKET* socket, size_t wait_msec, sockaddr_in* addr);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD>ֵΪsocket<65><74><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>0<EFBFBD><30>ʾ<EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>socket<65><74><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD>socket
|
|||
|
|
static int createSocket(OUT SOCKET* socket, const int af = AF_INET, const int type = SOCK_STREAM, const int protocol = IPPROTO_TCP);
|
|||
|
|
//<2F><>ȡ<EFBFBD><EFBFBD><D7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD><DDA1><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ѶϿ<D1B6><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SOCKET_ERROR<4F><52>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3A3ACB7><EFBFBD>SOCKET_ERROR-1<><31>ʾû<CABE><C3BB><EFBFBD><EFBFBD><EFBFBD>ݿɶ<DDBF>(<28><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><EFBFBD><D7BD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾʵ<CABE>ʽ<EFBFBD><CABD>յ<EFBFBD><D5B5>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
virtual int recv(void* buf, int len, const int flags = 0);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><D7BD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>ѶϿ<D1B6><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SOCKET_ERROR<4F><52>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3A3ACB7><EFBFBD>SOCKET_ERROR-1<><31>ʾsend<6E><64><EFBFBD><EFBFBD><EFBFBD>ᷢ<EFBFBD><E1B7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><EFBFBD><D7BD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD>ط<F2B7B5BB><D8B7>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
virtual int send(void* buf, int len, const int flags = 0);
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|