#include "pch.h" #include "SocketManager.h" #define CHANNEL_NUM 8*2+1 #include #include 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 { string result = actionCallback(string(recvBuff), callbackContext); //·¢ËͲÙ×÷½á¹û int iSend = send(client, result.c_str(), result.size(), 0); cout << "·µ»Ø¸ø¿Í»§¶ËÊý¾Ý£º" << result << endl; } catch (...) { } } else { cout << "¿Í»§¶ËÍ˳ö" << endl; break; } } } void SocketManager::runSocketServer(void* context) { //³ö´íÖ®ºóÖØÐ´´½¨socket server for (;;) { //´´½¨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 << "socket-server Á¬½Óʧ°Ü£º" << client << endl; break; } thread msg(SocketManager::processMsg, client, context); msg.detach(); } closesocket(socketServer); WSACleanup(); //ÖØÐ´´½¨µÄʱ¼ä¼ä¸ôΪ2s Sleep(2000); } } 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; WORD SocketVersion = MAKEWORD(2, 2); if (WSAStartup(SocketVersion, &wsd) != 0) { cout << "°ó¶¨Socket¿âʧ°Ü" << endl; } 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::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::iterator ele; for (ele = sockClients.begin();ele != sockClients.end();++ele) { closesocket(*ele); } } SOCKET SocketManager::getClient(int p) { list::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::iterator ele = sockClients.begin(); advance(ele, p); *ele = m_SockClient; } string SocketManager::sendMsg(int p, const char* msg) { SOCKET socket = getClient(p); char buffer[10240]; int result = send(socket, msg, strlen(msg), 0); if (result < 0) { throw string("·¢ËÍʧ°Ü"); } int num = recv(socket, buffer, 10240, 0); if (num < 0) { throw string("δ½ÓÊÕµ½ÐÅÏ¢"); } return string(buffer); } 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); }