客户端:
连接服务端
bool connectServer(const char* serverIP, unsigned short port);
向服务端发送消息
void sendMessage(const char* data, int count);
接受服务端数据的回调函数
std::function<void(const char* data, int count)> onRecv;
断开连接的回调函数
std::function<void()> onDisconnect;
SocketClient.h
- #ifndef __SOCKET_CLIENT_H__
- #define __SOCKET_CLIENT_H__
- #include "SocketBase.h"
- class SocketClient : public SocketBase
- {
- public:
- SocketClient(void);
- ~SocketClient(void);
- bool connectServer(const char* serverIP, unsigned short port);
- void sendMessage(const char* data, int count);
- std::function<void(const char* data, int count)> onRecv;
- std::function<void()> onDisconnect;
- private:
- bool initClient();
- void recvMessage();
- private:
- HSocket _socketServer;
- HSocket _socektClient;
- };
- #endif
SocketClient.cpp
- #include "SocketClient.h"
- SocketClient::SocketClient(void) :
- onRecv(nullptr),
- _socektClient(0)
- {
- }
- SocketClient::~SocketClient(void)
- {
- if (_socektClient != 0)
- {
- _mutex.lock();
- this->closeConnect(_socektClient);
- _mutex.unlock();
- }
- }
- bool SocketClient::initClient()
- {
- if (_socektClient != 0)
- {
- _mutex.lock();
- this->closeConnect(_socektClient);
- _mutex.unlock();
- }
- _socektClient = socket(AF_INET, SOCK_STREAM, 0);
- if (error(_socketServer))
- {
- log("init client error!");
- _socektClient = 0;
- return false;
- }
- return true;
- }
- bool SocketClient::connectServer(const char* serverIP, unsigned short port)
- {
- if (!this->initClient())
- {
- return false;
- }
- struct sockaddr_in serverAddr;
- memset(&serverAddr, 0, sizeof(struct sockaddr_in));
- serverAddr.sin_family = AF_INET;
- serverAddr.sin_port = htons(port);
- serverAddr.sin_addr.s_addr = inet_addr(serverIP);
- int ret = 0;
- ret = connect(_socektClient, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr));
- if (ret < 0)
- {
- this->closeConnect(_socektClient);
- _socektClient = 0;
- return false;
- }
- std::thread recvThread(&SocketClient::recvMessage, this);
- recvThread.detach();
- return true;
- }
- void SocketClient::recvMessage()
- {
- char recvBuf[1024];
- int ret = 0;
- while (true)
- {
- ret = recv(_socektClient, recvBuf, sizeof(recvBuf), 0);
- if (ret < 0)
- {
- log("recv error");
- break;
- }
- if (ret > 0 && onRecv != nullptr)
- {
- onRecv(recvBuf, ret);
- }
- }
- _mutex.lock();
- this->closeConnect(_socektClient);
- if (onDisconnect != nullptr)
- {
- onDisconnect();
- }
- _socektClient = 0;
- _mutex.unlock();
- }
- void SocketClient::sendMessage(const char* data, int count)
- {
- if (_socektClient != 0)
- {
- int ret = send(_socektClient, data, count, 0);
- if (ret < 0)
- {
- log("send error!");
- }
- }
- }