#include "stdafx.h"
|
#include "ServerSocket.h"
|
#include "Respond.h"
|
|
#include <mutex>
|
|
//È«¾Ö»¥³âËø
|
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<mutex> lg(g_mtx);
|
|
//¹²ÏíÊý¾Ýmap<SOCKET, int> 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); // ¹Ø±Õ¿Í»§¶ËÌ×½Ó×Ö
|
}
|