#0 

26-01-2009 05:00:40

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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

Code:

    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 )

Dernière modification par Magun (26-01-2009 15:54:01)

Hors ligne


#1 

26-01-2009 15:58:24

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

*tousse tousse* smile

Hors ligne


#2 

26-01-2009 16:49:55

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

Code:

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


#3 

26-01-2009 18:01:49

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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


#4 

27-01-2009 04:10:48

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

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

Hors ligne


#5 

27-01-2009 05:25:41

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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 :)

Code:

    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 :)

Code:

    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


#6 

27-01-2009 05:30:56

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

C'est sur que si tu utilise send dans ta boucle de réception tu ne vas pas aller loin ^^ .

Code:

    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


#7 

27-01-2009 05:41:43

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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 !

Dernière modification par Magun (27-01-2009 06:55:43)

Hors ligne


#8 

27-01-2009 06:24:22

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

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

Hors ligne


#9 

27-01-2009 06:57:54

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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


#10 

27-01-2009 07:20:35

diOxy
Abonné
Date d'inscription: 10-10-2006
Messages: 153

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


#11 

27-01-2009 07:28:55

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

merci pour ailleurs ^^

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

Hors ligne


#12 

27-01-2009 18:20:17

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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/ … 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

Dernière modification par Magun (27-01-2009 20:32:06)

Hors ligne


#13 

28-01-2009 02:52:16

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

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


#14 

28-01-2009 04:21:58

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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

Dernière modification par Magun (28-01-2009 05:05:23)

Hors ligne


#15 

28-01-2009 06:57:58

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

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

Code:

_func[CHAT_MSG] = &WorldSession::HandleChatOpcode;

Et voila la définition de ma fonction HandleChatOpcode

Code:

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 :

Code:

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


#16 

28-01-2009 08:10:32

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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


#17 

02-02-2009 17:18:27

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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/ … 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


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
82 invités en ligne
Aucun membre connecté
RSS Feed