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