#include"SocketServer.h"
SocketServer*SocketServer::create()
{
autoserver=
new
SocketServer;
return
server;
}
SocketServer::SocketServer():
_socketServer(0),
onRecv(nullptr),
onStart(nullptr),
onNewConnection(nullptr)
{
}
SocketServer::~SocketServer()
{
_clientSockets.clear();
if
(_socketServer)
{
this
->closeConnect(_socketServer);
}
};
bool
SocketServer::startServer()
{
if
(!initServer())
{
return
false
;
}
return
true
;
}
bool
SocketServer::initServer()
{
if
(_socketServer!=0)
{
this
->closeConnect(_socketServer);
}
_socketServer=socket(AF_INET,SOCK_STREAM,0);
if
(error(_socketServer))
{
log
(
"socketerror!"
);
_socketServer=0;
return
false
;
}
do
{
struct
sockaddr_insockAddr;
memset
(&sockAddr,
sizeof
(sockAddr));
sockAddr.sin_family=AF_INET;
sockAddr.sin_port=htons(8000);
sockAddr.sin_addr.s_addr=htonl(INADDR_ANY);
int
ret=0;
ret=bind(_socketServer,(
const
sockaddr*)&sockAddr,
sizeof
(sockAddr));
if
(ret<0)
{
log
(
"binderror!"
);
break
;
}
ret=listen(_socketServer,5);
if
(ret<0)
{
log
(
"listenerror!"
);
break
;
}
char
hostName[256];
gethostname(hostName,
sizeof
(hostName));
struct
hostent*hostInfo=gethostbyname(hostName);
char
*ip=inet_ntoa(*(
struct
in_addr*)*hostInfo->h_addr_list);
this
->acceptClient();
if
(onStart!=nullptr)
{
log
(
"startserver!"
);
onStart(ip);
}
return
true
;
}
while
(
false
);
this
->closeConnect(_socketServer);
_socketServer=0;
return
false
;
}
void
SocketServer::acceptClient()
{
std::
thread
th(&SocketServer::acceptFunc,
this
);
th.detach();
}
void
SocketServer::acceptFunc()
{
int
len=
sizeof
(sockaddr);
struct
sockaddr_insockAddr;
while
(
true
)
{
HSocketclientSock=accept(_socketServer,(sockaddr*)&sockAddr,&len);
if
(error(clientSock))
{
log
(
"accepterror!"
);
break
;
}
this
->newClientConnected(clientSock);
}
}
void
SocketServer::newClientConnected(HSocketsocket)
{
log
(
"newconnect!"
);
_clientSockets.push_back(socket);
std::
thread
th(&SocketServer::recvMessage,
this
,socket);
th.detach();
if
(onNewConnection!=nullptr)
{
onNewConnection(socket);
}
}
void
SocketServer::recvMessage(HSocketsocket)
{
char
buff[1024];
int
ret=0;
while
(
true
)
{
ret=recv(socket,buff,
sizeof
(buff),0);
if
(ret<0)
{
log
(
"recv(%d)error!"
,socket);
_mutex.lock();
this
->closeConnect(socket);
_clientSockets.
remove
(socket);
if
(onDisconnect!=nullptr)
{
onDisconnect(socket);
}
_mutex.unlock();
break
;
}
else
{
buff[ret]=0;
log
(
"recvmsg:%s"
,buff);
if
(ret>0&&onRecv!=nullptr)
{
onRecv(buff,ret);
}
}
}
}
void
SocketServer::sendMessage(HSocketsocket,
int
count)
{
for
(auto&sock:_clientSockets)
{
if
(sock==socket)
{
int
ret=send(socket,data,count,0);
if
(ret<0)
{
log
(
"senderror!"
);
}
break
;
}
}
}
void
SocketServer::sendMessage(
const
char
*data,
int
count)
{
for
(auto&socket:_clientSockets)
{
int
ret=send(socket,0);
if
(ret<0)
{
log
(
"senderror!"
);
}
}
}
|