客户端:
连接服务端
boolconnectServer(constchar*serverIP,unsignedshortport);
向服务端发送消息
voidsendMessage(char*data,255)">intcount);
接受服务端数据的回调函数
std::function<void(intcount)>onRecv;
断开连接的回调函数
std::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,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!"); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。