|
You last visited: Today at 01:36
Advertisement
C++ / Web packets
Discussion on C++ / Web packets within the C/C++ forum part of the Coders Den category.
02/05/2012, 14:23
|
#1
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
C++ / Web packets
Hallo,
Ich habe vor ein paar Tagen angefangen auf C++ umzusteigen.
Aktuell versuche ich eines meiner alten Autoit Programme in C++ neu zu schreiben. Dabei muss ich mich unter anderem auf einer Seite einloggen, html Code bearbeiten usw.
Gibts dafür eine gute Lib oder ein Tutorial, wie ich das über TCP löse?
MfG Lawliet!
|
|
|
02/05/2012, 15:02
|
#2
|
elite*gold: 0
Join Date: Aug 2007
Posts: 4,043
Received Thanks: 2,551
|
Mit cURL solltest du dir den Großteil der Arbeit sparen können.
Falls du die Seite grafisch darstellen willst würde ich dir QT oder wxwidgets empfehlen.
|
|
|
02/05/2012, 15:04
|
#3
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
|
HTTP geht ziemlich einfach mit . Die HTML-Seiten kannst du mit einer Regex-lib wie z.B. mit der von parsen.
|
|
|
02/05/2012, 15:55
|
#4
|
elite*gold: 0
Join Date: Feb 2012
Posts: 37
Received Thanks: 10
|
Wenn du nen low-level ansatz suchst: es gibt unter windows und linux Socket interfaces, die man für so was benutzen kann.
|
|
|
02/05/2012, 16:18
|
#5
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Hier gibt es ein relativ gutes Tutorial zu winsocks:
|
|
|
02/05/2012, 16:52
|
#6
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
Wenn ich dabei auch möglichst viel lernen will, was sollte ich dann nutzen?
Ich will nur den html code als string zurück bekommen und eine login session aufrecht erhalten.
|
|
|
02/05/2012, 17:41
|
#7
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Wenn du was lernen willst und das Programm nur auf Windowsrechnern laufen muss, machs mit winsocks und schreib dir eine schöne, handliche Klasse, die du immer wieder verwenden kannst und die auf deine Bedürfnisse zugeschnitten ist.
|
|
|
02/07/2012, 23:38
|
#8
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Winsocks sind fast identisch auf Linux aufgebaut.
Du könntest auch die WinInet Api nutzen, die übernimmt schon den ganzen Http-Protokoll-Scheiß, aber auch nicht mehr (vermutlich eher weniger), als Autoit übernimmt
Von daher solltest du mehr als mit Autoit lernen.
|
|
|
02/08/2012, 09:09
|
#9
|
elite*gold: 0
Join Date: Feb 2012
Posts: 37
Received Thanks: 10
|
Quote:
Originally Posted by MrSm!th
Winsocks sind fast identisch auf Linux aufgebaut.
|
nicht ganz. die linux sockets verhalten sich wie FilePointer, wohingegen die winsock library auf HANDLES arbeitet. kleiner, aber gemeiner unterschied
zudem heißen einige der Funktionen leicht anders.
|
|
|
02/08/2012, 20:38
|
#10
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
Also ich habs jetzt mit Winsock geschafft, bis auf Recv() :/
Ich bekomms einfach nicht hin bis zum Ende zu lesen und dann die Schleife zu breaken.
Recv darf ja nie nichts empfangen, da man sonst ewig an der Stelle hängt. Wie empfange ich nur den HtmlHeader, damit ich die restliche Länge des Files aus "Content-Length" lesen kann?
|
|
|
02/08/2012, 21:37
|
#11
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
So zum Beispiel sollte es gehen
Code:
string XYZ::Receive()
{
string response;
char ReceivedBytes[256];
int BytesReceived = 1;
while(BytesReceived > 0)
{
BytesReceived = recv(Socket, ReceivedBytes, sizeof(ReceivedBytes), 0);
response.append(ReceivedBytes, BytesReceived);
}
return response;
};
Es fehlt eventuell noch ein bisschen Fehlerbehandlung aber funktionieren tut es.
Der Header ist vom Content durch ein "\r\n\r\n" getrennt. Einfach nen break setzen, wenn du diese Bytefolge empfangen hast. Dann haste nur den Header. Aber wozu nur den Header empfangen, wenn man die ganze Seite haben kann?
|
|
|
02/11/2012, 11:56
|
#12
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
Quote:
Originally Posted by .Infinite
So zum Beispiel sollte es gehen
Code:
string XYZ::Receive()
{
string response;
char ReceivedBytes[256];
int BytesReceived = 1;
while(BytesReceived > 0)
{
BytesReceived = recv(Socket, ReceivedBytes, sizeof(ReceivedBytes), 0);
response.append(ReceivedBytes, BytesReceived);
}
return response;
};
Es fehlt eventuell noch ein bisschen Fehlerbehandlung aber funktionieren tut es.
Der Header ist vom Content durch ein "\r\n\r\n" getrennt. Einfach nen break setzen, wenn du diese Bytefolge empfangen hast. Dann haste nur den Header. Aber wozu nur den Header empfangen, wenn man die ganze Seite haben kann?
|
Nein, da ja recv niemals 0 zurückgibt.
|
|
|
02/11/2012, 12:46
|
#13
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Doch, wenn die Verbindung geschlossen wurde, dann hast du die ganze Seite.
Er sagte doch schon, du sollst selbst aus der Schleife austreten, wenn du die Bytefolge erhalten hast! Das war noch kein fertiger Code.
Du müsstest nun in der Schleife prüfen, ob die Bytefolge in der Response ist und falls ja, trittst du aus der Schleife aus und hast den Header.
Aber warum austreten? Kannst doch einfach direkt in der Schleife die Size auslesen und dann dementsprechend weiter verfahren. Oder geht es dir gar nicht darum, zu wissen, wie viel du noch herunterladen musst?
@Infinite:
1. Ist doch seine Sache?! Wenn der den Rest nunmal nicht will, warum Kapazitäten verschwenden?
2. Wenn du zb. vorher die Größe der Seite haben willst, damit du weißt, wann du die Schleife abbrechen kannst, weil sie erreicht ist. Das ist hilfreich, wenn du dem Server nicht sagst, dass du nach Beenden des Ladevorgangs willst, dass die Verbindung geschlossen wird. Dann musst du ja irgendwie herausfinden, dass du die Seite schon geladen hast, recv gibt dann ja kein 0 zurück.
|
|
|
02/11/2012, 13:58
|
#14
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Quote:
Das ist hilfreich, wenn du dem Server nicht sagst, dass du nach Beenden des Ladevorgangs willst, dass die Verbindung geschlossen wird.
|
Einfach im Header des gesendeten Pakets
statt
Code:
Connection: keep-alive
schreiben.
Der Server weiß, dass die Verbindung geschlossen werden soll und recv() gibt 0 zurück. Alles bestens
Mir fällt spontan kein Grund ein, aus dem man das vermeiden sollte...
|
|
|
02/11/2012, 14:05
|
#15
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Quote:
Originally Posted by .Infinite
Einfach im Header des gesendeten Pakets
statt
Code:
Connection: keep-alive
schreiben.
Der Server weiß, dass die Verbindung geschlossen werden soll und recv() gibt 0 zurück. Alles bestens
Mir fällt spontan kein Grund ein, aus dem man das vermeiden sollte...
|
Und wenn du lesen könntest, wüsstest du, dass ich sagte, dass sein Vorhaben nötig ist, WENN MAN DAS GERADE NICHT WILL!
Ein Grund wäre die Performance. Bei großen Anfragen kostet es viel Zeit, die Verbindung jedes mal neu aufzubauen.
|
|
|
|
|
Similar Threads
|
[Packets] Wie änder ich flyff packets?
07/16/2011 - Flyff Private Server - 19 Replies
HeyHo,
Ich würde sehr gerne wissen wie man die Flyff Packets ändert...
ich denke mal Zahlen ändern werden nicht ausreichen oder?
|
WHICH PACKETS....
04/24/2011 - Conquer Online 2 - 28 Replies
mind if anyone tell me which specific packets are used to send and receive packing of dbs into dbscrolls cuz i cant seem to get wpepro record packets for me..
|
packets
11/19/2009 - Kal Online - 25 Replies
Hey^^
i need some help.
i need to know how the packets of the in engine are crypt?
German:
ich muss wissen wie die packets der int engine verschlüsselt sind.
|
Help with Packets
05/03/2009 - CO2 Private Server - 7 Replies
Ok here is a small problem when i use Expballs i cant get it to update ur level only if you dc i know its packet i tryed alot but they wont work
else if (ItemParts == "723700")
{
if (Level < 100 && EPotRate == false)
AddExp((ulong)(1295000 + Level * 100000), false);
else if (Level < 110 && EPotRate == false)
AddExp((ulong)(1395000 + Level * 160000), false);
else if (Level < 115 &&...
|
packets
06/11/2008 - Kal Online - 17 Replies
Hey...
ich wollte mal fragen ob mir jemand erklären könnte womit man packets an server sendet...
hab mal bisschen rumgesnifft und wollte mal paar sachen testen... :)
|
All times are GMT +2. The time now is 01:36.
|
|