Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.31 KB | None | 0 0
  1. #include "common.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/sendfile.h>
  7. #include <sys/stat.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netdb.h>
  11. #include <fcntl.h>
  12.  
  13. #define BUFF_SIZE 2048
  14. #define BUFF_SIZE_DOWN 1024
  15. #define TCP_PORT "2018"
  16. #define BACK_LOG 20
  17.  
  18. int d_flag = 0;
  19. int client_id = 1;
  20.  
  21. void debug_print(char *msg, client_state *curr_client){
  22. if(d_flag == 1){
  23. fprintf(stderr, "%s | Log: %s\n", curr_client->server_addr, msg);
  24. }
  25. }
  26.  
  27. char* stringing_id(){
  28. char *output = (char*) malloc(BUFF_SIZE);
  29. sprintf(output, "%d", client_id);
  30. return output;
  31. }
  32.  
  33. int recv_func(int client_sock){
  34. char serv_name[BUFF_SIZE];
  35. gethostname(serv_name, BUFF_SIZE);
  36. client_state *curr_client = (client_state*) malloc(sizeof(client_state));
  37. curr_client->client_id = 0;
  38. curr_client->sock_fd = -1;
  39. curr_client->conn_state = IDLE;
  40. curr_client->server_addr = serv_name;
  41. char buff[BUFF_SIZE];
  42. while(1){
  43. recv(client_sock, buff, BUFF_SIZE, 0);
  44. debug_print(buff, curr_client);
  45. if(!strncmp(buff, "Hello", strlen("Hello"))){
  46. if(curr_client->conn_state == IDLE){
  47. char* client_id_buff = stringing_id();
  48. int response_size = strlen("Hello ") + strlen(client_id_buff);
  49. char response[response_size];
  50. sprintf(response, "Hello %s", client_id_buff);
  51. send(client_sock, response, response_size, 0);
  52. printf("Client %s connected\n", client_id_buff);
  53. curr_client->conn_state = CONNECTED;
  54. curr_client->client_id = client_id_buff;
  55. curr_client->sock_fd = client_sock;
  56. free(client_id_buff);
  57. }
  58. else{
  59. send(client_sock, "nok state", strlen("nok state"), 0);
  60. }
  61. }
  62. else if(!strncmp(buff, "bye", strlen("bye"))){
  63. if(curr_client->conn_state == CONNECTED){
  64. char* client_id_buff = stringing_id();
  65. printf("Client %s diconnected\n", client_id_buff);
  66. close(client_sock);
  67. client_id++;
  68. free(client_id_buff);
  69. break;
  70. }
  71. else{
  72. send(client_sock, "nok state", strlen("nok state"), 0);
  73. }
  74. }
  75. else if(!strncmp(buff, "ls", strlen("ls"))){
  76. if(curr_client->conn_state != CONNECTED){
  77. char* client_id_buff = stringing_id();
  78. send(client_sock, "nok state", strlen("nok state"), 0);
  79. printf("Client %s diconnected\n", client_id_buff);
  80. close(client_sock);
  81. client_id++;
  82. free(client_id_buff);
  83. break;
  84. }
  85. else{
  86. char *output;
  87. if((output = list_dir()) != NULL){
  88. int status = 0;
  89. status = send(client_sock, "ok", strlen("ok"), 0);
  90. printf("first send: %d\n", status);
  91. status = send(client_sock, output, strlen(output), 0);
  92. printf("second send: %d\n", status);
  93. char output_buffer[BUFF_SIZE];
  94. getcwd(output_buffer, BUFF_SIZE);
  95. printf("Listed files at %s\n", output_buffer);
  96. }
  97. }
  98. }
  99. else if(!strncmp(buff, "get", strlen("get"))){
  100. if(curr_client->conn_state == CONNECTED){
  101. int i = 0;
  102. while(buff[i++] != ' ');
  103. long file_s = file_size(buff + i);
  104. if(file_s == -1){
  105. char* client_id_buff = stringing_id();
  106. send(client_sock, "nok file", strlen("nok file"), 0);
  107. printf("Client %s diconnected\n", client_id_buff);
  108. close(client_sock);
  109. client_id++;
  110. free(client_id_buff);
  111. break;
  112. }
  113. off_t offset=0;
  114. char* file_name = (buff + i);
  115. memset(buff, 0, BUFF_SIZE_DOWN);
  116. sprintf(buff, "ok %ld ", file_s);
  117. send(curr_client->sock_fd, buff, strlen(buff), 0);
  118. sleep(1);
  119. int fd, len = 0;
  120. fd = open(file_name, O_RDONLY);
  121. curr_client->conn_state = DOWNLOADING;
  122. sendfile(curr_client->sock_fd, fd, &offset, file_s);
  123. memset(buff, 0, BUFF_SIZE_DOWN);
  124. recv(curr_client->sock_fd, buff, BUFF_SIZE_DOWN, 0);
  125. if(!strncmp(buff, "done", strlen("done"))){
  126. curr_client->conn_state = CONNECTED;
  127. memset(buff, 0, BUFF_SIZE_DOWN);
  128. send(curr_client->sock_fd, "ok", strlen("ok"), 0);
  129. printf("Sent file %s\n", file_name);
  130. }
  131. else{
  132. char* client_id_buff = stringing_id();
  133. send(client_sock, "nok done", strlen("nok done"), 0);
  134. printf("Client %s diconnected\n", client_id_buff);
  135. close(client_sock);
  136. client_id++;
  137. free(client_id_buff);
  138. break;
  139. }
  140. }
  141. else{
  142. char* client_id_buff = stringing_id();
  143. send(client_sock, "nok state", strlen("nok state"), 0);
  144. printf("Client %s diconnected\n", client_id_buff);
  145. close(client_sock);
  146. client_id++;
  147. free(client_id_buff);
  148. break;
  149. }
  150. }
  151. else{
  152. char* client_id_buff = stringing_id();
  153. send(client_sock, "nok message", strlen("nok message"), 0);
  154. printf("Client %s diconnected\n", client_id_buff);
  155. close(client_sock);
  156. client_id++;
  157. free(client_id_buff);
  158. break;
  159. }
  160. }
  161. free(curr_client);
  162. return 1;
  163. }
  164.  
  165. int main(int argc, char const *argv[]){
  166. int server_sock, client_sock;
  167. struct sockaddr client_addr;
  168. socklen_t addr_size = sizeof(struct sockaddr);
  169. memset(&client_addr, 0, addr_size);
  170. int status, yes = 1;
  171. struct addrinfo *hints = (struct addrinfo*) malloc(sizeof(struct addrinfo));
  172. hints->ai_family = AF_UNSPEC;
  173. hints->ai_socktype = SOCK_STREAM;
  174. hints->ai_flags = AI_PASSIVE;
  175.  
  176. struct addrinfo *res;
  177. if(!(status = getaddrinfo(NULL, TCP_PORT, hints, &res))){
  178. while(res){
  179. if((server_sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1){
  180. res = res->ai_next;
  181. continue;
  182. }
  183. else{
  184. break;
  185. }
  186. }
  187. if(!res){
  188. perror("no address to connect");
  189. }
  190. else{
  191. while(1){
  192. setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
  193. bind(server_sock, res->ai_addr, res->ai_addrlen);
  194. listen(server_sock, BACK_LOG);
  195. client_sock = accept(server_sock, &client_addr, &addr_size);
  196. recv_func(client_sock);
  197. }
  198. }
  199. }
  200. free(hints);
  201. return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement