Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 02:15

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

Advertisement



[C++] Packets

Discussion on [C++] Packets within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
[C++] Packets

Ich versuche gerade einen simplen Packetbot zu schreiben... Meine Funktion fürs Empfangen sieht momentan so aus:

Code:
void packets::Receive(stringstream &response)
{
	char ReceivedByte;
	while(recv(Socket, &ReceivedByte, 1, 0) > 0)
	{
		response << ReceivedByte;
	}
};
Nur leider dauert das Empfangen der Antwort auf eine simple GET Anfrage ca. 15 Sek. Lässt sich das irgendwie effizienter machen?
.Infinite is offline  
Old 10/30/2011, 13:44   #2
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
Mehr als nur 1 Byte pro recv-Call holen.
ms​ is offline  
Old 10/30/2011, 13:47   #3
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Aber wenn ich mir jetzt zb. immer 5 bytes hole, und von der Antwort fehlen nur noch 4 bytes. Dann wirft recv() einen Fehler und mir fehlen die letzten 4 byte oder?
.Infinite is offline  
Old 10/30/2011, 13:52   #4
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,345
Der zurückgegebene Wert gibt an, wie viele Bytes angekommen sind. Das 3. Argument gibt nur an, wie viele Bytes maximal geholt werden sollen.
ms​ is offline  
Old 10/30/2011, 15:15   #5
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Oh, da hab ich mich wohl vertan... Danke!
.Infinite is offline  
Old 10/30/2011, 18:55   #6


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Du solltest aber den Fall bearbeiten, dass 0 Bytes empfangen wurden. Ein Rückgabewert von 0 bedeutet, dass die Verbindung geschlossen wurde.
MrSm!th is offline  
Old 10/30/2011, 20:18   #7
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Der Fall wird doch mit der Schleife behandelt. Der Wert kann doch eig. nur gleich Null sein, wenn alle Daten übertragen würden und die Verbindung geschlossen wurde oder größer als 0(bzw. hier 1), wenn er noch am empfangen ist...

€: Habs jetzt mit mehreren Bytes(255 ist meine ich maximum) gemacht, bringt aber nichts. Ist genauso langsam wie vorher... Aber bei kurzen Antworten ist es unter einer Sekunde. Nur wenn ich ne komplette Seite Anfrage dauert es lange.
.Infinite is offline  
Old 10/30/2011, 21:25   #8


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Dann mach halt bei ner kompletten Seite noch größere Abfragen.
Da kannst du ruhig ein ganzes KB abfragen bei Seiten mit 80+ KB.

Die Verbindung kann auch durch einen Fehler getrennt werden und dann solltest du richtig reagieren und nicht einfach das ganze als vollständige Antwort betrachten ;f
MrSm!th is offline  
Old 10/30/2011, 22:31   #9
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Ich machs jetzt so:

Code:
string packets::Receive()
{
	string response;
	char ReceivedBytes[1024];
	while(recv(Socket, ReceivedBytes, sizeof(ReceivedBytes), 0) > 0)
	{
		response.append(ReceivedBytes);
	}
	return response;
};
Allerdings dauert es immer noch ewig...



Komisch ist jedoch, dass erst teilweise das Paket und dann nur noch zufällige Zeichenfolgen ankommen. Außerdem gibt die Konsole Piptöne aus. Das war vorher nicht...

€: Array nicht nullterminiert?
.Infinite is offline  
Old 10/31/2011, 00:12   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Du solltest es natürlich nicht einfach ausgeben.

Ein Http Packet hört mit einer Leerzeile auf, ob danach noch ein \0 Byte folgt, weiß ich nicht.

Häng halt sicherheitshalber immer eins dran.

Wie groß ist denn die Seite, die du lädst?
Du kannst es btw auch mit der WinInet Api machen.
MrSm!th is offline  
Old 10/31/2011, 00:34   #11
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Warum nicht ausgeben?

Die Seite ist ca. 80kb groß.
.Infinite is offline  
Old 10/31/2011, 12:36   #12


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Dann liegt es wohl einfach daran, dass du C++ nutzt und der String immer wieder verlängert werden muss.

Sicher, dass es 80kb ohne Bilder etc. sind?
MrSm!th is offline  
Old 10/31/2011, 16:17   #13
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Jep. 84kb. Die Startseite von e*pvp...

Es liegt anscheinend tatsächlich daran, dass der String immer wieder verlängert werden muss. Wenn ich es sofort ausgebe klappts super schnell...
Gibt es also eine bessere Möglichkeit dafür? Ich kann ja schlecht ein 10MB großes char Array erstellen, in das die empfagenen Bytes verschoben werden.


€: dass nur Müll ankam lag an meinem Packet und daran, dass immer 1kb in response verschoben wurde, auch wenn weniger ankommt...

Jetzt sieht es also so aus:
Code:
string packets::Receive()
{
	string response;
	char ReceivedBytes[1024];
	int BytesReceived = 1;
	while(BytesReceived > 0)
	{
		BytesReceived = recv(Socket, ReceivedBytes, sizeof(ReceivedBytes), 0);
		if (BytesReceived < sizeof(ReceivedBytes))
		{
			response.append(ReceivedBytes, BytesReceived);
		}
		else
		{
			response.append(ReceivedBytes);
		}
	}
	return response;
};
.Infinite is offline  
Old 11/01/2011, 00:20   #14


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,413
Die Startseite von Epvp enthält auch Grafiken.

Ein Browser cached die Daten in nem File.
Das geht vermutlich schneller, als jedes mal den Speicher zu relozieren.
Am Ende kannst du ja alles wieder aus dem File in einen String laden, dann musst du nur einmal den Speicher allozieren.
MrSm!th is offline  
Old 11/01/2011, 10:44   #15
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Ähh. Normalerweise ist es doch so, dass im Quelltext der Seite nur die Links zu den Bildern sind und nicht die Bilder selber.
Der Browser fragt dann jedes Bild seperat vom Server an. Aber ich brauche das ja nicht zu machen. Mich interessiert ja nur der Text...

Das mit dem Cachen ist ne gute Idee. Bin gerade dran, habe aber bis jetzt keine große Verbesserung erreicht, das Zeitraubende ist dann wieder, die Datei auszulesen (geht das auch nicht Zeilenweise?).
.Infinite 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?
packets
09/23/2009 - Conquer Online 2 - 0 Replies
is there a program that allows me 2 get packets when i type something in conquer online chat and use the packet to resend it instead of typing it back out. also is there a way 2 remove the limit to how much you can type?
how to use packets?
07/26/2009 - Kal Online - 12 Replies
how to use packet hack and where to download them? lg master
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... :)
Need help with packets
07/28/2007 - Conquer Online 2 - 3 Replies
hello all When u use something in conquer. it sends a packet to conquer right? Whats something good to see what this packet is. Also how can u send this packet again, im new to this so i need some help.



All times are GMT +1. The time now is 02:16.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

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