#0 

09-01-2009 23:45:37

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

bon voila comme indiquer dans la sujet "lib réseaux" de Tmyke ou je disais que je recoderais tout a partir du morceaux de code de Yamashi

bien que mon code se rapproche encore beaucoup de celui de départ poster par Yamashi.... °°'
le serveur reçoit des packets que le client n'envoie pas hmm

le client est sensée envoyé "une chaine bidon a envoyer" tout les sec, voila se que le serveur récupère :

code console :

Code:

Seeder demarre : a l'ecoute du port 23
Nouveau client, IP : 192.168.1.3
Nous avons recu : 1499 octets
Buffer : 

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1499 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1421 octets
Buffer :
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : 1460 octets
Buffer : une chaine bidon a envoyer

?Nous avons recu : 1460 octets
Buffer : lJB
?Nous avons recu : 1176 octets
Buffer : ig/i386/w32-shared-ptr.c
?Nous avons recu : -1 octets
Buffer : ig/i386/w32-shared-ptr.c

Process returned -1073741819 (0xC0000005)   execution time : 18.250 s
Press any key to continue.

je me demande d'où cela peut venir ? ^^
faut dire que vu les connaissances que jais dans se domaine ... smile
          projet et source

Hors ligne


#1 

10-01-2009 04:17:43

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

Tu utilisais la taille de buffer donc 4096 octets donc tu envoyer de la mémoire hors de ta chaine.
Donc j'ai modifier ta fonction sendMsg par :
int Seeder::sendMsg(std::string msg)
{
    return send(sock,msg.c_str(),msg.size(),0);
}
et dans ton main :
se.sendMsg(std::string("une chaine bidon a envoyer "));

Hors ligne


#2 

10-01-2009 12:05:42

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

à ouai cela n'était aussi méchant que je ne le pensai ^^
merci wink

Hors ligne


#3 

11-01-2009 22:26:10

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

Encore moi big_smile

bon le code marche impeccable dans tout les sensée après test smile

seul problème :
       si l'un des clients se déconnecte le serveur renvoie -1073241819 puis se ferme ( erreur de ? )

voila donc je voudrais juste savoirs comment détecter la déconnections d'un client pour le supprimer de la list d'envoi/réception
jais vu qu'elle que par l'utilisation de FD_CONNECTE, FD_ACCEPT ... etc si sa un qu'elle conque rapport ... smile
le déboguer ne trouve rien ...

Hors ligne


#4 

11-01-2009 22:46:42

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

Si recv retourne -1 le client est déconnecté.

Hors ligne


#5 

11-01-2009 23:26:18

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

et bien il y a deja un test sur recv avec SOCKET_ERROR qui vaut -1
qui suit d'un SockList.erase mais sa change rien le serveur crash toujours ...

edit : jais fait un upgrate du rar qui est sur le précédent message si vous vouler voir smile

Dernière modification par Magun (11-01-2009 23:26:49)

Hors ligne


#6 

12-01-2009 16:58:06

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

bon jais trouver une solution temporaire ....
le client envoi /*DECO*/ quand il quitte le programme pour que le serveur l'enlève de la list ....

Hors ligne


#7 

13-01-2009 02:17:02

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

Essaye :

Code:

           
                    if(FD_ISSET(*It,&readfs))
                    {
                        int n = recv(*It,buffer,sizeof(buffer),0);
                        if(n == -1)
                            SockList.erase(It);
                        else {
                            printf("> %s\n",buffer);
                            sendMsg(std::string(buffer));
                        }
                     }

/*DECO*/


Pas bien il ne faut pas envoyer des données raw il faut que tu y aille a coup de opcode cast.
Avant de faire le système réseau il faut bien bosser sur la couche qui va te permettre de travailler sur les données avant de te lancer dans la communication.
Par exemple j'ai créer un classe ByteBuffer qui est capable de caster tout est n'importe quoi je peux même envoyer une classe sur le réseau et la reinterpret côté client ou serveur.
Il faut faire en sorte que la gestion soit simple et rapide, il faut que tu puisse te dire : " Cool je vais plus avoir a toucher au réseau n'y a m'en soucier" tu as besoin d'un système indépendant qui peut tout gérer seul.
De plus tu dois faire en sorte que le système gère lui même toutes les erreurs possible...

Dernière modification par yamashi (13-01-2009 03:22:40)

Hors ligne


#8 

13-01-2009 03:59:56

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

ahh dsl je n'est pas mis a jours mais source depuis le dernier post .. smile
je passe par qu'elle que structure ..

j'utilisais déjà le même code juste que jais des struct en + :

Code c++ :

                    if(FD_ISSET(*It,&readfs))
                    {
                        sem.info.recvSock = It;
                        sem.info.octRecv = recv(*It,buffer,sizeof(buffer),0);
                        if(sem.info.octRecv == -1)
                            deleteClient(sem.info.recvSock);
                        else
                            sem.recv = true;
                    }


mais le serveur crash toujours si un client est quitter anormalement :s
je teste quand même avec le tien mais les résultats sont les même ... , je mais a jours mais source smile
et dsl de ne pas lavoirs plus tôt, je doit tempêter un peut ...

Dernière modification par Magun (16-08-2009 10:58:19)

Hors ligne


#9 

14-01-2009 02:25:37

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

J'ai remplacer :

Code:

if(sem.info.octRecv == -1)
                            SockList.erase(It);

par

Code:

if(sem.info.octRecv == -1)
                        {
                            SockList.erase(It);
                            break;
                        }

C'est seulement que tu itére sur le même objet 2 fois donc une fois qu'il n'existe plus tu ne peux plus itérer dessus.

Hors ligne


#10 

14-01-2009 02:41:24

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

ah ouai ... cool ... sa marche smile

j'aurais jamais pensé a un break, je comprend bien que je peut pas itérer 2 fois dessus, une erreur de ma par ...
merci beaucoup wink

Hors ligne


#11 

20-01-2009 02:10:50

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

bon je m'embete pas je reprend se topic smile
jvien d'esseyé de compilé le serveur sous unix mais code blocks ne trouve pas -lgmon et je trouve pas grand chose sur google :[
si on peut me dire a qu'elle paktage sa correspond, au pire je l'instalerais manuelement tongue

ps : sous mandriva wink

Hors ligne


#12 

20-01-2009 17:51:09

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

ses bon smile

Hors ligne


#13 

20-01-2009 18:05:41

ayboangelus
Membre
Date d'inscription: 08-12-2008
Messages: 53

Bien joué ^^


Akhynia - MMORPG en projet => http://www.akhynia.fr

Hors ligne


#14 

01-01-2014 11:05:04

smicky125
Petit nouveau
Date d'inscription: 01-01-2014
Messages: 1

le client envoi /*DECO*/ quand il quitte le programme pour que le serveur l'enlève de la list ....

Hors ligne


#15 

01-01-2014 15:46:28

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

ce n'est pas une bonne méthode
l'orsque tu clot la connetion du client un packet est envoyer au serveur pour le notifier
c'est intégret au protocol, et du coter serveur si tu reçois -1 par recv c'est que la connection a été fermer ou intérompue

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
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
14 invités en ligne
Aucun membre connecté
RSS Feed