80 lines
1.4 KiB
C
80 lines
1.4 KiB
C
|
#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
|