Service_NSSM/CC_SDK/Include/Module/Comm/CCSocket.h

164 lines
3.7 KiB
C
Raw Normal View History

2025-09-27 14:24:18 +08:00
#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 <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <ifaddrs.h>
#include <netdb.h>
#include <sys/select.h>
#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<CTL::String> 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