StoQ Temat założony przez niniejszego użytkownika |
[C] Serwer HTTP - dostarczenie pliku index.html » 2010-12-21 19:10:41 Witam, Dostałem takie zadanie. Stworzyć serwer HTTP w języku C, który będzie dostarczał plik index.html w standardzie HTTP 0,9.. Czyli wyświetlał cały kod na ekranie. Znalazłem kod serwera na jednej ze stron: #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h>
int main() { int sock, polaczenie, bajty_odebrane, true = 1; char dane_wysylane[ 1024 ], dane_odbierane[ 1024 ]; struct sockaddr_in adres_serwera, adres_klienta; int sin_size; if(( sock = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) { perror( "Socket" ); exit( 1 ); } if( setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, & true, sizeof( int ) ) == - 1 ) { perror( "Setsockopt" ); exit( 1 ); } adres_serwera.sin_family = AF_INET; adres_serwera.sin_port = htons( 5000 ); adres_serwera.sin_addr.s_addr = INADDR_ANY; bzero( &( adres_serwera.sin_zero ), 8 ); if( bind( sock,( struct sockaddr * ) & adres_serwera, sizeof( struct sockaddr ) ) == - 1 ) { perror( "Unable to bind" ); exit( 1 ); } if( listen( sock, 5 ) == - 1 ) { perror( "Listen" ); exit( 1 ); } printf( "\nSerwer TCP oczekuje na klienta na porcie 5000" ); fflush( stdout ); while( 1 ) { sin_size = sizeof( struct sockaddr_in ); polaczenie = accept( sock,( struct sockaddr * ) & adres_klienta, & sin_size ); printf( "\nPołączenie z (%s, %d)", inet_ntoa( adres_klienta.sin_addr ), ntohs( adres_klienta.sin_port ) ); while( 1 ) { printf( "\n WYŚLIJ (q albo Q aby zakończyć): " ); gets( dane_wysylane ); if( strcmp( dane_wysylane, "q" ) == 0 || strcmp( dane_wysylane, "Q" ) == 0 ) { send( polaczenie, dane_wysylane, strlen( dane_wysylane ), 0 ); close( polaczenie ); break; } else { send( polaczenie, dane_wysylane, strlen( dane_wysylane ), 0 ); } bajty_odebrane = recv( polaczenie, dane_odbierane, 1024, 0 ); dane_odbierane[ bajty_odebrane ] = '\0'; if( strcmp( dane_odbierane, "q" ) == 0 || strcmp( dane_odbierane, "Q" ) == 0 ) { close( polaczenie ); break; } else { printf( "\n ODEBRANO = %s", dane_odbierane ); } fflush( stdout ); } } close( sock ); return 0; }
No ale nie ma gdzieś tutoriala jak własnoręcznie napisać kod sewera? I jak zaimplementować tam opcję tego wyświetlania klientowi pliku index.html.. Może ktoś ma jakiś najprostszy kod serwera bo ten to chyba długaśny strasznie.. Nie mam całkowicie pojęcia jak się za to zabrać.. Proszę o jakieś wskazówki. I nie to że nie szukałem. Szukam cały czas. Próbuje ale bezskutecznie :( |
|
SeaMonster131 |
» 2010-12-21 19:44:08 Jeżeli wywalisz wszystkie komentarze to kod w sumie będzie krótki hehe :) |
|
DejaVu |
» 2010-12-21 19:56:18 True, kod jest krótki. W dodatku skoro są komentarze to znaczy, że wystarczy je przeczytać żeby zrozumieć mniej więcej o co chodzi.
/edit:
Wywołanie z przeglądarki: http://localhost:5000/ - myślę że zadziała. Serwer wystarczy uruchomić. |
|
StoQ Temat założony przez niniejszego użytkownika |
» 2011-01-26 02:58:05 Witam.. Po ciężkich bojach.. a także cisnących terminach na uczelni :) wiadomo jak to jest :P Zacząłem czytać poradnik Beej’s Guide to Network Programming o używaniu gniazd internetowych i stworzyłem prosty sewer HTTP. Udało mi się nawet rozwiązać sprawę wczytywania pliku index.html :) Najpierw wczytuje go do tablicy a potem wysyłam do clienta :) Moim clientem może być np przeglądarka firefox. Wystarczy w jej polu gdzie się wpisuje adres wpisać IP ustawione w serwerze. tak więc tutaj jest kod serwera: #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>
#define MYPORT 2000 #define BACKLOG 10
void sigchld_handler( int s ) { while( wait( NULL ) > 0 ); }
int main( int argc, char * argv[] ) { FILE * plik; int sockfd, new_fd; struct sockaddr_in my_addr; struct sockaddr_in their_addr; struct sigaction sa; int sin_size; int yes = 1, i; char dane[ 999999 ]; if(( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) == - 1 ) { perror( "socket" ); exit( 1 ); } if( setsockopt( sockfd, SOL_SOCKET, SO_REUSEADDR, & yes, sizeof( int ) ) == - 1 ) { perror( "setsockopt" ); exit( 1 ); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons( MYPORT ); my_addr.sin_addr.s_addr = inet_addr( "127.0.0.1" ); memset( &( my_addr.sin_zero ), '\0', 8 ); if( bind( sockfd,( struct sockaddr * ) & my_addr, sizeof( struct sockaddr ) ) == - 1 ) { perror( "bind" ); exit( 1 ); } if( listen( sockfd, BACKLOG ) == - 1 ) { perror( "listen" ); exit( 1 ); } sa.sa_handler = sigchld_handler; sigemptyset( & sa.sa_mask ); sa.sa_flags = SA_RESTART; if( sigaction( SIGCHLD, & sa, NULL ) == - 1 ) { perror( "sigaction" ); exit( 1 ); } plik = fopen( "index.html", "r" ); while( feof( plik ) == 0 ) { fscanf( plik, "%c", & dane[ i ] ); i++; } fclose( plik ); while( 1 ) { sin_size = sizeof( struct sockaddr_in ); if(( new_fd = accept( sockfd,( struct sockaddr * ) & their_addr, & sin_size ) ) == - 1 ) { perror( "accept" ); continue; } printf( "server: polaczono z %s\n", inet_ntoa( their_addr.sin_addr ) ); if( !fork() ) { close( sockfd ); if( send( new_fd, dane, strlen( dane ), 0 == - 1 ) ) perror( "send" ); close( new_fd ); exit( 0 ); } close( new_fd ); } return 0; }
żeby się połączyć z serwerem trzeba wpisać w przeglądarkę 127.0.0.1:2000 bo na takie IP i port jest serwer. Przykładowa strona index.html której serwer szuka w katalogu: <HTML>
<HEAD>
<TITLE>Przykadowa strona</TITLE>
<META http-equiv="content-type" content="text/html; charset=Windows-1250">
<META NAME="Author" CONTENT="">
</HEAD>
<BODY BGCOLOR=#888888>
<center>
<marquee><h1><font color=“TUTAJ WPISUJEMY KOLOR TEKSTU, KTÓRY MA SIĘ PRZESUWAĆ”>--->>> Serwer Online <<--- </font></h1></marquee>
<hr>Witam. Udało się otworzyć stronę index.html. Serwer działa jak należy..<hr>
Pozdrawiam M
</BODY>
<HTML> Czy ktoś mógłby mi sprawdzić poprawność kodu. I powiedzieć czy to jest kod serwera w standardzie HTTP/0.9? I co należałoby w nim zmienić żeby był on w tym standardzie. Niestety nie znam się za dobrze na programowaniu, a to jest taki projekt który muszę stworzyć :) Jak w ogóle sprawdzić jaki to standard? |
|
DejaVu |
» 2011-01-26 03:43:26 |
|
« 1 » |