admin
2022-06-30 a17738e1545ff7dbef6398b8ec1eab93ab59c9a1
app/SocketManager.cpp
@@ -1,24 +1,119 @@
#include "pch.h"
#include "SocketManager.h"
#define CHANNEL_NUM 9
#include <thread>
SocketManager::SocketManager() {
   init();
SOCKET SocketManager::socketServer;
ActionCallback SocketManager::actionCallback;
void* SocketManager::callbackContext;
SocketManager::SocketManager(ActionCallback callback, void* context) {
   init(callback,context);
}
SocketManager::~SocketManager() {
}
void SocketManager::init() {
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;
         }
      }
   }
}
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);
   //建立8个连接
   //建立9个连接,前8个为数据传输通道,后一个为命令传输通道
   sockClients.clear();
   for (int i = 0;i < 8;i++)
   for (int i = 0;i < CHANNEL_NUM;i++)
   {
      addClient(i);
   }
   Connect();
   thread server(SocketManager::runSocketServer, this);
   server.detach();
}
int SocketManager::getClientsNum() {
@@ -40,7 +135,7 @@
}
int SocketManager::Connect() {
   int scount=0;
   int scount = 0;
   list<SOCKET>::iterator ele;
   for (ele = sockClients.begin();ele != sockClients.end();++ele) {
      int i = connect(*ele, (sockaddr*)&clientaddr, sizeof(clientaddr));
@@ -73,7 +168,7 @@
}
BOOL SocketManager::sendMsg(int p, char* msg) {
BOOL SocketManager::sendMsg(int p, const char* msg) {
   SOCKET socket = getClient(p);
   char buffer[1024];
   send(socket, msg, strlen(msg), 0);