Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 30.07.2008, 14:25 Titel: c++ netzwerkprogrammierung dateiübertragung |
|
|
hallo,
ich hab im internet ein paar tutorials zum thema netzwerk programmierung durchgearbeitet. In den meißsten Fällen wird beschrieben wie man einen einfachen chat baut. Dabei werden die daten immer als chararray übermittelt. Wenn ich jetzt ganze dateien übertragen möchte, muss ich dann die datei binär auslesen und als string schicken?!? Wäre das nicht ziemlich langsam? Welche möglichkeiten gibt es da?(oder nach welchen stichwort muss ich suchen ) Wahrscheinlich muss das per multithreading usw. gemacht werden oder? Gibst dafür vielleicht eine einfach zu bedienende library? |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 30.07.2008, 20:47 Titel: |
|
|
Library: RakNet
Ansonsten übersiehst du da etwas. Bei Winsok werden Bytes übermittelt. Da es diesen Datentyp nicht gibt wird char verwendet, welcher die gleiche Größe hat. Wenn du also eine Datei übertragen willst, überträgst du die Bytes, welche in char gespeichert werden können.
Da du nicht alles auf einmal übertragen kannst, musst du es in Fragmenten ( Teilen ) schicken.
Ich würde erst die anzahl der Bytes übertragen und dann die Bytes selbst.
EDIT: Bevor sich jetzt jemand daran stört das hier weiter oben steht das char != byte. Also ein Byte speichert Werte zwischen 0x00 und 0xFF, ein Char ebenso. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.07.2008, 22:49 Titel: |
|
|
Chriss hat Folgendes geschrieben: | EDIT: Bevor sich jetzt jemand daran stört das hier weiter oben steht das char != byte. Also ein Byte speichert Werte zwischen 0x00 und 0xFF, ein Char ebenso. |
Genau, und in den vielen Fällen ist sogar char == byte, denn der Typ byte wird meistens als CPP: | typedef unsigned char byte; | definiert, wobei das unsigned für den compiler keinen wirklichen unterschied macht.
ansonsten kann ich für netzwerkprogrammierung sehr dieASIO C++ Library empfehlen. Sie baut auf dem C++-Standard auf und hängt mir der boost-library zusammen (baut auf boost auf). d.h. das sie- extrem sicher
- extrem effizient
- extrem schön
- plattformunabhängig und
- typsicher
ist. Das letzte hebt sie zudem ziemlich von dem char*-gewurschtel anderer Libraries ab, also du arbeitest mit asio eher high-level und in c++. Ich besitze asio auch und hab ein bisschen damit rumexperimentiert, und ich bin sehr begeistert. Sie ist auch gut dokumentiert mit vielen beispielen etc (siehe hier, die dokumentation der library mit examples und tutorial etc.)
Gruß DXer |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 31.07.2008, 09:13 Titel: |
|
|
ich hab mir die beiden librarys angeguckt, finde aber das raknet nicht deutlich einfacher oder übersichtlicher ist als winsockets.
Ich glaube ich versuche mir eine eigene Netzwerkklasse zu schreiben per Winsockets und Multithreading. (dank des tollen tutorials hier im Forum )
danke für die Antworten! |
|
Nach oben |
|
|
fkrauthan Junior JLI'ler
Alter: 33 Anmeldedatum: 10.04.2005 Beiträge: 96 Wohnort: Germering Medaillen: Keine
|
Verfasst am: 02.08.2008, 18:05 Titel: |
|
|
JO schick wirklich einfach die anzahl der bytes die deine Datei hat. Danach schickst du einfach alle bytes und öffnest eine Datei und packst dorten jedes byte gleich rein. Musst antürlich als Binary öffnen. Dann klappt das alles sehr wunderbar. _________________
"Die Codeschleuder" das Spieleprogrammierer Magazin |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 03.08.2008, 19:34 Titel: |
|
|
so, hab ein problem. Die send funktion verursacht bei mir einen laufzeit fehler. Kann das vielleicht daran liegen, dass ich sie in einem thread aufrufe? mein code sieht so aus:
CPP: | DWORD WINAPI Send(SOCKET s2, char* buf)
{
char buffer[1024];
long rc = 0;
strcpy_s(buffer, 1024, buf);
if(s2 == 0) cout<<"Socket nicht übergeben!";
rc = send(s, buffer, sizeof(buffer), 0);
if(rc == 0) cout<<"Fehler beim senden des packages";
return 0;
}
void cln_Send(char* buf)
{
DWORD Id;
HANDLE Handle;
Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Send(s, buf), NULL, 0, &Id);
}
|
|
|
Nach oben |
|
|
fkrauthan Junior JLI'ler
Alter: 33 Anmeldedatum: 10.04.2005 Beiträge: 96 Wohnort: Germering Medaillen: Keine
|
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 04.08.2008, 07:55 Titel: |
|
|
es kommt einfach die meldung programm hat einen fehler festgestellt und musste beendet werden. Zu viele Buchstaben können es eigentlich nicht sein, weil ich manuell nur vier eingebe. |
|
Nach oben |
|
|
fkrauthan Junior JLI'ler
Alter: 33 Anmeldedatum: 10.04.2005 Beiträge: 96 Wohnort: Germering Medaillen: Keine
|
Verfasst am: 04.08.2008, 08:11 Titel: |
|
|
aber du sendest mehr als du vorhanden hast. du sendest willt aus dem Speicher bereich raus sobald die 2 Buchstaben überschritten sind. So sehe ich das zumindest. _________________
"Die Codeschleuder" das Spieleprogrammierer Magazin |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 04.08.2008, 10:05 Titel: |
|
|
ich kann auch sowas hier machen und bekomme trotzdem einen fehler:
CPP: | send(s, "test\0", sizeof("test\0"), 0);
|
das kann doch eigentlich nur daran liegen, das der socket nicht korrekt ist, das überprüfe ich aber doch vorher?! |
|
Nach oben |
|
|
fkrauthan Junior JLI'ler
Alter: 33 Anmeldedatum: 10.04.2005 Beiträge: 96 Wohnort: Germering Medaillen: Keine
|
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 04.08.2008, 11:02 Titel: |
|
|
kann sein, aber ich übergebe das als parameter, und wenn nichts übergeben wird ist das glaub ich 0 oder NULL. Wie kann ich denn überprüfen ob s ein gültiger socket ist? |
|
Nach oben |
|
|
fkrauthan Junior JLI'ler
Alter: 33 Anmeldedatum: 10.04.2005 Beiträge: 96 Wohnort: Germering Medaillen: Keine
|
Verfasst am: 04.08.2008, 11:07 Titel: |
|
|
also wenn du die Standrad CSockets hernimmst bekommst du als Socket einfach einen int wert. Der ist -1 wenn der Socket ungültig ist. Wenn du eine Funktion hast kannste ja im Prototypen ja eine vordefinirte variable setzen, die das ganze als ungültig markiert. _________________
"Die Codeschleuder" das Spieleprogrammierer Magazin |
|
Nach oben |
|
|
newby JLI'ler
Anmeldedatum: 17.08.2007 Beiträge: 106
Medaillen: Keine
|
Verfasst am: 12.09.2008, 14:04 Titel: |
|
|
so, nochmal ne frage:
Rufe ich die send() funktion innerhalb eines threads auf liefert sie einen laufzeitfehler, in der main() funktioniert sie einwandfrei.
CPP: | send(clientsocket, "test", 4, 0);
|
winsockets und threads mögen sich nicht |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 13.09.2008, 16:13 Titel: |
|
|
newby hat Folgendes geschrieben: |
winsockets und threads mögen sich nicht |
Ich glaube, es liegt an der seltsamen Art und Weise wie du Threads verwendest. Nicht an der Kombination winsock-threads.
Siehe:
CPP: | Handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Send(s, buf), NULL, 0, &Id); |
|
|
Nach oben |
|
|
|