Programmation Réseau en c : help !

cs_bubbless Messages postés 14 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 1 mars 2005 - 28 févr. 2004 à 18:36
cs_bubbless Messages postés 14 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 1 mars 2005 - 29 févr. 2004 à 19:47
Bonjour !

Dans le cadre d'un projet, je souhaiterais creer un système client/serveur en flux simple. Le but est en fait de permettre aux utilisateurs d'un jeu du compte est bon de joueur en réseau : il me suffit donc d'envoyer simplement de temps en temps les résultats, ou l'ordre de lancer le jeu. Eventuellement, si possible j'aimerais pouvoir inclure une possibilité de chat, mais, chaque chose en son temps !

J'ai donc programmé un tel système, mais, je me heurte à plusieurs problèmes : Help, please !
Tout d'abord, pour avoir accès aux fonctions nécessaires, j'ai inclu winsock.h , et même windows.h (j'utilise visual c++, mais j'ai le même problème avec dev c++),mais, au moment de mettre "build" (il n'y a apparemment pas d'erreur de syntaxe, ce qui signifie qu'apparemment il reconnait les instructions...), il m'indique de nombreuses erreurs de liens ! Par exemple :

jeureseau.obj : error LNK2001: unresolved external symbol _select@20
jeureseau.obj : error LNK2001: unresolved external symbol _accept@12
jeureseau.obj : error LNK2001: unresolved external symbol _listen@8
jeureseau.obj : error LNK2001: unresolved external symbol _bind@12
jeureseau.obj : error LNK2001: unresolved external symbol _htonl@4

Que dois-je faire pour éviter de telles erreurs ?? il m'est impossible de le tester dans de telles conditions..

D'autre part, je souhaiterais qu'au début de la partie, le serveur attende un nombre de joueur prédeterminé pour donner l'ordre de lancer le jeu, j'ai pour l'instant écrit celà de la façon suivante, mais j'ai de très gros doutes ! Pourriez vous m'indiquer si c'est bon ? :

if (listen(sockfd, BACKLOG) == -1)
{
perror("listen");
exit(1);
}

// Cependant, il nous faut garder toutes les connections entrantes, et les surveiller !
// (surtout si un chat est envisagé) : on va donc (essayer) d'utiliser la fonction 'select'
// On accepte donc toutes les connections entrantes, et on les ajoute au descripteur de
// fichier. Notons que pour l'appel à 'select', il faut garder en mémoire le maximum :
// avant d'ajouter la nouvelle socket à l'ensemble des socket déjà existantes, on
// compare donc sa valeur au maximum.

// Avant tout, initialisons l'ensemble des descripteurs de fichiers qui sera mis à jour
// au fur et à mesure des nouvelles connections

FD_ZERO(connexions);

// On va maintenant boucler pour accepter un nombre de connexions prédefinis au moment
// du choix du nombre de joueurs : on attend tous les joueurs.

joueurs=0; // Pour l'instant, on a accepté aucun joueur

// Avant d'accepter les joueurs, on définit le temps d'attente nécessaire à la
// fonction select : 3 secondes (par exemple)

temps.tv_sec=3;
temps.tv_usec=0;

while(joueurs<max_joueur)
{
sin_size = sizeof(struct sockaddr_in); // Il nous faut la taille de l'adresse...
if ((new_fd accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) -1)
// La nouvelle socket est new_fd
{
perror("accept");
continue;
}
printf("serveur: Reçu connection de %s\n",inet_ntoa(their_addr.sin_addr));
joueurs=joueurs+1; // Un nouveau joueur est connecté

// On va maintenant ajouter cette connexion à la liste des connexions à surveiller :

FD_SET(new_fd,connexions);

// Et au tableau (plus facile à manipuler) des sockets

tabsock[joueurs-1]=new_fd;

// On vérifie que la nouvelle socket n'est pas plus grande que l'ancien max

if (max<new_fd) max=new_fd;
}

Enfin, j'ai deux autres questions :

La fonction select, telle que je l'ai par exemple utilisée là, modifie-t'elle la liste de sockets 'connexions' de façon à n'y laisser que ceux en attente (c'est à dire placés en mode recv) ou alors tous ceux qui sont encore connectés ? Enfin, il serait bien sûr plus simple de générer à chaque client un processus fils qui s'en occuperait personnellement, mais , je n'ai pu trouver de doc satisfaisante à ce sujet : quelqu'un aurait il quelque chose à me proposer ???

Merci beaucoup de toute l'aide que vous pourrez m'apporter, c'est vraiment très important et malheureusement, j'ai un prof de suivi qui ne m'aide que très peu (voire, pour l'instantpas du tout ...) Merci beaucoup par avance !!

Aurélien

2 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
28 févr. 2004 à 19:13
Salut,
Pour le 1er probleme, il faut linker ws2_32.lib pour pouvoir compiler.
Sous visual c++ tu peux ajouter ca apres les #includes:
#pragma comment(lib, "ws2_32.lib")

Pour la fonction select: si tu passes ta structure en 2eme param, elle ne laisse que les sockets qui peuvent lire quelque chose, accepter une connexion ou qui on été fermées (deconnexion).
C'est telement mieux expliqué sur MSDN...

Pour le dernier probleme, cela s'appele des threads et il y a pas mal d'exemples sur ce site.
0
cs_bubbless Messages postés 14 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 1 mars 2005
29 févr. 2004 à 19:47
Merci beaucoup pour cette réponse ! ça marche tout de suite bcp mieux ! J'ai maintenant une autre question, mais, je vais la poster sur un autre sujet
0
Rejoignez-nous