Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <netinet/in.h>
  8. #include <arpa/inet.h>
  9. #include <sys/mman.h>
  10. #include <sys/stat.h>
  11. #include <fcntl.h>
  12.  
  13. #define PORT 29012
  14. #define SIZE (20 * sizeof(int))
  15. #define FILEPATH "clients.bin"
  16. #define TEXT_SIZE 1024
  17.  
  18. struct shared_data {
  19. int data;
  20. int clients[20];
  21. };
  22.  
  23. struct queue {
  24. int number;
  25. int sent;
  26. char message[TEXT_SIZE];
  27. };
  28.  
  29. struct cli_number{
  30. int n;
  31. };
  32.  
  33.  
  34. void goodbye(int client) {
  35.  
  36.  
  37.  
  38. }
  39.  
  40. int main(){
  41.  
  42. int sockfd, ret;
  43. struct sockaddr_in serverAddr;
  44. int newSocket;
  45. struct sockaddr_in newAddr;
  46. socklen_t addr_size;
  47. char buffer[1024];
  48. pid_t childpid;
  49. int fd, result;
  50. int number=-1;
  51.  
  52. struct shared_data *shared_clients, *child;
  53. struct queue *shared_queue;
  54. struct cli_number *ptr;
  55. const char *shm_name = "projekt", *name = "queue", *ptrname = "nazwa";
  56. int shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0666);
  57. int queue_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
  58. int desc = shm_open(ptrname, O_CREAT | O_RDWR, 0666);
  59. int child_fd;
  60. ftruncate(shm_fd, sizeof(struct shared_data));
  61. ftruncate(queue_fd, sizeof(struct queue));
  62. ftruncate(desc, sizeof(struct cli_number));
  63. shared_clients = mmap(0, sizeof(struct shared_data), PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
  64. shared_queue = mmap(0, sizeof(struct queue), PROT_READ | PROT_WRITE, MAP_SHARED, queue_fd, 0);
  65. ptr = mmap(0, sizeof(struct cli_number), PROT_READ | PROT_WRITE, MAP_SHARED, desc, 0);
  66. if (shared_clients == MAP_FAILED) {
  67. printf("mmap - failed.\n");
  68. return -1;
  69. }
  70. if (shared_queue == MAP_FAILED) {
  71. printf("mmap queue - failed.\n");
  72. return -1;
  73. }
  74. if (ptr == MAP_FAILED) {
  75. printf("mmap ptr - failed.\n");
  76. return -1;
  77. }
  78. shared_clients->data = -1; //zmieniałam z 0 na -1, żeby pętla zaczęła klientów numerować od 0 jak w normalnej tablicy
  79. shared_queue->number= -1;
  80. shared_queue->sent=-1;
  81. ptr->n = 0;
  82.  
  83.  
  84. sockfd = socket(AF_INET, SOCK_STREAM, 0);
  85. if(sockfd < 0){
  86. printf("Error in connection.\n");
  87. exit(1);
  88. }
  89. printf("Server Socket is created.\n");
  90.  
  91. memset(&serverAddr, '\0', sizeof(serverAddr));
  92. serverAddr.sin_family = AF_INET;
  93. serverAddr.sin_port = htons(PORT);
  94. serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  95.  
  96. ret = bind(sockfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
  97. if(ret < 0){
  98. printf("Error in binding.\n");
  99. exit(1);
  100. }
  101. printf("Bind to port %d\n", PORT);
  102.  
  103. if(listen(sockfd, 10) == 0){
  104. printf("Listening....\n");
  105. }else{
  106. printf("Error in binding.\n");
  107. }
  108.  
  109.  
  110. while(1){
  111.  
  112. newSocket = accept(sockfd, (struct sockaddr*)&newAddr, &addr_size);
  113. if(newSocket < 0){
  114. exit(1);
  115. }
  116. ptr->n++;
  117.  
  118. shared_clients->data++; ///zwiększam liczbę otwartych socketów
  119. printf("Connection accepted from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
  120. shared_clients->clients[data] = newSocket; //zmieniłam z clients[ptr->n -1] na clients[data], co bardziej logiczne xd
  121. shared_clients->clients[data+1] = 0; //żeby w algorytmie czyszczenia tablicy po kliencie mogło wszystko działać
  122.  
  123. //shared_clients->data = ptr->n;
  124. printf("socket: %d\n", newSocket);
  125. if((childpid = fork()) == 0){
  126. int my_number = ptr->n; //zmieniłam z prt->n na clients[data] (mogłoby tż być newSocket), żeby klient pamiętał swój socket
  127. int pid;
  128. close(sockfd);
  129. child_fd = shm_open(shm_name, O_RDONLY, 0666);
  130. child = mmap(0, sizeof(struct shared_data), PROT_READ , MAP_SHARED, child_fd, 0);
  131. if (child == MAP_FAILED) {
  132. printf("mmap - failed (in child).\n");
  133. return -1;
  134. }
  135. if((pid=fork()) == 0) {
  136. while(1) {
  137.  
  138. if(my_number == shared_clients->clients[data]) { //było == ptr->n ma wyświetlić socket ostatniego klienta
  139. if(shared_queue->number > shared_queue->sent) {
  140. printf("Messages sent: %d\n", shared_queue->sent);
  141. int sent = 0;
  142.  
  143. for(int i=0; i < shared_clients->data; i=i+1) {
  144. printf("Sending %s to: %d\n", shared_queue->message, shared_clients->clients[i]);
  145. sent = send(shared_clients->clients[i], shared_queue->message, 1024, 0);
  146. printf("Bytes sent: %d\n", sent);
  147.  
  148. }
  149. bzero(shared_queue->message, 1024);
  150. shared_queue->sent++;
  151. }
  152. } else //NIE MOŻE ZRYWAĆ PĘTLI!!!
  153. sleep(1);
  154. }
  155. }
  156. else {
  157. while(1) {
  158. bzero(buffer, sizeof(buffer));
  159. int received = 0;
  160. if ((received = recv(newSocket, buffer, 1024, 0))>0) {
  161. printf("Received: %d\n", received);
  162. printf("%s\n", buffer);
  163. if(strcmp(buffer, ":exit") == 0){
  164. printf("Disconnected from %s:%d\n", inet_ntoa(newAddr.sin_addr), ntohs(newAddr.sin_port));
  165. //ptr->n--;
  166.  
  167. for(int j=0; j < shared_clients->data; j++) {
  168.  
  169. if(shared_clients[j] == my_number){
  170.  
  171. for (int k = shared_clients[j]; k <= shared_clients[data]; k++)
  172.  
  173. shared_clients[k] == shared_clients[k+1];
  174.  
  175. break;
  176. }
  177. }
  178.  
  179.  
  180. //funkcja zapełniająca dziurę w clients[]
  181. shared_clients->data--;
  182. close(newSocket);
  183. break;
  184. }else{
  185. shared_queue->number++;
  186. printf("Will be writing message to memory\n");
  187. sprintf(shared_queue->message, "%s", buffer);
  188. printf("Message %s writen to memory\n", shared_queue->message);
  189. }
  190. }
  191. }
  192. }
  193. }
  194. }
  195.  
  196. close(newSocket);
  197.  
  198. return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement