22#include " Server.h"
33#include < map>
44#include " Loggere.h"
5+ #include " HttpParser.h"
6+ #include " HttpParser.h"
7+ #include " Crypto.h"
8+ #include " MysqlClient.h"
9+ #include " jsoncpp/json.h"
10+
11+ DECLARE_TABLE_CLASS (edoyunLogin_user_mysql, _mysql_table_)
12+ DECLARE_MYSQL_FIELD(TYPE_INT, user_id, NOT_NULL | PRIMARY_KEY | AUTOINCREMENT, " INTEGER" , " " , " " , " " )
13+ DECLARE_MYSQL_FIELD(TYPE_VARCHAR, user_qq, NOT_NULL, " VARCHAR" , " (15)" , " " , " " ) // QQ号
14+ DECLARE_MYSQL_FIELD(TYPE_VARCHAR, user_phone, DEFAULT, " VARCHAR" , " (11)" , " '18888888888'" , " " ) // 手机
15+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_name, NOT_NULL, " TEXT" , " " , " " , " " ) // 姓名
16+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_nick, NOT_NULL, " TEXT" , " " , " " , " " ) // 昵称
17+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_wechat, DEFAULT, " TEXT" , " " , " NULL" , " " )
18+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_wechat_id, DEFAULT, " TEXT" , " " , " NULL" , " " )
19+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_address, DEFAULT, " TEXT" , " " , " " , " " )
20+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_province, DEFAULT, " TEXT" , " " , " " , " " )
21+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_country, DEFAULT, " TEXT" , " " , " " , " " )
22+ DECLARE_MYSQL_FIELD(TYPE_INT, user_age, DEFAULT | CHECK, " INTEGER" , " " , " 18" , " " )
23+ DECLARE_MYSQL_FIELD(TYPE_INT, user_male, DEFAULT, " BOOL" , " " , " 1" , " " )
24+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_flags, DEFAULT, " TEXT" , " " , " 0" , " " )
25+ DECLARE_MYSQL_FIELD(TYPE_REAL, user_experience, DEFAULT, " REAL" , " " , " 0.0" , " " )
26+ DECLARE_MYSQL_FIELD(TYPE_INT, user_level, DEFAULT | CHECK, " INTEGER" , " " , " 0" , " " )
27+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_class_priority, DEFAULT, " TEXT" , " " , " " , " " )
28+ DECLARE_MYSQL_FIELD(TYPE_REAL, user_time_per_viewer, DEFAULT, " REAL" , " " , " " , " " )
29+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_career, NONE, " TEXT" , " " , " " , " " )
30+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_password, NOT_NULL, " TEXT" , " " , " " , " " )
31+ DECLARE_MYSQL_FIELD(TYPE_INT, user_birthday, NONE, " DATETIME" , " " , " " , " " )
32+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_describe, NONE, " TEXT" , " " , " " , " " )
33+ DECLARE_MYSQL_FIELD(TYPE_TEXT, user_education, NONE, " TEXT" , " " , " " , " " )
34+ DECLARE_MYSQL_FIELD(TYPE_INT, user_register_time, DEFAULT, " DATETIME" , " " , " LOCALTIME()" , " " )
35+ DECLARE_TABLE_CLASS_EDN()
36+
537
638
739#define ERR_RETURN (ret, err ) if (ret!= 0 ){TRACEE (" ret = %d errno = %d message = [%s]" , ret, errno, strerror (errno)); return err;}
@@ -17,6 +49,12 @@ class CEdoyunPlayerServer : public CBusiness
1749 }
1850 ~CEdoyunPlayerServer ()
1951 {
52+ if (m_db) {
53+ CDatabaseClient* db = m_db;
54+ m_db = NULL ;
55+ db->Close ();
56+ delete db;
57+ }
2058 m_epoll.Close ();
2159 m_pool.Close ();
2260 for (auto it : m_mapClients)
@@ -121,18 +159,127 @@ class CEdoyunPlayerServer : public CBusiness
121159
122160 int Connected (CSocketBase* pClient)
123161 {
162+ // 简单打印客户端的信息
163+ sockaddr_in* paddr = *pClient;
164+ TRACEI (" client connnected addr %s port %d" , inet_ntoa (paddr->sin_addr ), paddr->sin_port );
124165 return 0 ;
125166 }
126167
127168 int Recived (CSocketBase* pClient, const Buffer& data)
128169 {
170+ TRACEI (" 接收到数据!" );
171+ // TODO:主要业务,在此处理
172+ // HTTP 解析
173+ int ret = 0 ;
174+ Buffer response = " " ;
175+ ret = HttpParser (data);
176+ TRACEI (" HttpParser ret=%d" , ret);
177+ // 验证结果的反馈
178+ if (ret != 0 ) {// 验证失败
179+ TRACEE (" http parser failed!%d" , ret);
180+ }
181+ response = MakeResponse (ret);
182+ ret = pClient->Send (response);
183+ if (ret != 0 ) {
184+ TRACEE (" http response failed!%d [%s]" , ret, (char *)response);
185+ }
186+ else {
187+ TRACEI (" http response success!%d" , ret);
188+ }
129189 return 0 ;
130190 }
191+ int HttpParser (const Buffer& data)
192+ {
193+ CHttpParser parser;
194+ size_t size = parser.Parser (data);
195+ if (size == 0 || (parser.Errno () != 0 )) {
196+ TRACEE (" size %llu errno:%u" , size, parser.Errno ());
197+ return -1 ;
198+ }
199+ if (parser.Method () == HTTP_GET) {
200+ // get 处理
201+ UrlParser url (" https://192.168.1.100" + parser.Url ());
202+ int ret = url.Parser ();
203+ if (ret != 0 ) {
204+ TRACEE (" ret = %d url[%s]" , ret, " https://192.168.1.100" + parser.Url ());
205+ return -2 ;
206+ }
207+ Buffer uri = url.Uri ();
208+ TRACEI (" **** uri = %s" , (char *)uri);
209+ if (uri == " login" ) {
210+ // 处理登录
211+ Buffer time = url[" time" ];
212+ Buffer salt = url[" salt" ];
213+ Buffer user = url[" user" ];
214+ Buffer sign = url[" sign" ];
215+ TRACEI (" time %s salt %s user %s sign %s" , (char *)time, (char *)salt, (char *)user, (char *)sign);
216+ // 数据库的查询
217+ edoyunLogin_user_mysql dbuser;
218+ Result result;
219+ Buffer sql = dbuser.Query (" user_name=\" " + user + " \" " );
220+ ret = m_db->Exec (sql, result, dbuser);
221+ if (ret != 0 ) {
222+ TRACEE (" sql=%s ret=%d" , (char *)sql, ret);
223+ return -3 ;
224+ }
225+ if (result.size () == 0 ) {
226+ TRACEE (" no result sql=%s ret=%d" , (char *)sql, ret);
227+ return -4 ;
228+ }
229+ if (result.size () != 1 ) {
230+ TRACEE (" more than one sql=%s ret=%d" , (char *)sql, ret);
231+ return -5 ;
232+ }
233+ auto user1 = result.front ();
234+ Buffer pwd = *user1->Fields [" user_password" ]->Value .String ;
235+ TRACEI (" password = %s" , (char *)pwd);
236+ // 登录请求的验证
237+ const char * MD5_KEY = " *&^%$#@b.v+h-b*g/h@n!h#n$d^ssx,.kl<kl" ;
238+ Buffer md5str = time + MD5_KEY + pwd + salt;
239+ Buffer md5 = Crypto::MD5 (md5str);
240+ TRACEI (" md5 = %s" , (char *)md5);
241+ if (md5 == sign) {
242+ return 0 ;
243+ }
244+ return -6 ;
245+ }
246+ }
247+ else if (parser.Method () == HTTP_POST) {
248+ // post 处理
249+ }
250+ return -7 ;
251+ }
252+ Buffer MakeResponse (int ret) {
253+ Json::Value root;
254+ root[" status" ] = ret;
255+ if (ret != 0 ) {
256+ root[" message" ] = " 登录失败,可能是用户名或者密码错误!" ;
257+ }
258+ else {
259+ root[" message" ] = " success" ;
260+ }
261+ Buffer json = root.toStyledString ();
262+ Buffer result = " HTTP/1.1 200 OK\r\n " ;
263+ time_t t;
264+ time (&t);
265+ tm* ptm = localtime (&t);
266+ char temp[64 ] = " " ;
267+ strftime (temp, sizeof (temp), " %a, %d %b %G %T GMT\r\n " , ptm);
268+ Buffer Date = Buffer (" Date: " ) + temp;
269+ Buffer Server = " Server: Edoyun/1.0\r\n Content-Type: text/html; charset=utf-8\r\n X-Frame-Options: DENY\r\n " ;
270+ snprintf (temp, sizeof (temp), " %d" , json.size ());
271+ Buffer Length = Buffer (" Content-Length: " ) + temp + " \r\n " ;
272+ Buffer Stub = " X-Content-Type-Options: nosniff\r\n Referrer-Policy: same-origin\r\n\r\n " ;
273+ result += Date + Server + Length + Stub + json;
274+ TRACEI (" response: %s" , (char *)result);
275+ return result;
276+ }
131277private:
132278 CEpoll m_epoll;
133279 CThreadPool m_pool;
134280 std::map<int , CSocketBase*> m_mapClients;
135281 unsigned m_count;
282+ CDatabaseClient* m_db;
136283
137284
138285};
0 commit comments