logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak napisać licznik odwiedzin w C/C++ jako skrypt CGI na serwerze?

ussooo 05 Lis 2005 18:03 4782 8
REKLAMA
  • #1 1957985
    ussooo
    Poziom 11  
    Posty: 28
    Ocena: 1
    Witam
    Mam do napisania program w C/C++ ktory ma dzialac jako skrypt CGI na serwerze. Jednak narazie mam problem nawet z najprostszym programem:
    #include <stdio.h>
    int main(void)
    {
    print("Content-type: text/html \n\n");
    print("Witaj swiecie");
    }

    Efektem tego programu jest komunikat:
    Cytat:
    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request.
    Please contact the server administrator, root(_at_)midas.slackware.lan and inform them of the time the error occurred, and anything you might have done that may have caused the error.
    More information about this error may be available in the server error log.
    Apache/1.3.33 Server at dworo.olo.org Port 80

    Skrypty perla i shelowe dzialaja poprawnie. Czy to wina konfiguracji serwera czy jednak ja cos w tak prostym programie sknocilem?? Jesli serwera to co musze zmienic w Apachu aby programy w C dzialaly poprawnie??

    Za pomoc szczerze dziekuje

    Tomasz Uss

    UPDATE:

    Najprostrze rzeczy bywają najtrudniejsze. Moj pierwszy problem polegał na tym że do katalogu cgi-bin serwera wgrywalem kod źródłowy moich programów a muszą to być programy skompilowane.
    Teraz Prosze o pomoc w napisaniu licznika.
  • REKLAMA
  • REKLAMA
  • #3 1958896
    ussooo
    Poziom 11  
    Posty: 28
    Ocena: 1
    Zrobilem narazie licznik, który tylko liczy odświerzenia strony.
    #include <stdio.h>
    
    int pobierz(void)
    {
    	FILE *licznik;
    	int ile;
    	if(licznik=fopen("licznik.dat","rb"))
    	{
    		fscanf(licznik,"%d",&ile);
    		fclose(licznik);
    		return (ile);
    	}
    return (0);
    }
    int dopisz(int ile)
    {
        FILE *licznik;
    	if(ile<0) ile=0;
    	ile++;
    	if(licznik=fopen("licznik.dat","wb"))
    	{
    		fprintf(licznik,"%d\n",ile);
    		fclose(licznik);
    		return (ile);
    	}
    return (0);
    }
    void wyswietl(int ile)
    {
    	printf("Content-type: text/html \n\n");
    	if(ile)
    	{
    
    		printf("Stronę odwiedziło: <b>%d</b> osób",ile);
    	}
        else
    	{	
    		printf("[błąd]");
    	}
    }
    int main(void){
    int ile;
    ile=0;
    ile=pobierz();
    ile=dopisz(ile);
    wyswietl(ile);
    
    }

    Jest tylko jeden mankament: po dołączeniu do strony przez
    <!--#include virtual="/cgi-bin/licznik.exe" -->
    wyświetla mi na tej stronie:
    Cytat:
    [an error occurred while processing this directive]

    Po wpisaniu w przegladarkę: [quote]http://localhost/cgi-bin/licznik.exe
    Cytat:
    wszystko działa jak należy(Program w stylu: "Hello Word" działał w obu przypadkach).

    Do licznika wypadalo by dodac zabezpieczenie przez wielokrotnym dostępem do pliku licznik.dat przy jednoczesnym wejsciu na sronę wielu użytkowników oraz zabezpieczenie przed odświerzaniem strony: np. cooki.
  • REKLAMA
  • #4 1963643
    ussooo
    Poziom 11  
    Posty: 28
    Ocena: 1
    Chciałbym się dowiedzieć jeszcze jak działa funkcja:
    w C/C++.
    Jak przy jej pomocy ustawić ciasteczko u odbiorcy i jak je odczytać??
  • #5 2075261
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    witam, ja się dołącze do tego tematu z moim problemem. Mamy własny szkolny serwer, dla zabaw i nauki. Próbuje wymusic w niego zeby interpretował CGI, ale ciś mi nie wychodzi. Wg pewnego tutoriala dodałem do httpd.conf
     AddHandler cgi-script cgi 
     ScriptAlias /cgi-bin /usr/local/apache/cgi-bin 
     AddType application/x-httpd-cgi .cgi

    i nic. Gdy przed Addhandler jest hash, to próbuje pobra pliki, natomiast gdy go nie ma, to nie mam nigdy dostępu do nich
    You don't have permission to access /ostry/cgi-bin/cgi.exe on this server.
  • #6 2075899
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    ostry_18 napisał:
    You don't have permission to access /ostry/cgi-bin/cgi.exe on this server.
    Sprawdź uprawnienia pliku do wykonywania dla wszystkich.
  • REKLAMA
  • #7 2076946
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    są 777, dalej nic
  • #8 2180628
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Sprawdź jeszcze czy w pliku httpd.conf jest dopisane ExecCGI, pozatym sie zastanawiam, czy jeśli to jest plik exe to nie trzeba tego jakoś inaczej dopisać, bo jak narazie masz włączone pliki .cgi .
  • #9 2183423
    ostry_18
    Poziom 24  
    Posty: 824
    Pomógł: 64
    Ocena: 35
    a jeśli mam plik .exe to wystarczy my zmienic rozszerzenie na .cgi, czy trzeba jakoś inaczej (od nowa) kompilowac

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z uruchomieniem prostego programu w C/C++ jako skryptu CGI na serwerze Apache oraz implementacji licznika odwiedzin. Podstawowy błąd polegał na wgrywaniu kodu źródłowego zamiast skompilowanego pliku wykonywalnego do katalogu cgi-bin. Wskazano konieczność dodania nagłówka HTTP, np. "HTTP/1.0 200 OK", oraz opcjonalnie nagłówka "Content-Length" z odpowiednią długością treści. Przykładowy licznik odwiedzin został przedstawiony z funkcjami do odczytu i zapisu liczby odwiedzin w pliku "licznik.dat" oraz wyświetlania wyniku w formacie HTML. Poruszono także kwestie konfiguracji serwera Apache: dodanie dyrektyw AddHandler, ScriptAlias, AddType oraz zapewnienie uprawnień do wykonywania plików (chmod 777). Zwrócono uwagę na konieczność dopisania opcji ExecCGI w konfiguracji oraz rozważania dotyczące rozszerzenia plików wykonywalnych (.cgi vs .exe) i ich kompilacji. Pytano również o użycie funkcji setcookie() w C/C++ do ustawiania i odczytu ciasteczek HTTP.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA