Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 01:36

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



C++ / Web packets

Discussion on C++ / Web packets within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1


 
Lawliet's Avatar
 
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!
Lawliet is offline  
Old 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.
Rainvair is offline  
Thanks
1 User
Old 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.
ms​ is offline  
Thanks
1 User
Old 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.
käsekuchen11elf is offline  
Thanks
1 User
Old 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:

.Infinite is offline  
Thanks
1 User
Old 02/05/2012, 16:52   #6


 
Lawliet's Avatar
 
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.
Lawliet is offline  
Old 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.
.Infinite is offline  
Thanks
1 User
Old 02/07/2012, 23:38   #8


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Old 02/08/2012, 09:09   #9
 
elite*gold: 0
Join Date: Feb 2012
Posts: 37
Received Thanks: 10
Quote:
Originally Posted by MrSm!th View Post
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.
käsekuchen11elf is offline  
Old 02/08/2012, 20:38   #10


 
Lawliet's Avatar
 
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?
Lawliet is offline  
Old 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?
.Infinite is offline  
Old 02/11/2012, 11:56   #12


 
Lawliet's Avatar
 
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
Quote:
Originally Posted by .Infinite View Post
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.
Lawliet is offline  
Old 02/11/2012, 12:46   #13


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Old 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
Code:
Connection: close
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...
.Infinite is offline  
Old 02/11/2012, 14:05   #15


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Quote:
Originally Posted by .Infinite View Post
Einfach im Header des gesendeten Pakets
Code:
Connection: close
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.
MrSm!th is offline  
Reply


Similar Threads 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.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.