Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <sys/wait.h>
  11. #include <signal.h>
  12. #include <pthread.h> // dla wątków
  13.  
  14. // funkcja wątku
  15. void *obsluga_servera (void *wzkaznik_des);
  16. int main()
  17. {
  18. int *new_sock;
  19. int listenfd, connfd; // nasłuchiwanie na listenfd, nowe połaczenia na connfd
  20.  
  21. socklen_t clilen;
  22.  
  23. struct sockaddr_in servaddr, cliaddr;
  24.  
  25. listenfd = socket (AF_INET,SOCK_STREAM,0); // tworzenie soceketa
  26.  
  27. if(listenfd == -1)
  28. {
  29. perror("Nie mozna stworzyc socketa \n");
  30. }
  31.  
  32. puts("socket stworzony");
  33. bzero(&servaddr, sizeof (servaddr));
  34.  
  35.  
  36. // Przygotuj strukturę sockaddr_in
  37.  
  38. servaddr.sin_family = AF_INET; // rodzina adresów służąca do określania typów adresu np protokół internetowy ipv4
  39. servaddr.sin_addr.s_addr = INADDR_ANY; // zawiera adres serwera
  40. servaddr.sin_port = htons(5000);
  41. if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0) // start serwera
  42. {
  43. perror("przypisanie bind nie udane"); // wydrukuj komunikat o błędzie
  44. return 1;
  45. }
  46. puts("bind zostal przypisany");
  47. listen(listenfd, 5); // wywolanie funkcji listenfd.
  48. // Liczba 5 określa ilość maksymalnych połączeń klienckich,
  49. // gdzie serwer ustawia w kolejności do tego odsłuchu
  50. puts("Oczekiwanie na polaczenie");
  51. clilen = sizeof(cliaddr);
  52.  
  53.  
  54. // // dołączanie , akceptacja klienta
  55. while ((connfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen)))
  56. {
  57. puts("Polaczenie zaakceptowane");
  58. pthread_t server_thread; // tworzenie wątku
  59. new_sock = malloc(1); // wczytanie // funkcja malloc zwraca wskaźnik do nowo przydzielonego bloku pamięci
  60. *new_sock = connfd;// jeżeli nie stworzy to usun
  61. pthread_create(&server_thread,NULL,obsluga_servera,(void*) new_sock); // zwraca wskaźnik NULL i przechodzi do komunikatu bledu
  62. }
  63.  
  64. if (connfd < 0)
  65. {
  66. perror("Niezaakceptowano polaczenia"); //nie można utowrzyć wątku
  67. return 1;
  68. }
  69. return 0;
  70. }
  71.  
  72.  
  73. void *obsluga_servera (void *wzkaznik_des)
  74. {
  75. printf("witaj\n");
  76. int sock = *(int *) wzkaznik_des; // Uzyskaj deskryptor gniazda
  77.  
  78. // Wysyłaj wiadomości do klienta
  79. // Odbierz wiadomość od klienta
  80.  
  81. int rozm_odczytu, rozm_zapisu;
  82. char *message;
  83. static char wiad_klienta[1000];
  84. message = "\nWitaj serverze \n";
  85.  
  86. static int send_once = 0;
  87. if (send_once < 1)
  88. {
  89. send_once++;
  90. }
  91. while((rozm_odczytu = recv(sock,wiad_klienta,1000,0)) > 0)
  92. {
  93. printf("odczytywanie rozmiaru %d \n", rozm_odczytu); // Wyślij wiadomość z powrotem do klienta
  94. write(sock,wiad_klienta,strlen(wiad_klienta));
  95. }
  96. if(rozm_odczytu == 0)
  97. {
  98. puts("client rozlaczony");
  99. fflush(stdout);
  100.  
  101. }
  102. else if(rozm_odczytu == -1)
  103. {
  104. perror("odbior nie udal sie");
  105.  
  106. }
  107. free(wzkaznik_des);
  108. return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement