Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <errno.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <sys/wait.h>
- #include <signal.h>
- #include <pthread.h> // dla wątków
- // funkcja wątku
- void *obsluga_servera (void *wzkaznik_des);
- int main()
- {
- int *new_sock;
- int listenfd, connfd; // nasłuchiwanie na listenfd, nowe połaczenia na connfd
- socklen_t clilen;
- struct sockaddr_in servaddr, cliaddr;
- listenfd = socket (AF_INET,SOCK_STREAM,0); // tworzenie soceketa
- if(listenfd == -1)
- {
- perror("Nie mozna stworzyc socketa \n");
- }
- puts("socket stworzony");
- bzero(&servaddr, sizeof (servaddr));
- // Przygotuj strukturę sockaddr_in
- servaddr.sin_family = AF_INET; // rodzina adresów służąca do określania typów adresu np protokół internetowy ipv4
- servaddr.sin_addr.s_addr = INADDR_ANY; // zawiera adres serwera
- servaddr.sin_port = htons(5000);
- if(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0) // start serwera
- {
- perror("przypisanie bind nie udane"); // wydrukuj komunikat o błędzie
- return 1;
- }
- puts("bind zostal przypisany");
- listen(listenfd, 5); // wywolanie funkcji listenfd.
- // Liczba 5 określa ilość maksymalnych połączeń klienckich,
- // gdzie serwer ustawia w kolejności do tego odsłuchu
- puts("Oczekiwanie na polaczenie");
- clilen = sizeof(cliaddr);
- // // dołączanie , akceptacja klienta
- while ((connfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen)))
- {
- puts("Polaczenie zaakceptowane");
- pthread_t server_thread; // tworzenie wątku
- new_sock = malloc(1); // wczytanie // funkcja malloc zwraca wskaźnik do nowo przydzielonego bloku pamięci
- *new_sock = connfd;// jeżeli nie stworzy to usun
- pthread_create(&server_thread,NULL,obsluga_servera,(void*) new_sock); // zwraca wskaźnik NULL i przechodzi do komunikatu bledu
- }
- if (connfd < 0)
- {
- perror("Niezaakceptowano polaczenia"); //nie można utowrzyć wątku
- return 1;
- }
- return 0;
- }
- void *obsluga_servera (void *wzkaznik_des)
- {
- printf("witaj\n");
- int sock = *(int *) wzkaznik_des; // Uzyskaj deskryptor gniazda
- // Wysyłaj wiadomości do klienta
- // Odbierz wiadomość od klienta
- int rozm_odczytu, rozm_zapisu;
- char *message;
- static char wiad_klienta[1000];
- message = "\nWitaj serverze \n";
- static int send_once = 0;
- if (send_once < 1)
- {
- send_once++;
- }
- while((rozm_odczytu = recv(sock,wiad_klienta,1000,0)) > 0)
- {
- printf("odczytywanie rozmiaru %d \n", rozm_odczytu); // Wyślij wiadomość z powrotem do klienta
- write(sock,wiad_klienta,strlen(wiad_klienta));
- }
- if(rozm_odczytu == 0)
- {
- puts("client rozlaczony");
- fflush(stdout);
- }
- else if(rozm_odczytu == -1)
- {
- perror("odbior nie udal sie");
- }
- free(wzkaznik_des);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement