服务端:
初始化服务端
向指定客户端发送消息
voidsendMessage(HSocketsocket,constchar*data,255); font-size:9.5pt; font-family:新宋体">intcount);
向所有客户端发送消息
void sendMessage(const char* data,int count);
当服务端开启后的回调函数
std::function<void(constchar*ip)>onStart;
当有新连接时的回调函数
void(HSocketsocket)>onNewConnection;
当有消息时的回调函数
std::function<void(intcount)>onRecv;
当有客户端断开连接时的回调函数
HSocketsocket)>onDisconnect;
SocketServer.h
- #ifndef__SOCKET_SERVER_H__
- #define__SOCKET_SERVER_H__
-
- #include"SocketBase.h"
- classSocketServer:publicSocketBase
- {
- public:
- staticSocketServer*create();
-
- SocketServer();
- ~SocketServer();
- boolstartServer();
- voidsendMessage(HSocketsocket,constchar*data,intcount);
- voidsendMessage(intcount);
- std::function<void(char*ip)>onStart;
- std::function<void(HSocketsocket)>onNewConnection;
- intcount)>onRecv;
- void(HSocketsocket)>onDisconnect;
- private:
- boolinitServer();
- voidacceptClient();
- voidacceptFunc();
- voidnewClientConnected(HSocketsocket);
- voidrecvMessage(HSocketsocket);
- private:
- HSocket_socketServer;
- std::list<HSocket>_clientSockets;
- };
- #endif
SocketServer.cpp
#include"SocketServer.h"
- SocketServer*SocketServer::create()
- {
- autoserver=newSocketServer;
- returnserver;
- }
- SocketServer::SocketServer():
- _socketServer(0),
- onRecv(nullptr),
- onStart(nullptr),248)"> onNewConnection(nullptr)
- }
- SocketServer::~SocketServer()
- _clientSockets.clear();
- if(_socketServer)
- this->closeConnect(_socketServer);
- };
- boolSocketServer::startServer()
- if(!initServer())
- returnfalse;
- true;
- boolSocketServer::initServer()
- if(_socketServer!=0)
- _socketServer=socket(AF_INET,SOCK_STREAM,0);
- if(error(_socketServer))
- log("socketerror!");
- _socketServer=0;
- false;
- do
- structsockaddr_insockAddr;
- memset(&sockAddr,sizeof(sockAddr));
- sockAddr.sin_family=AF_INET;
- sockAddr.sin_port=htons(8000);
- sockAddr.sin_addr.s_addr=htonl(INADDR_ANY);
- intret=0;
- ret=bind(_socketServer,(constsockaddr*)&sockAddr,153); font-weight:bold; background-color:inherit">if(ret<0)
- log("binderror!");
- break;
- ret=listen(_socketServer,5);
- if(ret<0)
- log("listenerror!");
- break;
-
- charhostName[256];
- gethostname(hostName,153); font-weight:bold; background-color:inherit">sizeof(hostName));
- structhostent*hostInfo=gethostbyname(hostName);
- char*ip=inet_ntoa(*(structin_addr*)*hostInfo->h_addr_list);
- this->acceptClient();
- if(onStart!=nullptr)
- log("startserver!");
- onStart(ip);
- true;
- }while(false);
- _socketServer=0;
- voidSocketServer::acceptClient()
- std::threadth(&SocketServer::acceptFunc,153); font-weight:bold; background-color:inherit">this);
- th.detach();
- voidSocketServer::acceptFunc()
- intlen=sizeof(sockaddr);
- structsockaddr_insockAddr;
- true)
- HSocketclientSock=accept(_socketServer,(sockaddr*)&sockAddr,&len);
- if(error(clientSock))
- log("accepterror!");
- this->newClientConnected(clientSock);
- voidSocketServer::newClientConnected(HSocketsocket)
- log("newconnect!");
- _clientSockets.push_back(socket);
- threadth(&SocketServer::recvMessage,153); font-weight:bold; background-color:inherit">this,socket);
- if(onNewConnection!=nullptr)
- onNewConnection(socket);
- voidSocketServer::recvMessage(HSocketsocket)
- charbuff[1024];
- ret=recv(socket,buff,153); font-weight:bold; background-color:inherit">sizeof(buff),0);
- log("recv(%d)error!",socket);
- _mutex.lock();
- this->closeConnect(socket);
- _clientSockets.remove(socket);
- if(onDisconnect!=nullptr)
- onDisconnect(socket);
- _mutex.unlock();
- else
- buff[ret]=0;
- log("recvmsg:%s",buff);
- if(ret>0&&onRecv!=nullptr)
- onRecv(buff,ret);
- voidSocketServer::sendMessage(HSocketsocket,87); font-weight:bold; background-color:inherit">intcount)
- for(auto&sock:_clientSockets)
- if(sock==socket)
- intret=send(socket,data,count,0);
- log("senderror!");
- voidSocketServer::sendMessage(intcount)
- for(auto&socket:_clientSockets)
- log("senderror!");
- }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|