/FallingSandpaper/jni/server.c

http://thelements.googlecode.com/ · C · 179 lines · 99 code · 20 blank · 60 comment · 20 complexity · f4e5a4aa83fb988a61922c4bd23cbc37 MD5 · raw file

  1. /*
  2. * server.c
  3. * --------------------------
  4. * Defines functions for building the buffer,
  5. * sending it to the server, and receiving and
  6. * storing the return data.
  7. */
  8. #include "server.h"
  9. void adduserpass (void)
  10. {
  11. /*
  12. * Add the username and password to the save buffer. This happens every time, thus the
  13. * need for a separate function.
  14. */
  15. int i; //Counter variable
  16. //Fill in username
  17. for (i = 4; i < 4 + userlength; i++)
  18. {
  19. buffer[i] = username[i];
  20. }
  21. //Add the null byte as the delimiter
  22. buffer[4 + userlength] = (char) 0;
  23. //Fill in password
  24. for (i = 4 + userlength + 1; i < 4 + userlength + 1 + passlength; i++)
  25. {
  26. buffer[i] = password[i];
  27. }
  28. //Add the null byte as the delimiter
  29. buffer[4 + userlength + 1 + passlength] = 0;
  30. }
  31. void buildbuffer(int type)
  32. {
  33. /*
  34. * Build the buffer to be sent (int buffer[]).
  35. */
  36. int i = 0;
  37. //Save data
  38. if(type == 0)
  39. {
  40. //The length of the packet, 3 bytes for length, 1 byte for command, rest for data
  41. bufferlength = 3 + 1 + (userlength+1) + (passlength+1) + (2*TPoints*4);
  42. //Fill in the 3 length bytes
  43. buffer[0] = (char)(bufferlength >> 16);
  44. buffer[1] = (char)(bufferlength % (256 * 256) >> 8);
  45. buffer[2] = (char)(bufferlength % (256 * 256 * 256));
  46. //The command byte is 0
  47. buffer[3] = (char)0;
  48. //Put in username and password
  49. adduserpass();
  50. //Fill in the save data
  51. for (i = 4 + (userlength+1) + (passlength+1); i < (2*TPoints*4) + (userlength+1) + (passlength+1); i++)
  52. {
  53. buffer[i] = (char) (spawn[i / 8] >> 8);
  54. buffer[++i] = (char) (spawn[(i - 1) / 8] % 256);
  55. buffer[++i] = (char) ((int)(x[(i - 2) / 8]) >> 8);
  56. buffer[++i] = (char) ((int)(x[(i - 3) / 8]) % 256);
  57. buffer[++i] = (char) (((int)y[(i - 4) / 8]) >> 8);
  58. buffer[++i] = (char) ((int)(y[(i - 5) / 8]) % 256);
  59. buffer[++i] = (char) (element[(i - 6) / 8] >> 8);
  60. buffer[++i] = (char) (element[(i - 7) / 8] % 256);
  61. }
  62. //SEND DATA HERE
  63. }
  64. //Load a save
  65. else if (type == 1)
  66. {
  67. //Length of the packets: 3 bytes for length, 1 byte for command, rest of user and pass data
  68. bufferlength = 3 + 1 + (userlength + 1) + (passlength + 1);
  69. //Fill in length data
  70. buffer[0] = (char)(bufferlength >> 16);
  71. buffer[1] = (char)(bufferlength % (256 * 256) >> 8);
  72. buffer[2] = (char)(bufferlength % (256 * 256 * 256));
  73. //Command byte is 1
  74. buffer[3] = (char)1;
  75. //Put in username and password
  76. adduserpass();
  77. //Add the data for what file
  78. //SEND DATA HERE
  79. }
  80. //Validate username and password
  81. else if (type == 2)
  82. {
  83. //Length of the packets: 3 bytes for length, 1 byte for command, rest of user and pass data
  84. bufferlength = 3 + 1 + (userlength + 1) + (passlength + 1);
  85. //Fill in length data
  86. buffer[0] = (char)(bufferlength >> 16);
  87. buffer[1] = (char)(bufferlength % (256 * 256) >> 8);
  88. buffer[2] = (char)(bufferlength % (256 * 256 * 256));
  89. //Command byte is 2
  90. buffer[3] = (char)2;
  91. //Put in username and password
  92. adduserpass();
  93. //SEND DATA HERE
  94. }
  95. //Register a username with a password
  96. else if (type == 3)
  97. {
  98. //Length of packet: 3 bytes for length, 1 byte for command, rest for user and pass data
  99. bufferlength = 3 + 1 + (userlength + 1) + ( passlength + 1 );
  100. //Fill in length bytes
  101. buffer[0] = (char)(bufferlength >> 16);
  102. buffer[1] = (char)(bufferlength % (256 * 256) >> 8);
  103. buffer[2] = (char)(bufferlength % (256 * 256 * 256));
  104. //Command is 3
  105. buffer[3] = (char)3;
  106. //Put in username and password
  107. adduserpass();
  108. //SEND DATA HERE
  109. }
  110. //Send custom element data (still not used)
  111. else if (type = 4)
  112. {
  113. /*
  114. int length = 3 + 1 + (TElements * 2);
  115. buffer[0] = (char)(length >> 16);
  116. buffer[1] = (char)(length % (256 * 256) >> 8);
  117. buffer[2] = (char)(length % (256 * 256 * 256));
  118. buffer[3] = (char)1;
  119. for (i = 4; i < 2 * TElements; i++)
  120. {
  121. buffer[i] = (char) (colliseelement1[i / 2]);
  122. buffer[++i] = (char) (collision[22][(i - 1) / 2]);
  123. }
  124. */
  125. }
  126. }
  127. int sendbuffer(void)
  128. {
  129. /*
  130. * Create the socket and send the buffer that was previously created.
  131. */
  132. sockfd = socket(AF_INET, SOCK_STREAM, 0); //Create a socket using IPv4 and TCP
  133. if(sockfd < 0)
  134. {
  135. error = "Could not create socket";
  136. return 0;
  137. }
  138. server = gethostbyname(SERVER_IP); //Create the hostent using server IP
  139. bzero((char*) &serv_addr, sizeof(serv_addr)); //Clear the serv_addr struct
  140. serv_addr.sin_family = AF_INET; //Use IPv4
  141. bcopy((char*)server->h_addr, (char*)&serv_addr.sin_addr.s_addr, server->h_length); //Use the hostent to fill the serv_addr struct
  142. serv_addr.sin_port = htons(PORTNUM); //Set up the port number using network order
  143. if(connect(sockfd, &serv_addr, sizeof(serv_addr)) < 0)
  144. {
  145. error = "Could not connect";
  146. return 0;
  147. }
  148. while(bufferlength > 0)
  149. {
  150. n = write(sockfd, buffer, bufferlength);
  151. if(n < 0)
  152. {
  153. error = "Could not write to socket";
  154. return 0;
  155. }
  156. bufferlength -= n;
  157. }
  158. return 1;
  159. }