Advertisement
Guest User

Untitled

a guest
Jan 5th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.94 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <sqlite3.h>
  10. /* portul folosit */
  11. #define PORT 2099
  12. /* codul de eroare returnat de anumite apeluri */
  13. extern int errno;
  14.  
  15. static int call(void *data,int argc, char **argv, char **azColName)
  16. {
  17. if (argv==NULL)
  18. return 0;
  19. else
  20. return 4;
  21. }
  22. int makeUserOnline(char userName[30])
  23. {
  24. sqlite3 *db;
  25. char *zErrMsg = 0;
  26. int rc;
  27. char *sql;
  28. rc = sqlite3_open("data.db", &db);
  29. sql=(char*)malloc(100);
  30. bzero(sql,100);
  31. strcpy(sql,"INSERT into online_users (username) values('");
  32. strcat(sql,userName);
  33. strcat(sql,"')");
  34. rc = sqlite3_exec(db, sql, call, NULL, &zErrMsg);
  35. if( rc != SQLITE_OK && rc!=4)
  36. {
  37. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  38. sqlite3_free(zErrMsg);
  39. }
  40. else
  41. {
  42. fprintf(stdout, "Adaugat la lista utilizatorilor conectati \n");
  43. }
  44.  
  45. return rc;
  46.  
  47. }
  48.  
  49. int makeUserOffline(char userName[30])
  50. {
  51. sqlite3 *db;
  52. char *zErrMsg = 0;
  53. int rc;
  54. char *sql;
  55. rc = sqlite3_open("data.db", &db);
  56. sql=(char*)malloc(100);
  57. bzero(sql,100);
  58. strcpy(sql,"DELETE from online_users WHERE username='");
  59. strcat(sql,userName);
  60. strcat(sql,"'");
  61. rc = sqlite3_exec(db, sql, call, NULL, &zErrMsg);
  62. if( rc != SQLITE_OK && rc!=4)
  63. {
  64. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  65. sqlite3_free(zErrMsg);
  66. }
  67. else
  68. {
  69. fprintf(stdout, "Adaugat la lista utilizatorilor deconectati \n");
  70. }
  71.  
  72. return rc;
  73. }
  74.  
  75. void querryAnswer(int rc, char answer[100],char*zErrMsg)
  76. {
  77. if( rc != SQLITE_OK && rc!=4)
  78. {
  79. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  80. sqlite3_free(zErrMsg);
  81. }
  82. else
  83. {
  84. fprintf(stdout,"%s\n", answer);
  85. }
  86.  
  87. }
  88.  
  89. void selectOption(int client,int optiune)
  90. {
  91. if (read (client, &optiune,sizeof(optiune)) <= 0)
  92. {
  93. perror ("[server]Eroare la read() de la client.\n");
  94. //close (client); /* inchidem conexiunea cu clientul */
  95. }
  96.  
  97. // Pregatim structurile si descriptorii pentru a accesa baza de date
  98. sqlite3 *db;
  99. char *zErrMsg = 0;
  100. int rc;
  101. char *sql;
  102. rc = sqlite3_open("data.db", &db);
  103. if( rc )
  104. {
  105. fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
  106. exit(-1);
  107. }
  108. else
  109. {
  110. fprintf(stderr, "Opened database successfully\n");
  111. }
  112.  
  113.  
  114.  
  115. char userName[30];
  116. char password[30];
  117. char answer[150];
  118. int online_status;
  119. switch(optiune)
  120. {
  121. case 1: // LOGIN
  122. if (read (client, userName, 30) <= 0)
  123. {
  124. perror ("[server]Eroare la read() de la client.\n");
  125. close (client);
  126. }
  127.  
  128. if (read (client, password, 30) <= 0)
  129. {
  130. perror ("[server]Eroare la read() de la client.\n");
  131. close (client);
  132. }
  133.  
  134. /// Verificam daca ii gasim in baza de date
  135. sql=(char*)malloc(100);
  136. bzero(sql,100);
  137. strcat(sql,"SELECT * from USERS WHERE userName='");
  138. strcat(sql,userName);
  139. strcat(sql,"' AND password='");
  140. strcat(sql,password);
  141. strcat(sql,"'");
  142.  
  143. rc = sqlite3_exec(db, sql, call, NULL, &zErrMsg);
  144. querryAnswer(rc,"S-a logat un utilizator!",zErrMsg);
  145.  
  146. if(rc ==4 ) //USER LOGAT CU SUCCES
  147. {
  148. int online_status=makeUserOnline(userName);
  149. bzero(answer,150);
  150. strcat(answer,"Te-ai logat cu succes!\nDoriti sa consultati meniul?");
  151. if (write (client,answer,150) <= 0)
  152. {
  153. perror ("[client]Eroare la write() spre server.\n");
  154. exit(-1);
  155. }
  156.  
  157. /// Clientul alege daca sa folosesca meniul sau nu
  158. int meniu_accesat;
  159. if (read (client, &meniu_accesat,sizeof(meniu_accesat)) <= 0)
  160. {
  161. perror ("[server]Eroare la read() de la client.\n");
  162. close (client);
  163. }
  164.  
  165. if(meniu_accesat == 0)
  166. {
  167. printf("Un client a ales deconectarea \n");
  168. online_status=makeUserOffline(userName);
  169. close(client);
  170. }
  171.  
  172. else
  173. {
  174. printf("Meniul a fost accesat ! \n");
  175. }
  176.  
  177.  
  178.  
  179. }
  180. else if(rc ==0)
  181. {
  182. bzero(answer,50);
  183. strcat(answer,"Nu exista un user cu acest nume/parola!\n");
  184. if (write (client,answer,50) <= 0)
  185. {
  186. perror ("[client]Eroare la write() spre server.\n");
  187. exit(-1);
  188. }
  189. close(client);
  190. }
  191.  
  192. //Trebuie sa trimit mesajele primite
  193. // Aici o sa primesc comenzile pt celalat meniu
  194. break;
  195.  
  196. case 2: // INREGISTRARE
  197.  
  198. if (read (client, userName, 30) <= 0)
  199. {
  200. perror ("[server]Eroare la read() de la client.\n");
  201. close (client);
  202. }
  203.  
  204. if (read (client, password, 30) <= 0)
  205. {
  206. perror ("[server]Eroare la read() de la client.\n");
  207. close (client);
  208. }
  209.  
  210. // Verific daca user-ul este deja folosit
  211. sql=(char*)malloc(100);
  212. bzero(sql,100);
  213. strcat(sql,"SELECT * from USERS WHERE userName='");
  214. strcat(sql,userName);
  215. strcat(sql,"'");
  216.  
  217. rc = sqlite3_exec(db, sql, call, NULL, &zErrMsg);
  218. querryAnswer(rc,"Operation done successfully!",zErrMsg);
  219.  
  220.  
  221. if(rc ==4)
  222. {
  223. bzero(answer,50);
  224. strcat(answer,"Exista un alt user cu acest nume!\n");
  225. if (write (client,answer,50) <= 0)
  226. {
  227. perror ("[client]Eroare la write() spre server.\n");
  228. exit(-1);
  229. }
  230. }
  231.  
  232. else if(rc==0)
  233. {
  234. sql=(char*)malloc(100);
  235. bzero(sql,100);
  236. strcpy(sql,"INSERT into USERS(userName,password) values('");
  237. strcat(sql,userName);
  238. strcat(sql,"','");
  239. strcat(sql,password);
  240. strcat(sql,"')");
  241.  
  242. int rc2;
  243. rc2 = sqlite3_exec(db, sql, call, NULL, &zErrMsg);
  244. if( rc2 != SQLITE_OK && rc2!=4)
  245. {
  246. fprintf(stderr, "SQL error: %s\n", zErrMsg);
  247. sqlite3_free(zErrMsg);
  248. }
  249. else
  250. {
  251. fprintf(stdout, "Am inregistrat un nou user !\n");
  252. bzero(answer,50);
  253. strcat(answer,"Ai fost inregistrat !\n");
  254. if (write (client,answer,50) <= 0)
  255. {
  256. perror ("[client]Eroare la write() spre server.\n");
  257. exit(-1);
  258. }
  259.  
  260. }
  261.  
  262. }
  263.  
  264. break;
  265. case 3:
  266. printf("Un client a ales deconectarea \n");
  267. close(client);
  268. exit(-1);
  269. break;
  270. default:
  271. printf("Optiune introdusa gresit !\n");
  272. close(client);
  273. exit(-1);
  274. break;
  275.  
  276. }
  277. }
  278.  
  279. int main ()
  280. {
  281. struct sockaddr_in server;
  282. struct sockaddr_in from;
  283. int sd;
  284. if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
  285. {
  286. perror ("[server]Eroare la socket().\n");
  287. return errno;
  288. }
  289. bzero (&server, sizeof (server));
  290. bzero (&from, sizeof (from));
  291. server.sin_family = AF_INET;
  292. server.sin_addr.s_addr = htonl (INADDR_ANY);
  293. server.sin_port = htons (PORT);
  294. if (bind (sd, (struct sockaddr *) &server, sizeof (struct sockaddr)) == -1)
  295. {
  296. perror ("[server]Eroare la bind().\n");
  297. return errno;
  298. }
  299. if (listen (sd, 5) == -1)
  300. {
  301. perror ("[server]Eroare la listen().\n");
  302. return errno;
  303. }
  304.  
  305.  
  306. while (1)
  307. {
  308. int client;
  309. int length = sizeof (from);
  310. printf ("[server]Asteptam la portul %d...\n",PORT);
  311. fflush (stdout);
  312. client = accept (sd, (struct sockaddr *) &from, &length);
  313. if (client < 0)
  314. {
  315. perror ("[server]Eroare la accept().\n");
  316. continue;
  317. }
  318. printf("%d\n",client);
  319. pid_t pd;
  320. pd = fork();
  321.  
  322. if(pd == 0)
  323. {
  324. fflush (stdout);
  325. int optiune;
  326. selectOption(client,optiune);
  327. }
  328.  
  329. }
  330. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement