#include "stdafx.h" #include "ServerSocket.h" #include "Respond.h" #include //È«¾Ö»¥³âËø mutex g_mtx;//Äã´´½¨ÁËÒ»¸ö»¥³âËø¶ÔÏó ServerSocket::ServerSocket() { //ÕâÀï³õʼ»¯·þÎñÆ÷socket if (init_socket()) { cout << "init server socket ok..." << endl; } else { cout << "init false !" << endl; } } ServerSocket::~ServerSocket() { WSACleanup(); // ¹Ø±ÕÍøÂç»·¾³ } bool ServerSocket::init_socket() { WSAData wsa = { 0 }; //Æô¶¯ÍøÂç»·¾³ WSAStartup(MAKEWORD(2,2), &wsa); m_socket = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN addr; addr.sin_family = AF_INET; addr.sin_port = htons(16888); addr.sin_addr.S_un.S_addr = 0; // ±¾»úµÄÈÎÒâip //Á¬½Ó int ret_bind = ::bind(m_socket, (sockaddr*)&addr, sizeof(addr)); if (ret_bind) { cout << "bind fail:" << WSAGetLastError() << endl; return false; } //¼àÌý int ret_listen = listen(m_socket, 5); // Èô²¢·¢Á¿´ó ¸ø¸ö´óµãµÄÖµÈç 50£¬500µÈ if (ret_listen) { cout << "listen fail:" << WSAGetLastError() << endl; return false; } //³õʼ»¯Íê³É //ʹÓÃÏ߳̽ÓÊÕ¿Í»§¶ËÁ¬½ÓÇëÇó thread accept_thread(&ServerSocket::acceptThread,this); accept_thread.detach(); // ·ÖÀëỊ̈߳¬·ÀÖ¹Òì³£½áÊø return true; } void ServerSocket::acceptThread() { while (true) { SOCKET client; SOCKADDR_IN addr; int len = sizeof(addr); //½ÓÊÕÁ¬½Ó cout << "waiting for client connect..." << endl; client = accept(m_socket, (SOCKADDR *)&addr, &len); cout << "client :" << client <<"success connected."<< endl; //¼ì²éһϣ¬clientÊÇ·ñÕýÈ· if (client == SOCKET_ERROR) { cout << "socket error :" << WSAGetLastError() << endl; break; } else if (client == 0) { cout << "socket close:" << WSAGetLastError() << endl; break; } //ʹÓÃÒ»¸ö{}Ȧ¶¨´úÂë¿é£¬ÏÞ¶¨±£»¤ËøµÄÉÏËø·¶Î§ { lock_guard lg(g_mtx); //¹²ÏíÊý¾Ýmap m_clients--¡¾¼ü¡¤Öµ¶Ô¡¿ //map[client] = ... //ÓÃ×÷ÐÄÌø¼ì²âµÄ¼üÖµ¶Ô } //¿ÉÒÔ½øÐÐÊÕ·¢°üµÄ²Ù×÷ÁË£¬Ò²Ê¹ÓÃÒ»¸öÏ̴߳¦Àí ¡¾ÄäÃû¶ÔÏó¡¿[clientÊÇÕâ¸öÏ̵߳÷Óú¯ÊýµÄ²ÎÊý] thread(&ServerSocket::recvandsendThread, this, client).detach(); } } void ServerSocket::recvandsendThread(SOCKET client)//²ÉÓÃHead·ÖÀ뱨ÎÄÍ·µÄ·½·¨£¬½â¾öÕ³°üÎÊÌâ { while (true) { //ÉèÖÃÁËÓ¦¸Ã½ÓÊܵÄHeadµÄ×Ö½Ú´óС int head_len = sizeof(Head); //±¨ÎÄÍ· Ó¦¸Ã½ÓÊյĸöÊý int recv_len = 0; //±¾´Îʵ¼Ê½ÓÊÕµ½µÄ¸öÊý int gap_len = head_len - recv_len; //ÔÚ±¾´Î½ÓÊպ󣬻¹ÐèÒª½ÓÊյĸöÊý //¿ªÊ¼½ÓÊÕ char *head_buf = new char[head_len]; recv_len = recv(client, head_buf, head_len, 0); //HeadδÂú¶øÊ£ÏµĿռä gap_len = head_len - recv_len; //Èç¹û£¬½ÓÊÕµÄ×Ö½ÚÊý²»¹»£¬¾ÍÒ»Ö±½ÓÊÕ while (gap_len > 0) { recv_len = recv(client, head_buf + (head_len - gap_len), gap_len, 0); gap_len -= recv_len; } //½â°üÍ· Head *head = (Head *)head_buf; int bag_len = head->len;//Õâ¸öÊǰüµÄ×ܳ¤¶È£¬±¨ÎÄ Ó¦¸Ã½ÓÊյĸöÊý //ºÍ°üÍ·µÄÁ÷³ÌÒ»Ñù£¬³ÖÐø½ÓÊÕ£¬Ö±µ½È¡ÂúÊý¾Ý char *all_buf = new char[bag_len]; memcpy(all_buf, head_buf, head_len);//°üÍ·¿½±´µ½ÍêÕûµÄ°üÖÐ gap_len = bag_len - head_len; //ÔÚ±¾´Î½ÓÊպ󣬻¹ÐèÒª½ÓÊյĸöÊý //³ÖÐø£¬Ö±µ½Íê³É while (gap_len > 0) { recv_len = recv(client, all_buf + (bag_len - gap_len), gap_len, 0); gap_len -= recv_len; } /* ÐèÒª½âÃÜ */ //¿ªÊ¼½â°ü if (head->type == LOGIN_REQ) { cout << "ÊÕµ½ÇëÇó°ü" << endl; LoginReq *bag = (LoginReq *)all_buf; cout << "ÐÕÃû£º" << bag->user_name << "ÃÜÂ룺" << bag->password << endl; //µÃµ½¿Í»§¶ËµÄÊý¾Ý£¬ÎÒÃÇÓÃËüÈ¥²éÕÒÊý¾Ý¿â£¬Íê³ÉµÇ¼ҵÎñµÄÏìÓ¦ Respond loginRes; loginRes.business_login(bag, client); } else if (head->type == REGISTER_REQ) { cout << "ÊÕµ½ÇëÇó°ü len:" << head->len << endl; RegisterReq *bag = (RegisterReq *)all_buf; cout << "ÐÕÃû£º" << bag->user_name << endl << "ÃÜÂ룺" << bag->password << endl << "ÓÊÏ䣺" << bag->email << endl << "µç»°£º" << bag->telephone << endl << "²¿ÃÅ£º" << bag->department << endl; //µÃµ½¿Í»§¶ËµÄÊý¾Ý£¬ÎÒÃÇÓÃËüÈ¥²éÕÒÊý¾Ý¿â£¬Íê³ÉµÇ¼ҵÎñµÄÏìÓ¦ Respond registerRes; registerRes.business_register(bag, client); } // ÓÃÍêÁË£¬¼ÇµÃÊͷŶ¯Ì¬¿ª±ÙµÄÄÚ´æ delete[] head_buf; delete[] all_buf; head_buf = nullptr; // ·ÀÖ¹Ö¸ÕëÐü¿Õ£¬¶ø²úÉúÐü¿ÕÖ¸Õë all_buf = nullptr; } closesocket(client); // ¹Ø±Õ¿Í»§¶ËÌ×½Ó×Ö }