Thursday, July 29th 2010, 1:36pm UTC+2

You are not logged in.

  • Login
  • Register

1

Saturday, September 17th 2005, 1:15am

Allgemeine Fragen zu Perl oder c/c++ an der CGI Schnittstelle?

Hi,

ich möchte eine Schnittstelle zwischen einer C Applikation und einem HTML Interface bauen. Ich habe bereits versucht eine CGI Schnittstelle in C zu schreiben. Leider bekomme ich das Script nicht zum Laufen da ich nicht weiß wie ich diese Datei kompilieren bzw. speichern muss. Wie gesagt ich habe mich bisher noch nicht mit CGI Schnittstellen beschäftigt. Würde sich eine Schnittstelle mit Perl besser eignen als eine in C geschriebene? Mir geht es auch darum, dass ich später evtl. ein Flash Interface dran hänge. Ich hoffe dass ich mit dem ganzen Schnittstellenzeugs nichts durcheinander bringe. :D
Greetz Andi

Mod Dewey

CREAKTIF - Comes soon

Google ist dein Freund :D
  • Go to the top of the page

undefined

Super Moderator

Posts: 4,248

Location: Germany

2

Saturday, September 17th 2005, 11:21am

Also wenn du wenig erfahrung mit c Programierung hast. Würde ich Perl schon vorziehen Du kannst wie hier wenn Perl auf deinem System Installiert ist eine Sytem Schnittstelle schaffen.
Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
PHP Katepart - Speichenrechner - .htpasswd - RPM XDG Tool - Kcmnvview - QTidy
  • Go to the top of the page

3

Saturday, September 17th 2005, 12:04pm

Hi,

In C Programmierung hab ich Kenntnisse ist ja schließlich auch meine Arbeit. :D Allerdings hab ich bisher noch nichts mit CGI Schnittstellen gemacht. Danke Jürgen werd ich mir gleich mal durchlesen. :)

Edit: Diesen Beitrag hatte ich schon gesehen. ;) Ich werd mal auf den Manpages suchen evtl. werd ich da fündig über die mir nötigen Infos. Falls du noch was auf Lager hast würd ich mich freuen wenn dus mir schreibst. :) ;)

Edit2:

Ich habe anscheinend ein ganz anderes Problem. In meinem cgi-bin Verzeichnis liegt eine test-cgi diese ist auch lesbar nur wenn ich diese kopiere dann meldet es mir einen Fehler dass die datei nicht lesbar ist obwohl alle Zugriffsrechte so wie bei der test-cgi gesetzt sind. Wie speichere ich bzw. kompiliere ich eine .c in eine cgi?
Greetz Andi

Mod Dewey

CREAKTIF - Comes soon

Google ist dein Freund :D

This post has been edited 2 times, last edit by "Dewey" (Sep 17th 2005, 12:38pm)

  • Go to the top of the page

undefined

Super Moderator

Posts: 4,248

Location: Germany

4

Saturday, September 17th 2005, 4:47pm

Quoted

Original von Dewie
In C Programmierung hab ich Kenntnisse.......................
Wie speichere ich bzw. kompiliere ich eine .c in eine cgi?

Du willst mich jetzt veräppeln oder? :D
CGI ist ein Schnittstelle und keine Datei (Common Gateway Interface). Ein CGI Programm (falscher Name aus der Historie überliefert) nimmt oder erstellt Daten und sendet diese über die CGI Schnittstelle.
Du kannts ein CGI/Perl Script in der Konsole mit perl -w meincsript.cgi Testen.
http://httpd.apache.org/docs/2.0/howto/cgi.html.en#writing

In c++

PHP Source code

1
2
3
4
5
6
7
8
using namespace std:
int main()
{
    cout << "Content-Type: text/html " << endl;
    cout << endl;
    cout << "<html>" << endl;
    cout << "<body></body></html>" << endl;
}

Paramter werden c typsich mit fputs ( argv und args ) übergeben ;)
Guckst du hier : Arbeiten mit GET/POST Variablen in der PHP/Flash Umgebung!

Post Variablen entgegen nehmen z.B:

PHP Source code

1
2
3
4
5
6
7
8
string request_method getenv"REQUEST_METHOD" );
if ( request_method == "POST" )
{
     atoigetenv('CONTENT_LENGTH') ):
     buff = new char[l+1];
     for ( unsigned int i 0li++ )
       cin.getbuff[i] );
}

Für dich Relevante Paramter sind:
QUERY_STRING bei GET und POST siehe Link
CONTENT_LENGTH Größe des Puffers in Bytes
REMOTE_ADDR stellt die IP Adresse des Clienten
SCRIPT_NAME der name des GCI Scripts
Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
PHP Katepart - Speichenrechner - .htpasswd - RPM XDG Tool - Kcmnvview - QTidy
  • Go to the top of the page

undefined

Super Moderator

Posts: 4,248

Location: Germany

5

Saturday, September 17th 2005, 6:04pm

So ich habe dir mal auf die Schnelle ein Beispiel erstellt.

PHP Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/***************************************************************************
 *   Copyright (C) 2005 by undefined   *
 *   undefined@flashbattle.de   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <cstdlib>
#include <string.h>
#include <vector>

using namespace std;

struct ListElement
{
        ListElementnaechstes;
        string       schluessel;
        string       wert;
        // __construct
        ListElement() : naechstes(0)
        {}
        // __construct erweitert
        ListElement( const string_schluessel, const string_wert ) :
                        naechstes),
                        schluessel_schluessel ),
                        wert_wert )
        {}
}
;

class Liste
{
private:
        ListElementerstes;
        ListElementletztes;
        int anzahl;
public:
        Liste() : erstes), letztes), anzahl)
        {}
        virtual ~Liste();

        bool empty() const
        {
                return ( anzahl == );
        }

        int size() const
        {
                return anzahl;
        }

        void push_back( const stringschluessel, const stringwert );

        void pop_front();

        ListElementfront()
        {
                return erstes;
        }
};

void Liste::push_back( const string_schluessel, const string_wert )
{
        ListElementtmp = new ListElement_schluessel_wert );

        if ( letztes != )
                letztes->naechstes tmp;
        else
                erstes tmp;

        letztes tmp;
        anzahl++;
}

void Liste::pop_front()
{
        if ( anzahl == )
                return;

        ListElementtmp erstes;
        erstes tmp->naechstes;

        if ( erstes == )
                letztes == 0;

        delete tmp;
        anzahl--;
}

Liste::~ Liste()
{
    while( anzahl != )
        pop_front();
}

bool AnfrageListe_liste )
{
        string request_method getenv"REQUEST_METHOD" );

        // Puffer fuer uebergeben Daten
        charbuffer 0;
        unsigned int len;

        // Behandle Post Variablen
        if ( request_method == "POST" ) {
                len atoigetenv"QUERY_STRING" ) );
                buffer = new char[len 1];
                for ( unsigned int i 0leni++ ) {
                        cin.getbuffer[i] );
                }
        }

        // Behandle GET Variablen
        if ( request_method == "GET" ) {
                len strlengetenv"QUERY_STRING" ) );
                buffer = new char[len+1];
                strcpybuffergetenv"QUERY_STRING" ) );
        }

        // Terminieren
        buffer[len] = 0;

        // Kopiere Puffer in String
        string eingabe buffer;
        delete[] buffer;

        // Lokale Variablen zur Teilstring Suche
        size_t pos 0;
        size_t old_pos 0;

        // Lese Werte Paare
        while ( pos len ) {
                pos eingabe.find"&"old_pos );
                // Ein oder mehrer parameter wurden uebergeben ?
                if ( pos == string::npos )
                        pos eingabe.length();

                // Splitten
                string paar eingabe.substrold_pospos-old_pos );
                size_t eq_pos paar.find("=");

                string schluessel paar.substr0eq_pos );
                // Hier brauchts du noch eine Funktion zum Konvertieren von Leerzeichen( schluessel );

                string wert paar.substreq_pos );
                // Hier brauchts du noch eine Funktion zum Konvertieren von Leerzeichen( wert );

                // Erstelle Liste
                _liste.push_backschluesselwert );
                old_pos pos 1;
        }

}

void AntworteListe_liste )
{
        cout << "Content-Type: text/html" << endl;
        cout << endl;
        cout << "<html><title>C++ Beispiel CGI GET/POST Beispiel</title>" << endl;
        cout << "<head>" << endl;
        cout << "<body><h2>Ausgabe</h2>" << endl;

        ListElementtmp;
        for( tmp _liste.front(); tmp != 0tmp tmp->naechstes ) {
                cout << "<p><b>" << tmp->schluessel << "</b>" << tmp->wert << "</p>" << endl;
        }

        cout << "</body>" << endl;
        cout << "</head>" << endl;
        cout << "</html>" << endl;
}


int main()
{
        Liste liste;

        if ( Anfrageliste ) == false ) {
                cout << "Content-Type: text/html" << endl;
                cout << endl;
                cout << "<html><title>C++ Beispiel CGI GET/POST Beispiel</title>" << endl;
                cout << "Keine Anfrage erhalten!" << endl;
                cout << "</body>" << endl;
                cout << "</head>" << endl;
                cout << "</html>" << endl;
        } else
                Antworteliste );

        return EXIT_SUCCESS;
}

In dein CGI-Bin Verzeichnis Installieren und mit chmod 0755 ausführbar machen.

Source code

1
http://localhost/cgi-bin/getpost?test=String

Aufrufen
mfg undefined
Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
PHP Katepart - Speichenrechner - .htpasswd - RPM XDG Tool - Kcmnvview - QTidy
  • Go to the top of the page

6

Saturday, September 17th 2005, 6:30pm

Ich meinte damit gcc -o bla.cgi bla.c :rolleyes:

Das ganze lag an meinem Server und an den Chmod Rechten. ;)
Greetz Andi

Mod Dewey

CREAKTIF - Comes soon

Google ist dein Freund :D
  • Go to the top of the page

undefined

Super Moderator

Posts: 4,248

Location: Germany

7

Saturday, September 17th 2005, 6:36pm

Also habe ich mir jetzt umsonst die mühe gemacht :D
Verwende keine .cgi Endung das ist Steinzeit. Du brauchst im cgi-bin Verzeichnis keine Datei Endung bei Programmen welche an die CGI Schnittstelle gehen die Dateirechte reichen aus.
Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
PHP Katepart - Speichenrechner - .htpasswd - RPM XDG Tool - Kcmnvview - QTidy
  • Go to the top of the page

8

Saturday, September 17th 2005, 6:43pm

Quoted


Also habe ich mir jetzt umsonst die mühe gemacht :D


Nö hast du dir nicht. Danke sehr für das Bsp. ;)

Quoted


Verwende keine .cgi Endung das ist Steinzeit.


Ok ich werde mich hüten. :D

Du hast mir oben den Link mit deiner Schnittstelle zwischen Flash und Perl gepostet. Hab mir das jetzt mal genauer angesehen und fleißig gegoogled :D Es müsste doch dann auch möglich sein Daten zwischen einem C Programm und Flash z.B. mit der XML Schnittstelle auszutauschen oder? :-)
Greetz Andi

Mod Dewey

CREAKTIF - Comes soon

Google ist dein Freund :D

This post has been edited 1 times, last edit by "Dewey" (Sep 17th 2005, 7:06pm)

  • Go to the top of the page

undefined

Super Moderator

Posts: 4,248

Location: Germany

9

Saturday, September 17th 2005, 7:14pm

Quoted

Original von Dewie

Quoted


Also habe ich mir jetzt umsonst die mühe gemacht :D


Nö hast du dir nicht. Danke sehr für das Bsp. ;)

Quoted


Verwende keine .cgi Endung das ist Steinzeit.


Ok ich werde mich hüten. :D

Du hast mir oben den Link mit deiner Schnittstelle zwischen Flash und Perl gepostet. Hab mir das jetzt mal genauer angesehen und fleißig gegoogled :D Es müsste doch dann auch möglich sein Daten zwischen einem C Programm und Flash z.B. mit der XML Schnittstelle auszutauschen oder? :-)

Nicht mit C++ und Flash alleine, weil flash nur cgi kennt. Es gibt aber etliche Zusatzprogramme mit dehnen sich das Realisieren läst. CGI wird von Apache gestellt.
Oder du verwendest c mit get argv args.
Also

Source code

1
meinprog command=1 command=2

Jedoch kannst du bei der Geschichte keine Feedback geben.
Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
PHP Katepart - Speichenrechner - .htpasswd - RPM XDG Tool - Kcmnvview - QTidy
  • Go to the top of the page

10

Saturday, September 17th 2005, 7:42pm

Ok mal schaun was sich daraus machen lässt. Werde mich melden wenns fertig ist. ;)
Greetz Andi

Mod Dewey

CREAKTIF - Comes soon

Google ist dein Freund :D
  • Go to the top of the page