Guest User

Untitled

a guest
Apr 26th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <netinet/in.h>
  3. #include <sys/socket.h>
  4. #include <sys/types.h>
  5. #include <netdb.h>
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <service.h>
  9.  
  10. int compute(char part[12], int base) {
  11.  
  12. char* p = part;
  13. int v = base;
  14.  
  15. while ((*p) && (p < part + 8))
  16. v = v + *(p++);
  17.  
  18. return v;
  19. }
  20.  
  21.  
  22. int validate (char* sn) {
  23.  
  24. int value1, value2;
  25. char buf[8];
  26.  
  27. sn[8] = 0;
  28. strcpy(buf, sn);
  29. value1 = compute(buf, 0);
  30.  
  31. strcpy(buf, (sn + 9));
  32. value2 = compute(buf, 0x41414141);
  33.  
  34. return value1 == value2;
  35. }
  36.  
  37.  
  38. void session(int cliSd)
  39. {
  40. char buff[28];
  41. int recv_size, end_ptr = 0, done = 0;
  42.  
  43. struct sockaddr_in cliAddr;
  44. int cliLen;
  45. cliLen = sizeof(cliAddr);
  46. getpeername(cliSd, (struct sockaddr *)&cliAddr, &cliLen);
  47. printf("%s\t: Connected\n", inet_ntoa(cliAddr.sin_addr));
  48.  
  49. send (cliSd, "Please enter your serial number:\r\n", 35, 0);
  50. while (!done) {
  51. recv_size = recv (cliSd, (char *) buff + end_ptr, sizeof (buff) - end_ptr, 0);
  52.  
  53. if (recv_size == 0) break;
  54. if (recv_size == -1) continue;
  55.  
  56. end_ptr += recv_size;
  57. if ((buff[end_ptr - 1] == 0) && end_ptr > 0) end_ptr--;
  58.  
  59. if ((buff[end_ptr - 1] == '\n') || (buff[end_ptr - 1] == '\r')) {
  60. buff[end_ptr - 1] = 0;
  61. if (validate(buff)) {
  62. done = 1;
  63. printf("%s\t: Succeeded!! <------------------\n", inet_ntoa(cliAddr.sin_addr));
  64. send (cliSd, "Thanks you for your registration.\r\n", 36, 0);
  65. send (cliSd, "The confirmation number is " CONFIRM_CODE "\r\n", 30 + sizeof(CONFIRM_CODE), 0);
  66. } else {
  67. send (cliSd, "Sorry, wrong serial number.\r\n", 29, 0);
  68. end_ptr = 0;
  69. }
  70. }
  71. }
  72.  
  73. printf("%s\t: Disconnected or bad overflow\n", inet_ntoa(cliAddr.sin_addr));
  74. close(cliSd);
  75. }
  76.  
  77.  
  78. int main () {
  79. struct sockaddr_in servAddr;
  80. int servSd, cliSd;
  81. int one = 1;
  82.  
  83. servSd = socket (PF_INET, SOCK_STREAM, 0);
  84. setsockopt (servSd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof (one));
  85. servAddr.sin_family = AF_INET;
  86. servAddr.sin_port = htons (12345);
  87. servAddr.sin_addr.s_addr = htonl (INADDR_ANY);
  88.  
  89. if (bind (servSd, (struct sockaddr *) &servAddr, sizeof (servAddr)) < 0){ perror ("Can't bind\n"); return 1;}
  90. if (listen (servSd, 3) < 0) { perror ("Can't listen\n"); return 1;}
  91.  
  92. while (1){
  93. printf ("Server is ready!\n");
  94. cliSd = accept (servSd, NULL, NULL);
  95. if (fork()==0){
  96. session(cliSd);
  97. return 0;
  98. }
  99. }
  100.  
  101. return 0;
  102. }
Add Comment
Please, Sign In to add comment