Advertisement
Guest User

Untitled

a guest
Jun 11th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.34 KB | None | 0 0
  1. #pragma once
  2. #include <WinSock2.h>
  3. #include <Windows.h>
  4. #include "TriviaServer.h"
  5. #include "Validator.h"
  6. #define PORT 8820
  7. #define IFACE 0
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. TriviaServer::TriviaServer()
  12. {
  13. _roomIdSequence = 0;
  14. _socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  15. if (_socket == INVALID_SOCKET)
  16. throw std::exception(__FUNCTION__ " - socket");
  17. /*DataBase Build*/
  18. }
  19.  
  20. TriviaServer::~TriviaServer()
  21. {
  22. map<int, Room*>::iterator it = _roomsList.begin();
  23. for (it; it != _roomsList.end(); it++)
  24. {
  25. delete it->second;
  26. }
  27. map<SOCKET, User*>::iterator it2 = _connectedUsers.begin();
  28. for (it2; it2 != _connectedUsers.end(); it2++)
  29. {
  30. delete it2->second;
  31. closesocket(it2->first);
  32. }
  33. closesocket(_socket);
  34. }
  35.  
  36. void TriviaServer::server()
  37. {
  38. bindAndListen();
  39. thread handleMessages(&TriviaServer::handleRecievedMessages);
  40. handleMessages.detach();
  41. while (true)
  42. {
  43. cout << "accepting client..." << endl;
  44. accept();
  45. }
  46. }
  47.  
  48. void TriviaServer::bindAndListen()
  49. {
  50. struct sockaddr_in sa = { 0 };
  51. sa.sin_port = htons(PORT);
  52. sa.sin_family = AF_INET;
  53. sa.sin_addr.s_addr = IFACE;
  54. if (::bind(_socket, (struct sockaddr*)&sa, sizeof(sa)) == SOCKET_ERROR)
  55. throw std::exception(__FUNCTION__ " - bind");
  56. cout << "binded" << endl;
  57.  
  58. if (::listen(_socket, SOMAXCONN) == SOCKET_ERROR)
  59. throw std::exception(__FUNCTION__ " - listen");
  60. cout << "listening..." << endl;
  61. }
  62.  
  63. void TriviaServer::accept()
  64. {
  65. SOCKET client_socket = ::accept(_socket, NULL, NULL);
  66. if (client_socket == INVALID_SOCKET)
  67. throw std::exception(__FUNCTION__);
  68.  
  69. cout << "Client accepted !" << endl;
  70. // create new thread for client and detach from it
  71. std::thread tr(&TriviaServer::clientHandler, this, client_socket);
  72. tr.detach();
  73. }
  74.  
  75. void TriviaServer::clientHandler(SOCKET s)
  76. {
  77. bool clientConnected = true;
  78. while (clientConnected)
  79. {
  80. int code = Helper::getMessageTypeCode(s);
  81. RecievedMessage* m = buildRecieveMessage(s, code);
  82. addRecievedMessage(m);
  83. }
  84. }
  85.  
  86. void TriviaServer::safeDeleteUser(RecievedMessage* m)
  87. {
  88. try
  89. {
  90. SOCKET soc = m->getSock();
  91. handleSignout(m);
  92. if (soc != NULL)
  93. {
  94. closesocket(soc);
  95. }
  96. }
  97. catch (...)
  98. { }
  99. }
  100.  
  101. void TriviaServer::addRecievedMessage(RecievedMessage* m)
  102. {
  103. std::unique_lock<std::mutex> locker(_mtxRecievedMessages);
  104. m->setUser(getUserBySocket(m->getSock()));
  105. locker.lock();
  106. _queRcvMessages.push(m);
  107. locker.unlock();
  108. _cond.notify_one();
  109.  
  110. }
  111.  
  112. RecievedMessage* TriviaServer::buildRecieveMessage(SOCKET s, int code)
  113. {
  114. vector<string> values;
  115. int len;
  116. switch (code)
  117. {
  118. case SIGN_IN_REQUEST:
  119. for (int i = 0; i < 2; i++)
  120. {
  121. len = Helper::getIntPartFromSocket(s, 2);
  122. values.push_back(Helper::getStringPartFromSocket(s, len));
  123. }
  124. break;
  125. case SIGN_OUT_REQUEST:
  126. break;
  127. case SIGN_UP_REQUEST:
  128. for (int i = 0; i < 3; i++)
  129. {
  130. len = Helper::getIntPartFromSocket(s, 2);
  131. values.push_back(Helper::getStringPartFromSocket(s, len));
  132. }
  133. break;
  134. case AVAILABLE_ROOM_REQUEST:
  135. break;
  136. case ROOM_USERS_REQUEST:
  137. case ROOM_JOIN_REQUEST:
  138. values.push_back(Helper::getStringPartFromSocket(s, 4));
  139. break;
  140. case ROOM_LEAVE_REQUEST:
  141. break;
  142. case ROOM_CREATE_REQUEST:
  143. len = Helper::getIntPartFromSocket(s, 2);
  144. values.push_back(Helper::getStringPartFromSocket(s, len));
  145. values.push_back(Helper::getStringPartFromSocket(s, 1));
  146. values.push_back(Helper::getStringPartFromSocket(s, 2));
  147. values.push_back(Helper::getStringPartFromSocket(s, 2));
  148. break;
  149. case ROOM_CLOSE_REQUEST:
  150. break;
  151. case EXIT_APPLICATION:
  152. break;
  153. }
  154.  
  155. RecievedMessage* m;
  156. if (!values.empty())
  157. {
  158. m = new RecievedMessage(s, code, values);
  159. }
  160. else
  161. {
  162. m = new RecievedMessage(s, code);
  163. }
  164. return m;
  165. }
  166. void TriviaServer::handleRecievedMessages()
  167. {
  168. std::unique_lock<std::mutex> locker(_mtxRecievedMessages);
  169. while (true)
  170. {
  171. if (_queRcvMessages.empty())
  172. {
  173. _cond.wait(locker);
  174. }
  175. switch (_queRcvMessages.front()->getMessageCode())
  176. {
  177. case SIGN_IN_REQUEST:
  178. handleSignin(_queRcvMessages.front());
  179. break;
  180. case SIGN_OUT_REQUEST:
  181. handleSignout(_queRcvMessages.front());
  182. break;
  183. case SIGN_UP_REQUEST:
  184. handleSignup(_queRcvMessages.front());
  185. break;
  186. case AVAILABLE_ROOM_REQUEST:
  187. handleGetRooms(_queRcvMessages.front());
  188. break;
  189. case ROOM_USERS_REQUEST:
  190. handleGetUsersInRoom(_queRcvMessages.front());
  191. break;
  192. case ROOM_JOIN_REQUEST:
  193. handleJoinRoom(_queRcvMessages.front());
  194. break;
  195. case ROOM_LEAVE_REQUEST:
  196. handleLeaveRoom(_queRcvMessages.front());
  197. break;
  198. case ROOM_CREATE_REQUEST:
  199. handleCreateRoom(_queRcvMessages.front());
  200. break;
  201. case ROOM_CLOSE_REQUEST:
  202. handleCloseRoom(_queRcvMessages.front());
  203. break;
  204. case EXIT_APPLICATION:
  205. handleSignout(_queRcvMessages.front());
  206. break;
  207. }
  208. _queRcvMessages.pop();
  209. }
  210. }
  211.  
  212. User* TriviaServer::getUserBySocket(SOCKET s)
  213. {
  214. std::map<SOCKET, User*>::iterator it;
  215. it = find(_connectedUsers.begin(), _connectedUsers.end(), s);
  216. if (it != _connectedUsers.end())
  217. {
  218. return it->second;
  219. }
  220. else
  221. {
  222. return NULL;
  223. }
  224. }
  225.  
  226. User* TriviaServer::handleSignin(RecievedMessage* m)
  227. {
  228. int flag = true; // if wrong details
  229. map<string, string>::iterator it;
  230. map<SOCKET,User*>::iterator itConnected;
  231. User* login = nullptr;
  232. for (it = _dbUsers.begin(); it != _dbUsers.end(); it++)
  233. {
  234. if ((it->first) == ((*(m->getValues()))[0]) && (it->second) == ((*(m->getValues()))[1]))
  235. {
  236. flag = false;
  237. login = new User(it->first, m->getSock());
  238. for (itConnected = _connectedUsers.begin(); itConnected != _connectedUsers.end(); it++)
  239. {
  240. if (itConnected->second->getUsername() == login->getUsername())
  241. {
  242. delete login;
  243. login = nullptr;
  244. }
  245. }
  246. }
  247. }
  248.  
  249. if (login)
  250. {
  251. Helper::sendData(m->getSock(), to_string(SIGN_IN_SUCCESS));
  252. }
  253. else if (flag)
  254. {
  255. Helper::sendData(m->getSock(), to_string(SIGN_IN_WRONG_DETAILS));
  256.  
  257. }
  258. else
  259. {
  260. Helper::sendData(m->getSock(), to_string(SIGN_IN_USER_CONNECTED));
  261. }
  262. return login;
  263. }
  264.  
  265. bool TriviaServer::handleSignup(RecievedMessage* m)
  266. {
  267. //[203##username##pass##email]
  268. string user = (*m->getValues())[0];
  269. string pass = (*m->getValues())[1];
  270. string email = (*m->getValues())[2];
  271.  
  272. if (!Validator::isPasswordValid(pass))
  273. {
  274. Helper::sendData(m->getSock(), to_string(SIGN_UP_PASS_ILLEGAL));
  275. return false;
  276. }
  277. if (!Validator::isUsernameValid(user))
  278. {
  279. Helper::sendData(m->getSock(), to_string(SIGN_UP_USERNAME_ILLEGAL));
  280. return false;
  281. }
  282. //////////////////// TEMP CODE
  283. map<string, string>::iterator it = _dbUsers.begin();
  284. for (it; it != _dbUsers.end(); it++)
  285. {
  286. if (user == it->first)
  287. {
  288. Helper::sendData(m->getSock(), to_string(SIGN_UP_USERNAME_EXISTS));
  289. return false;
  290. }
  291. }
  292. _dbUsers.insert(pair<string, string>(user, pass));
  293. //////////////////// END TEMP CODE
  294. //////////////////// FUTURE CODE:
  295. /*if (!DataBase::isUserExists(user))
  296. {
  297. Helper::sendData(m->getSock(), to_string(SIGN_UP_USERNAME_EXISTS));
  298. return false;
  299. }
  300. if(!DataBase::addNewUser(user, pass, email))
  301. {
  302. Helper::sendData(m->getSock(), to_string(SIGN_UP_OTHER));
  303. return false;
  304. }
  305. */
  306. Helper::sendData(m->getSock(), to_string(SIGN_UP_SUCCESS));
  307. return true;
  308. }
  309.  
  310. void TriviaServer::handleSignout(RecievedMessage* m)
  311. {
  312. User* u;
  313. if (u = m->getUser())
  314. {
  315. map<SOCKET, User*>::iterator it = _connectedUsers.begin();
  316. for (it; it != _connectedUsers.end(); it++)
  317. {
  318. if (it->first == u->getSocket())
  319. {
  320. delete it->second;
  321. closesocket(it->first);
  322. }
  323. }
  324. handleCloseRoom(m);
  325. handleLeaveRoom(m);
  326. //handleLeaveGame(m);
  327. }
  328. }
  329.  
  330. bool TriviaServer::handleCreateRoom(RecievedMessage* m)
  331. {
  332. User* curr = m->getUser();
  333. if (curr)
  334. {
  335. vector<string>* values = m->getValues();
  336. if (curr->createRoom(++_roomIdSequence, m->getUser(),(*values)[0] ,stoi((*values)[1], nullptr, 0), stoi((*values)[3], nullptr, 0), stoi((*values)[2], nullptr, 0)))
  337. {
  338. _roomsList.insert(pair<int, Room*>(_roomIdSequence, curr->getRoom()));
  339. return true;
  340. }
  341. return false;
  342. }
  343. else
  344. {
  345. return false;
  346. }
  347. }
  348. bool TriviaServer::handleCloseRoom(RecievedMessage* m)
  349. {
  350.  
  351. }
  352. bool TriviaServer::handleJoinRoom(RecievedMessage* m)
  353. {
  354.  
  355. }
  356. bool TriviaServer::handleLeaveRoom(RecievedMessage* m)
  357. {
  358.  
  359. }
  360. void TriviaServer::handleGetUsersInRoom(RecievedMessage* m)
  361. {
  362.  
  363. }
  364. void TriviaServer::handleGetRooms(RecievedMessage* m)
  365. {
  366.  
  367. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement