Files
Lixinzhe_lib/Socket/TCP.h

80 lines
1.4 KiB
C
Raw Permalink Normal View History

2025-06-16 08:52:40 +08:00
#ifndef LXZL_TCP_H
#define LXZL_TCP_H
#include "NetworkRelated.h"
#include <thread>
#include <mutex>
#include <queue>
#include <atomic>
#include <memory>
#include <condition_variable>
/**
* TCP套接字
*/
class TCPSocket {
public:
/** 创建套接字 */
void create_socket();
/** 关闭套接字 */
void close_socket();
virtual ~TCPSocket();
/** 套接字状态 */
bool is_connected() const;
public:
socket_t sockfd_ = INVALID_SOCKET_VALUE;
std::atomic<bool> connected_{false};
};
/**
* TCP客户端
*/
class TCPClient : public TCPSocket {
public:
/** 建立链接 */
void connect(const std::string &ip, uint16_t port);
/** 发送数据 */
size_t send(const void *data, size_t size);
size_t send(const std::string &data);
/** 接收数据,返回数据长度 */
size_t receive(void *buffer, size_t buffer_size);
};
/**
* TCP服务端
*/
class TCPServer : public TCPSocket {
public:
void listen(uint16_t port, int backlog = SOMAXCONN);
std::shared_ptr<TCPClient> accept();
};
// 异步客户端(生产者-消费者模式)
class AsyncTCPClient : public TCPClient {
public:
void start_async();
bool try_pop(std::vector<uint8_t> &data);
~AsyncTCPClient() override;
private:
std::thread recv_thread_;
std::mutex queue_mutex_;
std::condition_variable queue_cv_;
std::queue<std::vector<uint8_t>> recv_queue_;
std::atomic<bool> running_{false};
};
#endif //LXZL_TCP_H