客户端:
连接服务端
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!");
}
}
}