#ifndef __CCSocket__ #define __CCSocket__ #pragma once #include "CC.h" #include "CCString.h" #define SockError -1 // 定义主机信息结构体 struct CCHostInfo { std::string IPAddress; CCInt Port = -1; }; // 定义套接字选项枚举 enum CCOpt { BROADCAST, }; // 定义地址类型枚举 enum CCAddress { Local, Any }; #ifdef _WIN32 #define MSL_N 0 // Windows平台下WSA初始化与清理类 class WinWSADWAInitAndClean { public: WSADATA wsd{}; WinWSADWAInitAndClean(){ if (WSAStartup(MAKEWORD(2, 2), &this->wsd)!=0){ WSACleanup(); } } ~WinWSADWAInitAndClean(){ WSACleanup(); } }; static WinWSADWAInitAndClean winsc; #elif __linux__ #define MSL_N MSG_NOSIGNAL #define SOCKET_ERROR (-1) #include #include #include #include #include #include #include #include #include #include "poll.h" typedef int SOCKET; #endif // 命名空间CTL,包含网络编程相关类和枚举 namespace CTL { enum IPVX { IPV4 = AF_INET, IPV6 = AF_INET6 }; enum TORU { TCP = IPPROTO_TCP, UDP = IPPROTO_UDP }; enum TYPE { STREAM = SOCK_STREAM, DGRAM = SOCK_DGRAM }; // Socket类,封装了网络编程的常见操作 class Socket { public: SOCKET Socketbit = -1; sockaddr_in client = {}, server = {}; sockaddr_in6 client_6 = {}, server_6 = {}; short IPVx = 0; public: // 默认构造函数 Socket() = default; // 构造函数,初始化Socket Socket(SOCKET sock); // 初始化Socket并设置属性 bool Init(IPVX IPV4orIPV6, TORU TCPorUDP, TYPE Type = TYPE::STREAM); // 获取Socket句柄 SOCKET GetSOCKET(); // 设置Socket选项 bool SetSockOpt(CCOpt opt); // 设置Socket为非阻塞模式 void SetSocketNonBlocking(); // 检查Socket是否有可用数据 bool isDataAvailable(); // 获取本地IP地址 static std::vector GetLocalIP(IPVX ipvx = IPVX::IPV4,int Number = 1); // 获取客户端主机信息 CCHostInfo GetClientHost(); // 获取本地主机信息 CCHostInfo GetLocalHost(); // 连接到远程主机 bool Connect(const char* IP, unsigned short Port); // 绑定Socket到指定地址和端口 bool Bind(const char* IP,unsigned short Port); // 监听连接请求 bool Listen(unsigned short UserNum = 10); // 接受连接请求 Socket Accept(); // 发送数据 bool Send(const char* str); // 发送数据,带标志 bool Send(const char *__buf, size_t __n, int __flags); // 发送数据到指定地址和端口 bool SendData(const char * str,sockaddr_in addr_in); // 发送指定长度的数据 bool SendByte(const char* str,int len); // UDP发送数据 bool UDPSend(const char* str,const char* IP,int Port); // UDP发送指定长度的数据 bool UDPSendByte(const char* str, ByteHander len, const char* IP, int Port); // UDP发送指定长度的数据 bool UDPSendByte(void* str, ByteHander len, const char* IP, int Port); // 接收数据 ByteHander RecvData(char* buffer,ByteHander lens); // UDP接收数据 ByteHander UDPRecvData(char* buffer,ByteHander lens,CCHostInfo* info); // 关闭Socket void Close(); // 获取数据头部 bool GetDateHead(char* data, ByteHander* size); // 获取字符串头部 bool GetStrHead(char* data,ByteHander size); // 重载等号运算符,比较Socket对象是否相等 bool operator == (Socket socket); // 重载不等号运算符,比较Socket对象是否不等 bool operator != (Socket socket); // 检查连接是否有效 bool isConnectionAlive(); // 检查Socket是否可写 static bool IsSocketWritable(SOCKET sock); static int GetLastError(); private: int sock = -1; bool Stop = false; int opt = 1; }; } #endif