Advertisement
Guest User

Untitled

a guest
Apr 19th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <unistd.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <sstream>
  12.  
  13. #define MAX_CLIENTS 5
  14. #define BUFLEN 256
  15.  
  16. void error(char *msg)
  17. {
  18. perror(msg);
  19. exit(0);
  20. }
  21.  
  22. class User{
  23. public:
  24. char name[12];
  25. char surname[12];
  26. int cardNumber;
  27. int pin;
  28. char password[16];
  29. double sold;
  30. bool inUse;
  31. int attempts;
  32. int sockfd;
  33.  
  34. User(char givenName[12], char givenSurname[12], int cardNumber,
  35. int pin, char givenPassword[12],
  36. double sold) : cardNumber(cardNumber), pin(pin), sold(sold) {
  37. strcpy(name, givenName);
  38. strcpy(surname, givenSurname);
  39. strcpy(password, givenPassword);
  40. inUse = false;
  41. attempts = 0;
  42. sockfd = -1;
  43. }
  44.  
  45. void printStats(){
  46. std::cout << "Name: " << name << " " << surname << " ";
  47. std::cout << "Card Number: " << cardNumber << ", PIN: " << pin << " ";
  48. std::cout << "Password: " << password << ", Sold: " << sold << std::endl;
  49. }
  50. };
  51.  
  52. User* getUserByCard(std::vector<User> users, int cardNumber){
  53. for(int i = 0; i < users.size(); ++i){
  54. if(users[i].cardNumber == cardNumber){
  55. User *ret = new User(users[i].name, users[i].surname, users[i].cardNumber, users[i].pin, users[i].password, users[i].sold);
  56. return ret;
  57. }
  58. }
  59. return nullptr;
  60. }
  61.  
  62. bool checkIfOpen(std::vector<int> cards, int card){
  63. for(int i = 0; i < cards.size(); ++i){
  64. if(cards[i] == card){
  65. return true;
  66. }
  67. }
  68. return false;
  69. }
  70.  
  71. bool checkIfSessionOpen(std::vector<User> users, int sockfd){
  72. for(int i = 0; i < users.size(); ++i){
  73. if(users[i].sockfd == sockfd){
  74. return true;
  75. }
  76. }
  77. return false;
  78. }
  79.  
  80. int main(int argc, char *argv[])
  81. {
  82. int tcp_fd, udp_fd, new_tcp_fd, portno;
  83. unsigned int clilen;
  84. char buffer[BUFLEN];
  85. struct sockaddr_in tcp_addr, new_tcp_addr, udp_addr;
  86. int numberOfUsers;
  87. int n, status;
  88. std::vector<User> users;
  89. std::vector<int> openCards;
  90.  
  91. FILE *fin = fopen(argv[2], "r");
  92.  
  93. fscanf(fin, "%d", &numberOfUsers);
  94. for(int i = 0; i < numberOfUsers; ++i){
  95. char name[12];
  96. char surname[12];
  97. int cardNumber;
  98. int pin;
  99. char password[16];
  100. double sold;
  101. fscanf(fin, "%s", name);
  102. fscanf(fin, "%s", surname);
  103. fscanf(fin, "%d", &cardNumber);
  104. fscanf(fin, "%d", &pin);
  105. fscanf(fin, "%s", password);
  106. fscanf(fin, "%lf", &sold);
  107. User *currUser = new User(name, surname, cardNumber, pin, password, sold);
  108. users.push_back(*currUser);
  109. }
  110.  
  111. tcp_fd = socket(AF_INET, SOCK_STREAM, 0);
  112. udp_fd = socket(AF_INET, SOCK_DGRAM, 0);
  113. if (tcp_fd < 0)
  114. printf("ERROR opening socket");
  115.  
  116. portno = atoi(argv[1]);
  117.  
  118. memset((char *) &tcp_addr, 0, sizeof(tcp_addr));
  119. tcp_addr.sin_family = AF_INET;
  120. tcp_addr.sin_addr.s_addr = INADDR_ANY; // foloseste adresa IP a masinii
  121. tcp_addr.sin_port = htons(portno);
  122.  
  123. if (bind(tcp_fd, (struct sockaddr *) &tcp_addr, sizeof(struct sockaddr)) < 0)
  124. printf("ERROR on binding");
  125.  
  126. if (bind(udp_fd, (struct sockaddr *) &tcp_addr, sizeof(struct sockaddr)) < 0)
  127. printf("ERROR on binding UDP");
  128.  
  129. listen(tcp_fd, 5);
  130.  
  131. //adaugam noul file descriptor (socketul pe care se asculta conexiuni) in multimea read_fds
  132.  
  133. fd_set read_fds; //multimea de citire folosita in select()
  134. fd_set tmp_fds; //multime folosita temporar
  135. int fdmax; //valoare maxima file descriptor din multimea read_fds
  136. //golim multimea de descriptori de citire (read_fds) si multimea tmp_fds
  137. FD_ZERO(&read_fds);
  138. FD_ZERO(&tmp_fds);
  139. FD_SET(tcp_fd, &read_fds);
  140. FD_SET(udp_fd, &read_fds);
  141. fdmax = std::max(tcp_fd, udp_fd);
  142. FD_SET(STDIN_FILENO, &read_fds);
  143.  
  144. // main loop
  145. while (1) {
  146. tmp_fds = read_fds;
  147. if (select(fdmax + 1, &tmp_fds, NULL, NULL, NULL) == -1)
  148. printf("ERROR in select");
  149.  
  150. for(int i = 0; i <= fdmax; i++) {
  151. if (FD_ISSET(i, &tmp_fds)) {
  152. if(i == STDIN_FILENO) {
  153. memset(buffer, 0, 255);
  154. fgets(buffer, 255, stdin);
  155. printf("Ai scris pe server: %s", buffer);
  156. if(strncmp(buffer, "quit", 4) == 0){
  157. printf("Closing server..\n");
  158. std::string buf = "quit";
  159. strcpy(buffer, buf.c_str());
  160. buffer[buf.size()] = '\0';
  161. FD_CLR(tcp_fd, &read_fds);
  162. FD_CLR(STDIN_FILENO, &read_fds);
  163. for(int k = 3; k <= fdmax; ++k){
  164. if(FD_ISSET(k, &read_fds)){
  165. printf("Sending to %d close message.\n", k);
  166. status = send(k, buffer, strlen(buffer), 0);
  167. FD_CLR(k, &read_fds);
  168. }
  169. }
  170. close(tcp_fd);
  171. return 0;
  172. }
  173. }
  174. else if (i == tcp_fd) {
  175. // a venit ceva pe socketul inactiv(cel cu listen) = o noua conexiune
  176. // actiunea serverului: accept()
  177. clilen = sizeof(new_tcp_addr);
  178. if ((new_tcp_fd = accept(tcp_fd, (struct sockaddr *)&new_tcp_addr, &clilen)) == -1) {
  179. printf("ERROR in accept");
  180. }
  181. else {
  182. //adaug noul socket intors de accept() la multimea descriptorilor de citire
  183. FD_SET(new_tcp_fd, &read_fds);
  184. if (new_tcp_fd > fdmax) {
  185. fdmax = new_tcp_fd;
  186. }
  187. }
  188. printf("Noua conexiune de la %s, port %d, socket_client %d\n ", inet_ntoa(new_tcp_addr.sin_addr), ntohs(new_tcp_addr.sin_port), new_tcp_fd);
  189. }
  190.  
  191. else if (i == udp_fd){
  192. clilen = sizeof(udp_addr);
  193. recvfrom(udp_fd, buffer, BUFLEN, 0, (struct sockaddr*) &udp_addr, &clilen);
  194. printf("WE DID IT REDDIT");
  195. }
  196.  
  197. else {
  198. // am primit date pe unul din socketii cu care vorbesc cu clientii
  199. //actiunea serverului: recv()
  200. memset(buffer, 0, BUFLEN);
  201. if ((n = recv(i, buffer, sizeof(buffer), 0)) <= 0) {
  202. if (n == 0) {
  203. //conexiunea s-a inchis
  204. printf("selectserver: socket %d hung up\n", i);
  205. } else {
  206. printf("ERROR in recv");
  207. }
  208. close(i);
  209. FD_CLR(i, &read_fds); // scoatem din multimea de citire socketul pe care
  210. }
  211.  
  212. else { //recv intoarce >0
  213. printf("Am primit de la clientul de pe socketul %d, mesajul: %s", i, buffer);
  214. // trimit mesajul inapoi
  215. std::string buf(buffer); // Have a buffer string
  216.  
  217. std::vector<std::string> tokens;
  218.  
  219. char *token = strtok(buffer, " \t");
  220. while (token) {
  221. std::string curr(token);
  222. tokens.push_back(curr);
  223. token = strtok(NULL, " \t");
  224. }
  225.  
  226. if(!checkIfSessionOpen(users, i) && tokens[0] != "login"){
  227. buf = ">ATM: -1 : Nu esti autentificat.";
  228. }
  229.  
  230. else if(tokens[0] == "login"){
  231. int tmpCardNumber = stoi(tokens[1]);
  232. int tmpPin = stoi(tokens[2]);
  233. User *aux = NULL;
  234. for(int k = 0; k < users.size(); ++k){
  235. if(users[k].cardNumber == tmpCardNumber){
  236. aux = &users[k];
  237. break;
  238. }
  239. }
  240. if(aux == NULL){
  241. buf = ">ATM: -4 : Numar card inexistent.";
  242. }
  243. else{
  244. if(checkIfOpen(openCards, tmpCardNumber)){
  245. buf = ">ATM: -2 : Sesiune deja deschisa.";
  246. }
  247. else if(aux->pin == tmpPin){
  248. openCards.push_back(tmpCardNumber);
  249. buf = ">ATM: Welcome, ";
  250. buf += aux->name;
  251. buf += " ";
  252. buf += aux->surname;
  253. aux->sockfd = i;
  254. }
  255. else{
  256. buf = "ATM: -3 : Pin gresit";
  257. }
  258. }
  259. }
  260. else if(tokens.size() == 1 && !strncmp(buffer, "logout", 6)){
  261. buf = ">ATM: Deconectare de la bancomat.";
  262. for(int k = 0; k < users.size(); ++k){
  263. if(users[k].sockfd == i){
  264. users[k].sockfd = -1;
  265. break;
  266. }
  267. }
  268. }
  269.  
  270. else if(tokens.size() == 1 && !strncmp(buffer, "listsold", 8)){
  271. buf = ">ATM: Sold: ";
  272. for(int k = 0; k < users.size(); ++k){
  273. if(users[k].sockfd == i){
  274. std::ostringstream strs;
  275. strs << users[k].sold;
  276. std::string str = strs.str();
  277. buf += str;
  278. break;
  279. }
  280. }
  281. }
  282.  
  283. else if(tokens[0] == "getmoney"){
  284. int money = stoi(tokens[1]);
  285. if(money % 10 != 0){
  286. buf = ">ATM: -9 : Suma nu este multiplu de 10.";
  287. }
  288. else{
  289. for(int k = 0; k < users.size(); ++k){
  290. if(users[k].sockfd == i){
  291. if(users[k].sold > money){
  292. buf = ">ATM: Suma ";
  293. std::ostringstream strs;
  294. strs << money;
  295. std::string str = strs.str();
  296. buf += str;
  297. buf += " a fost retrasa cu succes";
  298. users[k].sold -= money;
  299. }
  300. else{
  301. buf = ">ATM: -8 : Fonduri insuficiente.";
  302. }
  303. break;
  304. }
  305. }
  306. }
  307. }
  308. else if(tokens[0] == "putmoney"){
  309. double money = stod(tokens[1]);
  310. for(int k = 0; k < users.size(); ++k){
  311. if(users[k].sockfd == i){
  312. users[k].sold += money;
  313. buf = ">ATM: Suma a fost depusa cu succes.";
  314. }
  315. }
  316. }
  317. // else if(tokens.size() == 1 && !strncmp(buffer, "quit", 4)){
  318. // buf =
  319. // }
  320. else{
  321. buf = "None of the above";
  322. }
  323. strcpy(buffer, buf.c_str());
  324. buffer[buf.size()] = '\0';
  325. status = send(i, buffer, strlen(buffer) + 1, 0);
  326. }
  327. }
  328. }
  329. }
  330. }
  331.  
  332.  
  333. close(tcp_fd);
  334. fclose(fin);
  335. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement