JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=f1a9a45b0f73c0d94217cea0074273efMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

c++ netzwerkprogrammierung dateiübertragung
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 30.07.2008, 14:25    Titel: c++ netzwerkprogrammierung dateiübertragung Antworten mit Zitat

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 Smile) Wahrscheinlich muss das per multithreading usw. gemacht werden oder? Gibst dafür vielleicht eine einfach zu bedienende library?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 30.07.2008, 20:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 30.07.2008, 22:49    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 31.07.2008, 09:13    Titel: Antworten mit Zitat

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 Very Happy )

danke für die Antworten!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 02.08.2008, 18:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 03.08.2008, 19:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 03.08.2008, 19:48    Titel: Antworten mit Zitat

was für einen Fehler gibt es denn? vllt willst du mehr daten senden als du zur verfügung hast?
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 04.08.2008, 07:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 04.08.2008, 08:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 04.08.2008, 10:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 04.08.2008, 10:22    Titel: Antworten mit Zitat

Hmm bei mir ist wenn der SWocket ungültig ist aber nicht 0 sondern -1 . Evt liegt es daran.
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 04.08.2008, 11:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 04.08.2008, 11:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 12.09.2008, 14:04    Titel: Antworten mit Zitat

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 Confused
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 13.09.2008, 16:13    Titel: Antworten mit Zitat

newby hat Folgendes geschrieben:

winsockets und threads mögen sich nicht Confused


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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum