164 lines
3.7 KiB
C++
164 lines
3.7 KiB
C++
#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
|