Bytes senden per Socket

E

ExRevel

Routinier
hi...

So, bevor ich nun endgültig verzweifel melde ich mich lieber hier. :)
Also, ich schreibe gerade den Codewars Server in C++, da Perl mir zu langsam wurde, dabei möchte ich auch das Netzwerkprotokoll von Stringorientiert auf Byteorientiert umstellen, was bedeutet ich möchte (als beispiel) dem Clienten der sich gerade connected hat einen buffer senden, der folgendes enthält:

0x02 0xff \r\n

So schaut mein source aus:
Code:
int cnetwork::successcodes_welcome(int id){

	char command_byte = 0x02;
	char free_byte = 0xff;
	char *buffer;
	
	buffer = new char[strlen(&command_byte)+strlen(&free_byte)+1];
	
	strcpy(buffer, &command_byte);
	strcpy(buffer, &free_byte);	
	strcat(buffer, "\r\n");

	int retval;
	
	retval = send(client[id], buffer, strlen(buffer), 0);

	return retval;
}
Senden tut er das auch ganz brav, nur das was beim client ankommt kann ich werder mit dem Perlclienten (mittels chr(0x02)) oder dem C++ Clienten in einem char-array-element wiederfinden.

Wenn jemand erfahrungen mit sowas hat, wär ich super froh wenn er mir hilft, da ich erst seit 2 wochen c++ schreibe und mein kenntnisse somit noch etwas begrenzter sind! ;)

ciao Exi
 
So, nun habe ich es selbst herrausgefunden! :) Alle die es sich angeschaut haben ein Danke!!

ciao Exi
 
Öhm, ich hab zwei Fehler gefunden, ich weiß jetzt nicht ob du jetzt beide gefixt hast, ich will ja nicht, dass da noch Fehler drin sind. ;)

Code:
buffer = new char[strlen(&command_byte)+strlen(&free_byte)+1];
"\r\n" sind 3 Bytes. '\r' '\n' '\0'
Du hast jetzt 1+1+1 = 3 Bytes allokiert, aber gebraucht werden 1+1+3 = 5 Bytes.

Warum brauchst du eigentlich auch '\r'? Das ist doch sonst nur unter Windows üblich und eigentlich ist das ja dein Protokoll, kann dir normal egal sein. ;)

Aber hier liegt vermutlich nicht der Fehler.

Code:
strcpy(buffer, &command_byte);
strcpy(buffer, &free_byte);	
strcat(buffer, "\r\n");
Beim 2. strcpy() überschreibst du aus Versehen den beim 1. strcpy() geschriebenen Wert.
Das wird der Fehler gewesen sein.
 
Jo, ich war vorhin schon so festgefahren das ich nix mehr gesehen habe! jetzt sieht das ganze wie folgt aus und funktioniert auch! (strcpy wollte leider nicht wirklich, da kamm immer ein byte reingehüpft, wie habe ich nicht ergründen können):
Code:
int cnetwork::successcodes_welcome(int id){

	char command_byte = 0x02;
	char free_byte = 0xff;
	char *buffer;
		
	buffer = new char[5];

	buffer[0]= command_byte;
	buffer[1]= free_byte;
	buffer[2]= '\r';
	buffer[3]= '\n';
	buffer[4] = '\0';

	int retval;
	
	retval = send(client[id], buffer, strlen(buffer), 0);

	delete buffer;

	return retval;
}
Hier als gegenbeispiel ;) wie man es macht und oben wie man es besser nicht macht! Danke noch mal thorus!

ciao Exi

PS: Das \r ist immer mit drin, da das ganze mal recht betriebssystemunabhängig werden soll und einige leute sich drauf verlassen das es kommt, da es in den standardprotokoll regeln des Projekts so eingetragen ist!
 
Zuletzt bearbeitet:
thorus schrieb:
Warum brauchst du eigentlich auch '\r'? Das ist doch sonst nur unter Windows üblich und eigentlich ist das ja dein Protokoll, kann dir normal egal sein. ;)

Bei Netzwerkprotokollen ist \r\n als EOL eigentlich der Normalfall. Das ist z.B. bei smtp, http und nntp so. Das hat nichts mit Windows zu tun.

Mata ne,

Yuuhi
 
Yuuhi schrieb:
Bei Netzwerkprotokollen ist \r\n als EOL eigentlich der Normalfall. Das ist z.B. bei smtp, http und nntp so. Das hat nichts mit Windows zu tun.
Hmm, wusste ich nicht. Naja, ich finds eigentlich überflüssig, aber naja, Standard ist Standard. ;)
 

Ähnliche Themen

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

wirre zeichen :(

Segmentation Fault bei strcat?

Zeilenanzahl der Konsole im C-Programm nutzen

Internet mit C

Zurück
Oben