| | |
| | | #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() { |
| | |
| | | } |
| | | |
| | | |
| | | 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); |