Pokaż wyniki 1 do 4 z 4

Temat: serwerek w c

  1. #1
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie serwerek w c

    No więc napisałem coś takiego:
    Kod:
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <unistd.h>
    #include <fcntl.h>
    
    #include <errno.h>
    #include <string.h>
    
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/stat.h>
    
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/wait.h>
    #include <signal.h>
    
    #define CLIENTS_WAITING 10 
    #define BUFSIZE 20
    
    #define LOGIN "login"
    #define PASS "password"
    
    void server_run() ;
    void login_user() ;
    void exec_commands() ;
    void send_com_req() ;
    
    int check_login_pass_user(const char *login, const char *pass) ;
    
    int accepted ;
    
    int main(int argc, char *argv[])
    {
    
    
    int port = atoi(argv[1]) ;
    
    int sockfd = socket(PF_INET, SOCK_STREAM, 0) ;
    
    struct sockaddr_in my_addr ;
    struct sockaddr_in their_addr ;
    
    my_addr.sin_family = PF_INET ;
    my_addr.sin_port = htons(port) ;
    my_addr.sin_addr.s_addr = INADDR_ANY ;
    memset(&(my_addr.sin_zero), '\0', 8) ; 
    
    if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))  == -1)
    {
    
    	perror("bind") ;
    	exit(1) ;	
    
    }
    
    int yes = 1 ;
    
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
           
    	perror("setsockopt") ;
            exit(1) ;
    } 
    
    if(listen(sockfd, CLIENTS_WAITING) == -1)
    {
    
    	perror("listen") ;
    	exit(1) ;
    
    }
    
    int size = sizeof(struct sockaddr) ;
    
    while(1)
    {
    
    	if((accepted = accept(sockfd, (struct sockaddr *)&their_addr, &size)) == -1) 
    	{
    
    		perror("accept") ;
    		continue ;
    
    	}
    
    	if(!fork())
    	{
    
    		server_run() ;
    		close(accepted) ;
    		exit(0) ;
    
    	}
    
    close(accepted) ; //na koniec while'a zamykamy gniazdko
    
    }
    
    exit(0) ; //koniec programu :)
    
    }
    
    
    void server_run()
    {
    
    	login_user() ;
    	exec_commands() ;
    
    }
    
    void exec_commands()
    {
    
    	char command[BUFSIZE] ;
    	long bytes = -10 ;
    
    	while(1)
    	{
    
    		send_com_req() ;
    
    		while(bytes < 1) 
    		{
    
    			if((bytes = recv(accepted, &command, BUFSIZE, 0)) == -1) perror("recv") ;
    
    		}
    
    		/* Te dwie linijki po to, żeby wywalić dwa niepotrzebne znaki, które pojawiają się na końcu tekstu w tablicy */
    		bytes -= 2 ;
    		memset(&(command[bytes]), 0, BUFSIZE - bytes) ;
    
              
    
    		if(strcmp(command, "exitshell") == 0) break ;
    
    		FILE *fd = popen(command, "r") ;
                   /* Tu jeszcze będą potem różne rzeczy, ale na razie to nieważne */
    		close( (int) fd) ;
    	
    	}	
    
    }
    
    void send_com_req()
    {
    
    	send(accepted, "$", strlen("$"), 0) ;
    
    }
    
    void login_user()
    {
    
    	char login[BUFSIZE] ;
    	memset(login, 0, strlen(login)) ;
    	char password[BUFSIZE] ;
    	memset(password, 0, strlen(password)) ;
    	long bytes = -10 ;
    
    	send(accepted, "Login: ", strlen("Login: "), 0) ;
    
    	while(bytes < 1) 
    	{
    
    		if((bytes = recv(accepted, &login, BUFSIZE, 0)) == -1) perror("recv") ;
    
    	}
    	
    	/* Te dwie linijki po to, żeby wywalić dwa niepotrzebne znaki, które pojawiają się na końcu tekstu w tablicy */
    	bytes -= 2 ;
    	memset(&(login[bytes]), 0, BUFSIZE - bytes) ;
    
    	bytes = -10 ;
    
    	//printf("Received: %s\n", login) ;
    
    	send(accepted, "Password: ", strlen("Password: "), 0) ;
    
    	
    
    	while(bytes < 1) 
    	{
    
    		if((bytes = recv(accepted, &password, BUFSIZE, 0)) == -1) perror("recv") ;
    
    	}
    	
    	/* Te dwie linijki po to, żeby wywalić dwa niepotrzebne znaki, które pojawiają się na końcu tekstu w tablicy */
    	bytes -= 2 ;
    	memset(&(password[bytes]), 0, BUFSIZE - bytes) ;
    
    	bytes = -10 ;
    
    	//printf("Received: %s\n", password) ;
    	
    	int logged = check_login_pass_user(login, password) ;
    
    	if(logged == 0) 
    	{
    
    		send(accepted, "Wrong login or password\n", strlen("Wrong login or password\n"), 0) ;
    		close(accepted) ;
    		exit(0) ;
    
    	}
    
    	send(accepted, "You are logged in!\n", strlen("You are logged in!\n"), 0) ;
    
    }
    
    int check_login_pass_user(const char *login, const char *pass)
    {
    
    	if(strcmp(login, LOGIN) == 0 && strcmp(pass, PASS) == 0) return 1 ;
    
    	return 0 ;
    
    }
    Program ma najpierw sprawdzić czy zostało podane odpowiednie dane do logowania, a następnie wykonywać komendy, które zostaną podane.
    Na jednej konsoli odpalam serwer, a na drugiej łączę się:
    Kod:
    ormi@gentoo ~ $ telnet localhost 3000
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    Login: login
    Password: password
    You are logged in!
    $ls > here
    $$$$$$exitshell
    Connection closed by foreign host.
    W tym czasie na konsoli z włączonym serwerem:
    Kod:
    sh: -c: line 0: syntax error near unexpected token `newline'
    sh: -c: line 0: `ls > '
    sh: l: command not found
    Myślę, że wielokrotne wysyłanie znaku $ jest spowodowane tym, że w czasie gdy wykonywana jest komenda, pętla while jest kontynuowana. A te błędy zgłaszane przez powłokę też są pewnie tym spowodowane.
    Co można zrobić, żeby program zaczekał na wykonane procesu tworzonego przez popen? Ew. jeśli waszym zdaniem problem tkwi gdzie indziej, to będę wdzięczny za sugestie jak to naprawić
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  2. #2

    Domyślnie

    Kod:
    memset(login, 0, strlen(login)) ;
    Kod:
    memset(password, 0, strlen(password)) ;
    hmm

    I jeszcze wiecej bledow.

  3. #3
    Zarejestrowany
    Oct 2008
    Skąd
    W Sieci !!!
    Postów
    282

    Domyślnie

    Moje sugestie są raczej gófno warte bo się nie znam... Ale żeby nie było za łatwo zasugeruje Ci :


    foreign host...
    `newline'
    strlen(login)) ;
    strlen(password)) ;
    "Wszystkie komputery PC są kompatybilne, ale niektóre są kompatybilniejsze od innych... Twój jest zawsze mniej kompatybilny..."

  4. #4
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Hmm... Tak średnio rozumiem o co wam chodzi, ale chwilowo nieważne Błąd był w pętli:
    Kod:
    while(1)
    	{
    
                    bytes = -10 ; //to trzeba było dopisać
    		send_com_req() ;
    
    		while(bytes < 1) 
    		{
    
    			if((bytes = recv(accepted, &command, BUFSIZE, 0)) == -1) perror("recv") ;
    
    		}
    
    		/* Te dwie linijki po to, żeby wywalić dwa niepotrzebne znaki, które pojawiają się na końcu tekstu w tablicy */
    		bytes -= 2 ;
    		memset(&(command[bytes]), 0, BUFSIZE - bytes) ;
    
    		long licznik = 0 ;
    
    		if(strcmp(command, "exitshell") == 0) break ; //koniec :)
    
    		FILE *fd = popen(command, "r") ;
    		close( (int) fd) ;
    	
    	}
    Bez tego bytes = -10 działy się trochę dziwne rzeczy. Błąd znalazłem dzięki temu, że jeszcze raz przejrzałem komunikat błędu:
    Kod:
    sh: -c: line 0: unexpected EOF while looking for matching `"'
    sh: -c: line 1: syntax error: unexpected end of file
    sh: -c: line 0: unexpected EOF while looking for matching `"'
    sh: -c: line 1: syntax error: unexpected end of file
    sh: -c: line 0: unexpected EOF while looking for matching `"'
    sh: -c: line 1: syntax error: unexpected end of file
    sh: -c: line 0: unexpected EOF while looking for matching `"'
    sh: -c: line 1: syntax error: unexpected end of file
    sh: ech: command not found
    sh: e: command not found
    Najważniejsze okazało się:
    Kod:
    sh: ech: command not found
    sh: e: command not found
    "e" zostaje wykonane po "ech" i co najważniejsze jest o 2 litery krótsze od poprzedniego polecenia Z tego wywnioskowałem, że po prostu polecenie jest wykonywane kilka razy i za każdym razem skracane o 2 litery. Przejrzałem więc pętle, w których uzywałem bytes -= 2 i zauważyłem tą

    Wzruszająca historia! Prawie się popłakałem!
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

Podobne wątki

  1. serwerek w c...
    By lukasz6547 in forum C/C++
    Odpowiedzi: 14
    Autor: 07-21-2008, 11:06

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj