#include "pch.h"
|
#include "SocketManager.h"
|
#define CHANNEL_NUM 9
|
#include <thread>
|
#include <string>
|
|
SOCKET SocketManager::socketServer;
|
|
ActionCallback SocketManager::actionCallback;
|
|
void* SocketManager::callbackContext;
|
|
string SocketManager::ADDR;
|
|
SocketManager::SocketManager(ActionCallback callback, void* context) {
|
|
init(callback,context);
|
}
|
|
SocketManager::~SocketManager() {
|
|
}
|
|
void SocketManager::processMsg(SOCKET client, void* context) {
|
while (true)
|
{
|
//Ò»Ö±¶ÁÈ¡ÏûÏ¢
|
char recvBuff[1024];
|
memset(recvBuff, 0, sizeof(recvBuff));
|
int recv_len = recv(client, recvBuff, sizeof(recvBuff), 0);
|
if (recv_len > 0)
|
{
|
cout << "½ÓÊܵ½²Ù×÷Ö¸Á" << recvBuff << endl;
|
try {
|
bool success = actionCallback(string(recvBuff), callbackContext);
|
//·¢ËͲÙ×÷½á¹û
|
if (success)
|
{
|
char buff[] = "OK";
|
int iSend = send(client, buff, sizeof(buff), 0);
|
cout << "·µ»Ø¸ø¿Í»§¶ËÊý¾Ý£º" << buff << endl;
|
}
|
else {
|
char buff[] = "FAIL";
|
int iSend = send(client, buff, sizeof(buff), 0);
|
cout << "·µ»Ø¸ø¿Í»§¶ËÊý¾Ý£º" << buff << endl;
|
}
|
}
|
catch (string st) {
|
char buff[] = "FAIL";
|
int iSend = send(client, buff, sizeof(buff), 0);
|
cout << "ÉèÖòɼ¯´úÂë³ö´í£º" << st << endl;
|
}
|
}
|
else {
|
cout << "¿Í»§¶ËÍ˳ö" << endl;
|
break;
|
}
|
}
|
|
}
|
|
void SocketManager::runSocketServer(void* context) {
|
//´´½¨server
|
WSADATA wsaData;
|
WSAStartup(MAKEWORD(2, 2), &wsaData);//³õʼ»¯
|
socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
sockaddr_in sockaddr;
|
sockaddr.sin_family = AF_INET;
|
sockaddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
|
sockaddr.sin_port = htons(LOCAL_SERVER_PORT);
|
int result;
|
if (bind(socketServer, (const struct sockaddr*)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR) {
|
closesocket(socketServer);
|
WSACleanup();
|
printf("°ó¶¨Ê§°Ü\n");
|
return;
|
}
|
//ÔÚ±¾µØ°ó¶¨¶Ë¿Ú
|
result = listen(socketServer, SOMAXCONN);//¿ªÊ¼¼àÌý
|
|
SocketManager* sm = (SocketManager*)context;
|
|
|
printf("wait for connection...\n");
|
|
|
while (true)
|
{
|
int nsize = sizeof(SOCKADDR);
|
SOCKADDR clientAddr;
|
SOCKET client = accept(sm->socketServer, &clientAddr, &nsize);
|
if (client == SOCKET_ERROR)
|
{
|
cout << "Á¬½Óʧ°Ü" << endl;
|
continue;
|
}
|
|
thread msg(SocketManager::processMsg, client, context);
|
msg.detach();
|
}
|
|
closesocket(socketServer);
|
WSACleanup();
|
|
}
|
|
void SocketManager::init(ActionCallback callback, void* contex) {
|
actionCallback = callback;
|
callbackContext = contex;
|
clientaddr.sin_family = AF_INET;
|
clientaddr.sin_port = htons(PORT);
|
clientaddr.sin_addr.S_un.S_addr = inet_addr(ADDR.c_str());
|
//½¨Á¢9¸öÁ¬½Ó,ǰ8¸öΪÊý¾Ý´«ÊäͨµÀ£¬ºóÒ»¸öΪÃüÁî´«ÊäͨµÀ
|
sockClients.clear();
|
for (int i = 0;i < CHANNEL_NUM;i++)
|
{
|
addClient(i);
|
}
|
Connect();
|
|
thread server(SocketManager::runSocketServer, this);
|
server.detach();
|
}
|
|
int SocketManager::getClientsNum() {
|
|
return sockClients.size();
|
}
|
|
void SocketManager::addClient(int p) {
|
WSADATA wsd;
|
WSAStartup(MAKEWORD(2, 2), &wsd);
|
SOCKET m_SockClient;
|
m_SockClient = socket(AF_INET, SOCK_STREAM, 0);
|
sockClients.push_back(m_SockClient);
|
}
|
|
int SocketManager::Connect(int p) {
|
int i = connect(getClient(p), (sockaddr*)&clientaddr, sizeof(clientaddr));
|
return i;
|
}
|
|
int SocketManager::Connect() {
|
int scount = 0;
|
list<SOCKET>::iterator ele;
|
for (ele = sockClients.begin();ele != sockClients.end();++ele) {
|
int i = connect(*ele, (sockaddr*)&clientaddr, sizeof(clientaddr));
|
if (i >= 0) {
|
scount++;
|
}
|
}
|
|
return scount;
|
}
|
|
int SocketManager::disConnect(int p) {
|
return closesocket(getClient(p));
|
}
|
|
void SocketManager::disConnect() {
|
list<SOCKET>::iterator ele;
|
for (ele = sockClients.begin();ele != sockClients.end();++ele) {
|
closesocket(*ele);
|
}
|
}
|
|
SOCKET SocketManager::getClient(int p) {
|
list<SOCKET>::iterator ele = sockClients.begin();
|
if (p > sockClients.size() - 1) {
|
return 0;
|
}
|
std::advance(ele, p);
|
return *ele;
|
}
|
|
void SocketManager::resetClient(int p) {
|
WSADATA wsd;
|
WSAStartup(MAKEWORD(2, 2), &wsd);
|
SOCKET m_SockClient;
|
m_SockClient = socket(AF_INET, SOCK_STREAM, 0);
|
list<SOCKET>::iterator ele = sockClients.begin();
|
advance(ele, p);
|
*ele = m_SockClient;
|
}
|
|
|
BOOL SocketManager::sendMsg(int p, const char* msg) {
|
SOCKET socket = getClient(p);
|
char buffer[64];
|
int result = send(socket, msg, strlen(msg), 0);
|
if (result < 0) {
|
throw string("·¢ËÍʧ°Ü");
|
}
|
int num = recv(socket, buffer, 64, 0);
|
if (num < 0) {
|
throw string("δ½ÓÊÕµ½ÐÅÏ¢");
|
}
|
|
return 1;
|
}
|
|
|
string SocketManager::sendMsg(const char* msg) {
|
WSADATA wsd;
|
WSAStartup(MAKEWORD(2, 2), &wsd);
|
SOCKET m_SockClient;
|
m_SockClient = socket(AF_INET, SOCK_STREAM, 0);
|
sockaddr_in clientaddr;
|
clientaddr.sin_family = AF_INET;
|
clientaddr.sin_port = htons(PORT);
|
clientaddr.sin_addr.S_un.S_addr = inet_addr(ADDR.c_str());
|
|
connect(m_SockClient, (sockaddr*)&clientaddr, sizeof(clientaddr));
|
char buffer[1024];
|
|
int result = send(m_SockClient, msg, strlen(msg), 0);
|
if (result < 0) {
|
throw string("·¢ËÍʧ°Ü");
|
}
|
|
int num = recv(m_SockClient, buffer, 1024, 0);
|
closesocket(m_SockClient);
|
if (num < 0) {
|
throw string("δ½ÓÊÕµ½ÐÅÏ¢");
|
}
|
return string(buffer);
|
}
|