Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Suche Beispielprogramm Dateidownload Visual Studio 2013

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
26.12.2015, 18:22 Uhr
~f.-th.
Gast


So wie du schreibst fürchte ich du hast keinen Plan wie deine IDE funktioniert?

Hast du da ausgewählt das du ein Konsolen-Programm bearbeiten möchtest? Das wird in fast jeder IDE etwas anders benannt. Hab kein VS2013, deshalb kann ich dir das nicht exakt beschreiben. Aber ältere Varianten und Mitbewerber sollten ähnlich funktionieren. Dann muss du wahrscheinlich noch ein Projekt erstellen.

Wenn du die Vorbereitungen dann abgeschlossen hast, sollte ein "Hello World" kein Problem mehr sein.

Versuchst du allerdings ohne die Vorbereitungsschritte mit VS2013 oder ähnlichem direkt im Editor herum zu machen kommst du als Anfänger natürlich ins rudern.

Alternativ kannst du mit einem beliebigen anderen Editor ein kleines Programm in C oder C++ schreiben und mit dem dazugehörigen Endungen abspeichern. Das sollte von der VS-Installation das richtige Datei-Icon bekommen. Einfach drauf klicken und die VS-IDE sollte sich für dich passend öffnen. Dann noch compilieren und linken, das wird oft in einem Schritt auf der IDE-Oberfläche erledigt, und fertig ist dein Programm. Sollten Fehler angezeigt werden versuche die zu verstehen und abzuarbeiten

Falls irgend etwas schief geht und du möchtest hier Hilfe, dann zeige die ersten 3 Fehlermeldungen hier Zeichen für Zeichen.


Ich habe, wie die anderen hier, nur raten können was bei dir nicht funktioniert, deshalb können alle unsere Tipps dich eventuell mehr irritieren als nutzen. Aber da du ja keine brauchbaren Fehlermeldungen zeigst, ...



Wenn du aber schon beim "Hello World" hängst, sehe ich bei deine anderen Vorhaben kein Licht am Ende.

Mit welchem Editor oder welcher IDE hast du denn deine PHP-Sachen geschrieben?

Alte Basic-Dialekte sollte man fast komplett vergessen, modernere Dialekte können zum Teil für den Einstieg in andere Sprachen etwas helfen. Wenn man kein Basic kann, schadet das aber bei C++ nicht.

MfG f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
27.12.2015, 01:51 Uhr
Atreju



Ich bin nicht beim "Hallo Welt" hängengeblieben. Auch Dateizugriffe hab ich hinbekommen.
Insofern funktioniert VS2013...

PHP habe ich mit einem einfachen Texteditor und einem Apache Testserver geschrieben, verschiedene Datenbanken und zwei Online-Games. Basic kann ich seit dem C64 (wobei es da ja auch etliche Unterschiede zu "modernen" Stilen gibt), Assembler kann ich weil ich wissen wollte wie Viren funktionieren (aus dem Alter bin ich inzwischen raus) und für die Mikrocontroller-Programmierung.

Mein Problem ist eben genau diese Fehlermeldungen zu verstehen und zu beheben. Da C++ auf verdammt vielen Bibliotheken aufbaut, werde ich da irgendwas nicht vollständig oder nicht passend haben. Teilweise werden aber bei Beispielprogrammen aus dem Netz auch schon Fehler mit dem eigentlichen C++ Programm gemeldet (z.B. fehlerhafte Funktionsdefinitionen und Aufrufe), so als wäre das Programm für einen anderen Compiler geschrieben. Aus dem gleichen Grund scheinen sich auch einige Bibliotheken (z.B. Curl) nicht compilieren zu lassen.

Ich werd's die Tage nochmal neu probieren, evtl. versuchen komplett selbst zu schreiben. Dann schreib ich auch die Fehlermeldungen wenn die helfen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
27.12.2015, 05:48 Uhr
Atreju



So, ich hab mir nochmal ein Beispielprogramm rausgesucht:


C++:
/*
*                                 http_post.cpp
*
* by Uday Chitragar - 2004/Dec/01
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must
* not claim that you wrote the original software. If you use this
* software in a product, an acknowledgment in the product documentation
* would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and
* must not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
* */


/*
* Notes:
* This source demonstrates sending HTTP POST request to webserver from C++
* This uses sockets hence can be compiled on Linux, UNIX, Win
*/



#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <Winsock2.h>

#define SEND_RQ(MSG) \
                /*cout<<send_str;*/ \
  send(sock,MSG,strlen(MSG),0);

using namespace std;
//<exe> hostname api parameters
int request(char* hostname, char* api, char* parameters, string& message) {
    WSADATA    WsaData;
    WSAStartup(0x0101, &WsaData);

    sockaddr_in sin;
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {return -100;}
    sin.sin_family = AF_INET;
    sin.sin_port = htons((unsigned short)80);

    struct hostent * host_addr = gethostbyname(hostname);
    if (host_addr == NULL) {return -103;}
    sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list);

    if (connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in)) == -1) {return -101;}

    string send_str;

    SEND_RQ("POST ");
    SEND_RQ(api);
    SEND_RQ(" HTTP/1.0\r\n");
    SEND_RQ("Accept: */*\r\n");
    SEND_RQ("User-Agent: Mozilla/4.0\r\n");

    char content_header[100];
    sprintf(content_header, "Content-Length: %d\r\n", strlen(parameters));
    SEND_RQ(content_header);
    SEND_RQ("Accept-Language: en-us\r\n");
    SEND_RQ("Accept-Encoding: gzip, deflate\r\n");
    SEND_RQ("Host: ");
    SEND_RQ("hostname");
    SEND_RQ("\r\n");
    SEND_RQ("Content-Type: application/x-www-form-urlencoded\r\n");

    //If you need to send a basic authorization
    //string Auth        = "username:password";
    //Figureout a way to encode test into base64 !
    //string AuthInfo    = base64_encode(reinterpret_cast<const unsigned char*>(Auth.c_str()),Auth.length());
    //string sPassReq    = "Authorization: Basic " + AuthInfo;
    //SEND_RQ(sPassReq.c_str());

    SEND_RQ("\r\n");
    SEND_RQ("\r\n");
    SEND_RQ(parameters);
    SEND_RQ("\r\n");
    char c1[1];
    int l, line_length;
    bool loop = true;
    bool bHeader = false;

    while (loop) {
        l = recv(sock, c1, 1, 0);
        if (l<0) loop = false;
        if (c1[0] == '\n') {
            if (line_length == 0) loop = false;

            line_length = 0;
            if (message.find("200") != string::npos)
                bHeader = true;

        }
        else if (c1[0] != '\r') line_length++;
        message += c1[0];
    }

    message = "";
    if (bHeader) {
        char p[1024];
        while ((l = recv(sock, p, 1023, 0)) > 0)  {
            p[l] = '\0';
            message += p;
        }
    } else {return -102;}
    WSACleanup();
    return 0;
}


int main(){
    string message;
    int request("www.somesite.com", "/post_url.pl", "search=hello&date=todat", string& message);
    // message contains response!

}


Zeile 127 ist die int request(); in der main.
Der Compiler meint dazu:

Zitat:

c:\users\user\documents\visual studio 2013\projects\dltest3\dltest3\dltest3.cpp(72): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\stdio.h(356): Siehe Deklaration von 'sprintf'
1>c:\users\user\documents\visual studio 2013\projects\dltest3\dltest3\dltest3.cpp(127): error C2275: 'std::string': Ungültige Verwendung dieses Typs als Ausdruck
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring(2643): Siehe Deklaration von 'std::string'
1>c:\users\user\documents\visual studio 2013\projects\dltest3\dltest3\dltest3.cpp(127): error C2078: Zu viele Initialisierungen
1>c:\users\user\documents\visual studio 2013\projects\dltest3\dltest3\dltest3.cpp(127): error C2440: 'Initialisierung': 'const char [24]' kann nicht in 'int' konvertiert werden
1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========



Den Code habe ich auf den Windows-Teil beschnitten und eine Debug-Ausgabe entfernt, sonst schmeißt das Ding mit noch mehr Fehlern um sich.
Es ist echt zum Kotzen, macht keinen Spaß. PHP ist da wesentlich einfacher.

Dieser Post wurde am 27.12.2015 um 05:52 Uhr von Atreju editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
27.12.2015, 08:09 Uhr
~f.-th.
Gast


Der Quelltext ist eine Mischung aus C und C++ und aus 2004.

Inzwischen wurde der C++ Standard schon ein paar mal überarbeitet. Deshalb der Warnhinweiss z.B. zu sprintf. Auch das Arbeiten mit Strings wurde in C++ stark erweitert und verbessert.

Dann fürchte ich das deine Quelle nicht ganz "sauber" geschrieben worden ist, also sind die Fehlermeldungen wahrscheinlich zutreffend. Das war 2004 halt oft so.

Bei PHP kannst du die Fehler wahrscheinlich gar nicht machen. Dafür bietet C++ aber deutlich mehr Möglichkeiten. Daraus folgt auch die Möglichkeit mehr Fehler zu machen.


Also, wenn du so alte Quellen zum laufen bekommen willst, kannst du einen Compiler aus der damaligen Zeit nehmen. Dann hast du wahrscheinlich mit weniger Fehlermeldungen zu kämpfen.
Aber sei dir klar das dann die Funktionen auch deiner Programme eventuell unsicherer sind.

Besser wäre die Quellen auf den aktuellen Stand zu bringen - das ist oft viel Arbeit.

Oder als Kompromiss saubere Schnittstellen zwischen den einzelnen Programmteilen heraus arbeiten. Dann kannst du eventuell noch alte und neue Programmteile nutzen. Aber denk dran der neue Compiler "nörgelt" i.d.R. nicht grundlos.

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
27.12.2015, 08:30 Uhr
~f.-th.
Gast



C++:
/*
* Notes:
* This source demonstrates sending HTTP POST request to webserver from C++
* This uses sockets hence can be compiled on Linux, UNIX, Win
*/



#include "stdafx.h"  // stand diese Zeile im Original-Quelltext?



falls die im Original da steht, sollte der Quelltext durch einen Microsoft-Compiler laufen. Kann dir nur nicht die Version nennen. Eventuell kannst du deinen VS2013 so einstellen das der so alte Quelltexte noch verarbeiten kann? Würde die Möglichkeit aber nur nutzen, falls ich mit den Konsequenzen leben kann. Falls die Zeile da nicht steht, eventuell nur die Header da eintragen, die du brauchst.

Falls die stdafx-Zeile da nicht steht und Linux oder Unix neben Win als Ziel-OS angegeben sind funktioniert das Compilieren eventuell mit dem g++ einfacher.

Aber auch der g++ weist dich eventuell darauf hin das der Quelltext nicht ganz sauber nach dem aktuellen C++ Standard ist.

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
27.12.2015, 15:17 Uhr
~f.-th.
Gast



C++:
#include <Winsock2.h>



Keine Ahnung wie der VS2013 voreinstellt ist?
Du musst eventuell noch die zu dieser Headerdatei gehörende Bibliothek in der IDE dem Linker bekannt machen. Das kann man aus den Fehlermeldungen ablesen ob da dem Linker Infos fehlen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
27.12.2015, 16:58 Uhr
Atreju



Zuerst einmal Danke, daß Du Dir die Zeit dafür nimmst.

Die include "stdafx.h" stand nicht im originalen Quelltext, die muß ich dazuschreiben, damit sich VS2013 überhaupt mit dem Quellcode beschäftigen möchte. Das Problem mit den veralteten Funktionen ist mir bekannt, da würde ich mich drum kümmern (wollen) wenn es mir erstmal gelingen würde, ein funktionsfähiges Beispiel zu haben, aus dem ich lernen kann.

Zur Winsock2.h gehört noch eine WS2_32.lib, die hab ich ihm mitgeteilt und er akzeptiert sie auch.

Was ich halt nicht verstehe ist der Fehler bei der Übergabe der Funktionsparameter. Da ist char* als Soll angegeben, er bekommt auch einen String ("blah") und meckert irgendwas mit INT herum... das versteh erstmal einer.

Wenn das daran liegt, daß alte Quelltexte nicht mehr mit neuen Compilern lauffähig sind, ist das ja wohl der größte Mist, den ich je gesehen habe. Depricated-Warnings okay - aber überhaupt nicht mehr lauffähig geht ja eigentlich gar nicht. Sollte das eine Arbeitsbeschaffungsmaßnahme für arbeitslose Programmierer werden, die ständig ihre alten Quellcodes auf den neuesten Stand bringen müssen oder was? Verstehe ich nicht.

PHP ist halt was die Variablen angeht deutlich flexibler. Klar ist das "unsicherer", aber ich mag das, weil ich die freie Wahl habe wie ich den Inhalt einer Variable interpretiert haben möchte. PHP ist auch deutlich besser dokumentiert als C++, ich hatte damals beim Lernen eigentlich kein Beispiel, was überhaupt so gar nicht gelaufen ist. So richtig gute Hilfetexte oder Hilfeseiten zu Funktionsaufrufen wie bei PHP vermisse ich bei C++ immens.

Parallel schlage ich mich gerade noch mit einer eigenen Umsetzung herum. Diese hab ich wenigstens soweit, daß sie mit VS2013 compilierbar ist und immerhin schon die passende IP zu einem Host ermitteln kann. Winsock2 läuft also.
Allerdings kämpfe ich da gerade mit diesen blöden Strukturen von getaddrinfo() und connect() - es ist schwer zu durchschauen wenn man sich das nicht selbst ausgedacht hat und keine aufschlußreichen Dokumentationen findet. Eine Funktion liefert es SO, die nächste erwartet es völlig anders. Sowas find ich großen Müll.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
27.12.2015, 20:23 Uhr
~f.-th.
Gast


Ich bin da mal mit der Brechstange an den Quelltext heran - Funktion ohne Gewähr:

C++:
/*
*                                 http_post.cpp
*
* by Uday Chitragar - 2004/Dec/01
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any
* damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any
* purpose, including commercial applications, and to alter it and
* redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must
* not claim that you wrote the original software. If you use this
* software in a product, an acknowledgment in the product documentation
* would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and
* must not be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source
* distribution.
*
* */


/*
* Notes:
* This source demonstrates sending HTTP POST request to webserver from C++
* This uses sockets hence can be compiled on Linux, UNIX, Win
*/




#include <iostream>
#include <string>
#include <cstdio>        // add: <= sprintf
// #include <stdlib.h>
// #include <assert.h>
#include <Winsock2.h>

#define SEND_RQ(MSG) \
                /*cout<<send_str;*/ \
  send(sock,MSG,strlen(MSG),0);

using namespace std;
//<exe> hostname api parameters
int request(string hostname, const string api, string parameters, string& message) {
    WSADATA    WsaData;
    WSAStartup(0x0101, &WsaData);

    sockaddr_in sin;
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {return -100;}
    sin.sin_family = AF_INET;
    sin.sin_port = htons((unsigned short)80);

    struct hostent * host_addr = gethostbyname(hostname.c_str());
    if (host_addr == NULL) {return -103;}
    sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list);

    if (connect(sock, (const struct sockaddr *)&sin, sizeof(sockaddr_in)) == -1) {return -101;}

    string send_str;

    SEND_RQ("POST ");
    SEND_RQ(api.c_str());
    SEND_RQ(" HTTP/1.0\r\n");
    SEND_RQ("Accept: */*\r\n");
    SEND_RQ("User-Agent: Mozilla/4.0\r\n");

    char content_header[100];
    sprintf(content_header, "Content-Length: %d\r\n", strlen(parameters.c_str()));
    SEND_RQ(content_header);
    SEND_RQ("Accept-Language: en-us\r\n");
    SEND_RQ("Accept-Encoding: gzip, deflate\r\n");
    SEND_RQ("Host: ");
    SEND_RQ("hostname");
    SEND_RQ("\r\n");
    SEND_RQ("Content-Type: application/x-www-form-urlencoded\r\n");

    //If you need to send a basic authorization
    //string Auth        = "username:password";
    //Figureout a way to encode test into base64 !
    //string AuthInfo    = base64_encode(reinterpret_cast<const unsigned char*>(Auth.c_str()),Auth.length());
    //string sPassReq    = "Authorization: Basic " + AuthInfo;
    //SEND_RQ(sPassReq.c_str());

    SEND_RQ("\r\n");
    SEND_RQ("\r\n");
    SEND_RQ(parameters.c_str());
    SEND_RQ("\r\n");
    char c1[1];
    int l, line_length;
    bool loop = true;
    bool bHeader = false;

    while (loop) {
        l = recv(sock, c1, 1, 0);
        if (l<0) loop = false;
        if (c1[0] == '\n') {
            if (line_length == 0) loop = false;

            line_length = 0;
            if (message.find("200") != string::npos)
                bHeader = true;

        }
        else if (c1[0] != '\r') line_length++;
        message += c1[0];
    }

    message = "";
    if (bHeader) {
        char p[1024];
        while ((l = recv(sock, p, 1023, 0)) > 0)  {
            p[l] = '\0';
            message += p;
        }
    } else {return -102;}
    WSACleanup();
    return 0;
}


int main(){
    string message;

    const string site = "www.somesite.com";
    const string path = "/post_url.pl";
    const string data = "search=hello&date=todat";

    request(site, path, data, message);
    // message contains response!

}



Das entspricht noch nicht den aktuellen C++ Ideen - da geht noch mehr.

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
27.12.2015, 20:34 Uhr
~f.-th.
Gast


Ausser dem folgenden fehlt da eventuell noch mehr.

C++:
int request(const string hostname, const string api, ...



So bleibt für euch noch genug zu tun.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
27.12.2015, 20:35 Uhr
ao

(Operator)



Zitat von Atreju:
Was ich halt nicht verstehe ist der Fehler bei der Übergabe der Funktionsparameter. Da ist char* als Soll angegeben, er bekommt auch einen String ("blah") und meckert irgendwas mit INT herum... das versteh erstmal einer.

Wenn das daran liegt, daß alte Quelltexte nicht mehr mit neuen Compilern lauffähig sind, ist das ja wohl der größte Mist, den ich je gesehen habe. Depricated-Warnings okay - aber überhaupt nicht mehr lauffähig geht ja eigentlich gar nicht. Sollte das eine Arbeitsbeschaffungsmaßnahme für arbeitslose Programmierer werden, die ständig ihre alten Quellcodes auf den neuesten Stand bringen müssen oder was? Verstehe ich nicht.

Jetzt krieg dich mal ein und lass dieses Gepöbel. Was du da codiert hast:

C++:
int request("www.somesite.com", "/post_url.pl", "search=hello&date=todat", string& message);

ist nicht, wie du vielleicht vorhattest, ein Aufruf der Funktion request, sondern die Deklaration einer Int-Variablen namens request und gleichzeitig der Aufruf eines Int-Konstruktors mit drei const-char*-Argumenten und einem string&-Argument. Die Fehlermeldungen

Code:
1>c:\users\user\documents\visual studio 2013\projects\dltest3\dltest3\dltest3.cpp(127): error C2078: Zu viele Initialisierungen
1>c:\users\user\documents\visual studio 2013\projects\dltest3\dltest3\dltest3.cpp(127): error C2440: 'Initialisierung': 'const char [24]' kann nicht in 'int' konvertiert werden
1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist


sagen dir genau das - einfach mal lesen und verstehen.


Zitat:
Allerdings kämpfe ich da gerade mit diesen blöden Strukturen von getaddrinfo() und connect() - es ist schwer zu durchschauen wenn man sich das nicht selbst ausgedacht hat und keine aufschlußreichen Dokumentationen findet. Eine Funktion liefert es SO, die nächste erwartet es völlig anders. Sowas find ich großen Müll.

Vielleicht beginnst du jetzt langsam zu verstehen, warum ich dir C# nahelegen wollte.

Übrigens ist dein Programm ein Beispiel für HTTP-Post. Zum RUNTERladen von Dateien (darum gehts doch, oder?) brauchst du eher HTTP-Get. Nur für den Fall, dass das noch interessiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: