MyLib
This commit is contained in:
79
Socket/TCP.h
Normal file
79
Socket/TCP.h
Normal file
@ -0,0 +1,79 @@
|
||||
#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
|
Reference in New Issue
Block a user