#1 

26-01-2009 04:00:40

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

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 ! tongue

    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 lol

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 )

Hors ligne


#2 

26-01-2009 14:58:24

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

*tousse tousse* smile

Hors ligne


#3 

26-01-2009 15:49:55

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 76.246.159.7
Courriel

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


#4 

26-01-2009 17:01:49

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

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 wink
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


#5 

27-01-2009 03:10:48

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 76.246.159.7
Courriel

Fait une liste de tes clients puis itère tes clients et envoie les données ^^ .


Hors ligne


#6 

27-01-2009 04:25:41

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

merci wink
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 smile

    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 smile

    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 ...

Hors ligne


#7 

27-01-2009 04:30:56

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 76.246.159.7
Courriel

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...


Hors ligne


#8 

27-01-2009 04:41:43

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

lol quand je dit que je suis bigleux ^^
j'avais pas vu pour recv/send neutral

"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 wink
d'ailleur je les déjà modifier !

Hors ligne


#9 

27-01-2009 05:24:22

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 76.246.159.7
Courriel

Tu devrais faire un petit schéma pour modéliser tes idées parce que parfois je comprends pas trop ta logique ^^ .


Hors ligne


#10 

27-01-2009 05:57:54

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

la je dois dire que se que jais écris ne les absolument pas neutral ... 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 smile

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


#11 

27-01-2009 06:20:35

diOxy
Membres
Avatar de diOxy
Date d'inscription:
Messages: 153
IP: 216.147.138.173
Courriel

a vrai dire, ailleur s'écrit avec un s : ailleurs. Et pourquoi tu n'en a pas fait, je n'en sais rien ! wink


Hors ligne


#12 

27-01-2009 06:28:55

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

merci pour ailleurs ^^

tu peut pas lire dans les pensé ?
ses dommage sa serais rudement utile wink

Hors ligne


#13 

27-01-2009 17:20:17

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

.... mince je suis ou ..., je suis perdue ? smile
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 sad

http://immortalgalaxy.free.fr/Download/serveur_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 + tongue

Hors ligne


#14 

28-01-2009 01:52:16

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 76.246.159.7
Courriel

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 ^^ .


Hors ligne


#15 

28-01-2009 03:21:58

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

ouaip j'irais voir ton tuto si je le trouve ... wink
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 smile
simulation d'un petit mmorpg ...
sinon ses sur niveaux réseaux je suis un gros débutant wink
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 smile
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 tongue

Hors ligne


#16 

28-01-2009 05:57:58

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 76.246.159.7
Courriel

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


#17 

28-01-2009 07:10:32

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.116.81.32
Courriel  Site web

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 smile
je te préviens si j'arrive a qu'elle que chose ou le contraire ...

Hors ligne


#18 

02-02-2009 16:18:27

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.115.102.59
Courriel  Site web

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/serveur_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

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
167 invités en ligne
membre en ligne: -
RSS Feed