voila j'essaye en vient de transférer des fichier entre 2 pc ...
je me connais je suis très doué pour voir ne pas voir l'évident ... la preuve !
int Seeder::sendFile(const char *file) { FILE *f = fopen(file, "rb"); int r , total = 0; if(f == NULL) return -1; while((r = fread(buffer, 1, sizeof(buffer), f)) > 0) { if(send(sock, buffer, r, 0) > 0) total += r; else return -2; } fclose(f); return total; }
voila après moult et moult essaye, changement du code pour la mille et unième fois il semblerais qu'il n'arrive pas a lire le fichier ( existent après plusieurs vérification ), et que total retourne 0 !
sinon jvais dormir maintenant je pensse
au passage je cherche a récupéré l'array d'une texture ....
( un array de rect<s32> représentent chaque ligne de la texture qui ne prend pas en compte l'alpha ou une couleur choisie )
Dernière modification par Magun (26-01-2009 15:54:01)
Hors ligne
*tousse tousse*
Hors ligne
char buffer[1492]; int total = 0; ifstream myFile ("data.bin", ios::in | ios::binary); while(myFile.read (buffer, 1492)) { int n = send(sock,buffer,1492+1,0); total += n; }
Si tu code en C++ code en C++ jusqu'au bout.
Hors ligne
bon mise a par que je savais pas qui fallait <fstream>
sa marche un peut mieux ... -^.^-
je viens de remarquer que j'avais oublier un "truc" très important, envoyer a tout les client et non pas a "sock"
sinon merci pour ifstream que je n'utilise jamais, pourquoi je ne sais pas
certainement par se que j'aime bien la bibliothèque standard du C ...
( ou surtout car je ne me suis jamais forcé a apprend a faire qu'elle que chose que je connais déjà d'une autre façons )
Hors ligne
Fait une liste de tes clients puis itère tes clients et envoie les données ^^ .
Hors ligne
merci ;)
j'avais régler pour itéré mais client l'envoie semble bien marcher ^^
maintenant je pense que même avec les fonction de "stdio" cela aurais marcher mais vu que tu ma montré la voie de iostream qui malaire moins chiant je vais opté pour celle-ci :)
int Seeder: endFile(const char *file)
{
int total = 0;
ifstream myFile(file, ifstream::in | ifstream::binary);
while(myFile.read (buffer, sizeof(buffer)))
{
int n = 0;
for (list<SOCKET>::iterator It = SockList.begin() ; It != SockList.end() ; It++)
n = send(*It,buffer,sizeof(buffer)+1,0);
total += n;
}
return total;
}
juste qu'a la réception je tombe dans une boucle infinie sans avoirs de fichier enregistré, en regardant iostream de plus près jais crus comprendre qu'il fallait utiliser "ofstream" pour enregistré ... ( jais essayer avec la lic standard du C ses pareille ) je post le code si tu veut voir mais je pense pouvoir men sortir :)
int Seeder::recvFile(const char *file)
{
int total = 0;
ofstream myFile(file, ofstream::in | ofstream::binary);
while(1)
{
int n = 0;
for (list<SOCKET>::iterator It = SockList.begin() ; It != SockList.end() ; It++)
n = send(*It,buffer,sizeof(buffer)+1,0);
myFile.write(buffer, sizeof(buffer));
if(n < 0)
break;
else
total += n;
}
myFile.close();
return total;
}
jais pas essayer un goto a la place du break mais sa devrait marcher le break normalement ....
euh vaut mieu ifstream:: et ofstream:: ou ios::dans option de lecture car il semble que le resulta soit le meme ...
Dernière modification par Magun (27-01-2009 05:31:55)
Hors ligne
C'est sur que si tu utilise send dans ta boucle de réception tu ne vas pas aller loin ^^ .
int Seeder::recvFile(const char *file)
{
int total = 0;
ofstream myFile (file,ofstream::binary);
while(1)
{
int n = 0;
for (list<SOCKET>::iterator It = SockList.begin() ; It != SockList.end() ; It++)
n = recv(*It,buffer,sizeof(buffer)+1,0);
myFile.write(buffer, sizeof(buffer));
if(n <= 0)
break;
else
total += n;
}
myFile.close();
return total;
}
PS : Je ne comprend pas pourquoi tu itére tes clients ?
Le recv n'est pas sencé être partagé ou alors vive le ping si tu fais comme ca...
Dernière modification par yamashi (27-01-2009 05:31:42)
Hors ligne
lol quand je dit que je suis bigleux ^^
j'avais pas vu pour recv/send
"Je ne comprend pas pourquoi tu itére tes clients ?"
pour le serveur, sinon ses sur pour le client cela na aucune utilité, des que mon transfère de fichier fonction je modifie cela
d'ailleur je les déjà modifier !
Dernière modification par Magun (27-01-2009 06:55:43)
Hors ligne
Tu devrais faire un petit schéma pour modéliser tes idées parce que parfois je comprends pas trop ta logique ^^ .
Hors ligne
la je dois dire que se que jais écris ne les absolument pas ... petit modif pour que se soit cohérent ....
sinon sa transfère impeccable, jais bien le même nombre d'octet sur le pc A et B, seulement le contenue est différent o.o''
pourtant je lit et écris avec le même mode .... je doit commencer a fatiguer un peut.
et je retombe encore dans ma boucle infinie grrr
a vrais dire d'habitude je fait un schéma, d'ailleur pourquoi je nan est pas fait uhn ?
ps : ailleur sa s'écris comment ?
Hors ligne
a vrai dire, ailleur s'écrit avec un s : ailleurs. Et pourquoi tu n'en a pas fait, je n'en sais rien !
Hors ligne
merci pour ailleurs ^^
tu peut pas lire dans les pensé ?
ses dommage sa serais rudement utile
Hors ligne
.... mince je suis ou ..., je suis perdue ?
bon depuis la dernière fois je suis toujours sur mon transfert de fichier ....
résultat après réception :
serveur :
taille fichier : 9 377
taille ficher sur le disque : 12 288
client:
taille fichier : varie entre ( 8 192/8 211/12 288 )
taille ficher sur le disque : 12 288
le buffer est de 4096 ( buffer*2 = 8192, buffer*3 = 12 288 )
esse normal ?
de plus le contenue est totalement différent ( du moins l'entête si se n'est pas tout ), et impossible d'envoyer un fichier texte en binaire et que le client retombe encore dans la boucle infinie
http://immortalgalaxy.free.fr/Download/ … client.zip
je demande pas se que vous pensé du code je suis sur que se plus près voir dans les moins que du +
Dernière modification par Magun (27-01-2009 20:32:06)
Hors ligne
Si j'ai utilisé 1492 comme taille de buffer j'ai de bonne raison va lire mon tutorial sur le réseau...
Tu devrais essayer de te familiariser avec le réseau avant de te lancer dans des actions réseau parce que la tu n'as pas de sécurité, tu ne vérifie pas que tu as recu les données correctement, tu ne vérifie pas l'intégrité, tu y vas en Xtrem coding comme on dit et désolé de te dire que dans le réseau il n'y a pas d'Xtrem coding ou alors c'est voué a l'echec du moins a ton niveau après quelques années tu pourras Xtrem coder des applications réseau mais pas encore ^^ .
Dernière modification par yamashi (28-01-2009 03:00:34)
Hors ligne
ouaip j'irais voir ton tuto si je le trouve ...
le but est de faire tournée un petit serveur pour le moment, le transfère de fichier ses un amie qui me la demander puis sa me fait un exercice pour plonger dans les socket
simulation d'un petit mmorpg ...
sinon ses sur niveaux réseaux je suis un gros débutant
enfin je suis pas trop mécontemps de ma class ...
je finie le transfère de fichier et je risque de ne plus retoucher a ma class avens qu'elle que mois
je ferais alors un bon truc avec plusieurs class, l'opcode récupéré l'état de la sock au lieu de mon évent manageur et tout le tralala ...
enfin dommage je commençais à aimer la manipulation des socket
Dernière modification par Magun (28-01-2009 05:05:23)
Hors ligne
Les sockets tu es obligé de rajouter une grosse couche par dessus sinon tu arrives a rien...
Et essaye de faire des efforts en orthographe parce que parfois je comprends pas ^^ .
"avens qu'elle que" -> "avant quelques"...
simulation d'un petit mmorpg ...
Etant moi même dans le projet de faire un MMORPG et étant le codeur réseau et IA je peux te dire que si je n'avais pas fais ma couche réseau par dessus les API je ne pourrais jamais rien faire parce que c'est l'horreur si tout ne se fait pas seul...
Mainteant mon code est super simple et rapide une fois le code complexe et technique finit.
Voila a quoi ressemble mon code maintenant :
Je rajoute la fonction avec son opcode dans le constructeur
_func[CHAT_MSG] = &WorldSession::HandleChatOpcode;
Et voila la définition de ma fonction HandleChatOpcode
void WorldSession::HandleChatOpcode(WorldPacket* recvPacket) { #if defined (_DEBUG) cout << recvPacket->c_str(1) << endl; // c_str(1) returns the first data segment, c_str(2) should be empty in this case #endif _world->_chat->RecvPacket(recvPacket); }
et le serveur va s'occuper par lui même de faire passer les données a la fonction et de l'utiliser si je recois l'opcode CHAT_MESSAGE donc maintenant je n'ai plus qu'a coder les fonctions de traitement des données !
La fonction update de ma worldsession :
void WorldSession::Update() { CUDA_SAFE_CALL (treatPacket()); while(!_recvQueue.empty()) { WorldPacket* p = _recvQueue.front(); if(_func[p->opcode()] != NULL) (this->*_func[p->opcode()])(p); delete p; _recvQueue.pop(); } onWrite(); }
Tu vois simple et self controled.
Hors ligne
ok merci bien =^.^=
pour l'orthographe je fait déjà des efforts, si tu relit mais premier poste du forum tu verrais bien que c'était bien pire
je te préviens si j'arrive a qu'elle que chose ou le contraire ...
Hors ligne
voila ses bon je reçois les fichier en intégrale , le fichier semble être un petit peut plus gros 476Ko -> 500Ko
pour savoir si le message à été envoyer correctement le client envoie la taille au serveur qu'il compare puis dit si ses bon ?
le lien ne change pas si vous voulez voir ... même si ses pas terrible, je vais tout refaire en + propre bien sur
http://immortalgalaxy.free.fr/Download/ … client.zip
dernier soucis je ne reçois pas le début du fichier quand je fait le transfère :
Serveur sur pc A -> client sur pc A
alors que ceux-ci fonctionne
Serveur sur pc A -> client sur pc B
Dernière modification par Magun (03-02-2009 00:08:44)
Hors ligne