From a17738e1545ff7dbef6398b8ec1eab93ab59c9a1 Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期四, 30 六月 2022 19:14:47 +0800 Subject: [PATCH] '功能完善' --- app/SocketManager.cpp | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 102 insertions(+), 7 deletions(-) diff --git a/app/SocketManager.cpp b/app/SocketManager.cpp index c783e07..9cb69ce 100644 --- a/app/SocketManager.cpp +++ b/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); -- Gitblit v1.8.0