Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : socket trop lents [ Windows / Réseau & Internet ] (cid7777777)

mardi 10 juillet 2007 à 01:14:54 | socket trop lents

cid7777777

bonjour,
jessaye de faire un jeu qui peu se jouera 2 en reseau local.
je ne connais absolument rien en reso, mais en fouillant sur le net,  jai trouver en gros comment faire et jessaye de mettre la chose sur pied en faisant des test.

le probleme c'est que la methode que jutilise ralenti grandement le jeu,  il parait quil faut que j'utilise un thread mais je ne sais pas comment faire.

pour linstant,  j'ai un programe serveur, qui envoi un caractere a chaque tour, a la fontion client de mon jeu  

comment modifier les code pour que ça ne ralentisse  plus  le  jeu??
et aussi ,  comment transmettre autre chose que des caracteres??(comme un tablo de float par exemple)

merci davance

voici mes codes:

//PROGRAMME SERVEUR
#include <winsock.h>
#include <iostream.h>
#include <windows.h>
DWORD dwEventFlags;
DWORD dwData;

int main()
{
const SHORT Mask = 32768;
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr   = INADDR_ANY;
sin.sin_family    = AF_INET;
sin.sin_port    = htons(50);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));
listen(sock, 0);
int sinsize = sizeof(csin);
              
  while(!((csock = accept(sock,(SOCKADDR *)&csin,&sinsize)) != INVALID_SOCKET))
  {}
   cout << "\nIl y a un client\n";
   while(true){  
            if (GetKeyState('K') & Mask)send(csock,"a",1,0);
            else if (GetKeyState('L') & Mask)send(csock,"b",1,0);
            else send(csock,"c",1,0);
          }
closesocket(sock);
WSACleanup();
}



// FONCTION CLIENT(utilisé par mon jeu)
#include <stdio.h>
#include <iostream.h>
#include <winsock.h>
#include <windows.h>
SOCKET sock;
int res;
char buffer[1024];
int hh;

int con(int a){
if(!a){

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0),&WSAData);

sock = socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN sin;
sin.sin_addr.s_addr = inet_addr("192.168.1.1");
sin.sin_family      = AF_INET;
sin.sin_port        = htons(50);
connect(sock,(SOCKADDR *)&sin,sizeof(sin));
}

else{
     recv(sock,buffer,sizeof(buffer),0);
     res=0;
     if (buffer[0]=='a')res=1;
     if (buffer[0]=='b')res=-1;
     }
  return res;
}






mardi 10 juillet 2007 à 17:57:21 | Re : socket trop lents

katsankat

Membre Club
Salut il est fortement déconseillé d'envoyer 1 char par envoi. Si tu y tiens vraiment tu peux mais il faudrait utiliser setsockopt() pour optimiser l' algorithme de Naggle et là c'est de la programmation socket avancée que certains tutos décriront mieux que moi.

Pour le tableau de float, transformer les floats en chars et les séparer d'un caractère délimiteur.

mercredi 11 juillet 2007 à 17:28:07 | Re : socket trop lents

SnOOpss

Je ne connais pas le mode de fonctionnement des socket donc je dit surement n'importe quoi mais.

Tu envoi juste un char de 1 octets si un tour dure 1/50s de seconde pour avoir un affichage de 50 images par seconde ca demande un debit de 50 o/s. Avec une connexion minimum de 12k/s en upload ca prend 0.004 s donc tu perd 0.004 s a envoyer tes données sur 1 s de jeu.
Je suis a 100/100 d'accord avec katsankat mais je trouve bizarre que ca te ralentisse.

C'est le client ou le serveur qui est ralenti ?

Le client lui par contre lit des char de 1ko/s soit 1000 fois plus.


jeudi 12 juillet 2007 à 00:27:07 | Re : socket trop lents

cid7777777

c'est le client qui est ralenti .  mon serveur nest qun programe qui envoi des donné en boucle,   et le client, c'est mon jeu opengl,  mais aprement, la commande recv met lontemp a sexecuter.

Je ne tien pa speialement a garder cetet methode, jessay juste de trouver une solution pr fair un jeu en reso ,  mais jy arrive pas ça menerve!  Tout les code qu je trouve ne sont pa fait pour le temps réél. A si en fait jen ai trouver un... ET bien entendu comme dabe, le code est enorme, completement incompreensible et uniformement reparti sur 500 000 fichier different!

JEN AI MAAARE!  Ya pas une methode simple???????



jeudi 12 juillet 2007 à 00:27:11 | Re : socket trop lents

cid7777777

c'est le client qui est ralenti .  mon serveur nest qun programe qui envoi des donné en boucle,   et le client, c'est mon jeu opengl,  mais aprement, la commande recv met lontemp a sexecuter.

Je ne tien pa speialement a garder cetet methode, jessay juste de trouver une solution pr fair un jeu en reso ,  mais jy arrive pas ça menerve!  Tout les code qu je trouve ne sont pa fait pour le temps réél. A si en fait jen ai trouver un... ET bien entendu comme dabe, le code est enorme, completement incompreensible et uniformement reparti sur 500 000 fichier different!

JEN AI MAAARE!  Ya pas une methode simple???????



jeudi 12 juillet 2007 à 09:08:21 | Re : socket trop lents

katsankat

Membre Club
Le problème n'est pas que recv() met longtemps à s'exécuter, mais qu'il est bloquant.
Il faut que tu choisisses un modèle d'I/O adapté à tes besoins. Avec un thread par exemple. A noter aussi qu'en UDP tu y gagnerais un peu en latence. Regardes comment sont faits les codes de jeu de morpion/bataille navale etc sur ce site en général ils ne font pas 500.000 lignes de code.

mercredi 18 juillet 2007 à 14:29:43 | Re : socket trop lents

turnerom

Salut,
tu peux jeter un oeil a ma source pour t'aider (peut-etre)
http://www.cppfrance.com/codes/LIBCONNECT-BIBLIOTHEQUE-CPLUSPLUS-CONNEXION_43473.aspx



TuRn3r

jeudi 19 juillet 2007 à 17:35:04 | Re : socket trop lents

SnOOpss

Il existe aussi des socket non bloquant, les socket asynchrone, va voir sur http://www.progzone.free.fr/reseau/socket/sockasync.html (c'est mon premier resultat sur google, me suis pas prit la tete)  il te deconseille meme les threads.
C'est quoi comme jeu ?

Moi je te conseille de rester avec les socket bloquant, comme ca tu n'auras pas besoin de synchroniser ton jeu.

Il n'y a pas besoin de faire passer TOUTES les information aux clients, dans la plupart des jeux par exemple pour le deplacement d'un personnage il envoi une position a t=0s et une autre a t=1s entre les deux ils utlilisent des algorithmes ou l'inverse des interpolation (j'ai pas le nom). Ce systeme passe inapercu dans des wargames mais c'est tres flagrant dans les jeux de tir (pour bf2 j'ai meme lu que le serveur "anticiperait" le deplacement de ta mire quand tu te deplace)



Cette discussion est classé dans : int, include, socket, sin, sock


Répondre à ce message

Sujets en rapport avec ce message

LERREUR QUI TUE §§§§§§§§§§§§§§§§ [ par Avalon10101 ] Vla jai fé mon prog tout é juste mais ya une erreur que je narrive vraiment pas à comprendre ! :C:\Documents and Settings\Alex\Mes documents\Makefile. CreateProcess sur socket [ par Stormy ] Je cherche un moyen d'associer une socket avec un CreateProcess afin de lancer un shell sur CMD. Malheureusement, je ne trouve pas de liens intéressan Multiples messages non reçus...:(( [ par Gendal67 ] Bonsoir tout le monde!Je suis actuellement en cours d'apprentissage des Sockets et j'ai crée une application Client/Server pouvant communiquer ensembl Prob avec les sockets [ par Sload ] Bonjour à tous ! Voila mon probleme , j'essaye de develloper un logiciel client/serveur. Je n'en suis qu'au tout début et j'ai déja un probleme lol ! [C] Scanner de port utilise socket version linux [ par firemax ] Salut :) J'ai une erreur de segmentation et je n'est pas la moindre idée d'ou ca peut venir :( Je n'est aucun warning lors de la compilation mais l [socket et api win]recevoir et envoyer en meme temps [ par shadow1779 ] Bonjour je me suis fais un petit programme irc qui me servira de bot pour auto-op des personne ou d'autre taches diverses, le client aura une boite de probleme de communication entre deux programme [ par smook ] re salut le dernier message que j ai poster c etait pour les socket et la librairie "libwsock.a" mais sayer j ai passer cette etape j ai reussi a fair Socket C et api [ par shadow1779 ] Bonjour,j'ai un petit prob avec un bot que j'essai de faire avec l'api et les sockets en C, pour l'instant on ne peux que cliquer sur le bouton connec pb de compilation (prog utilisant un socket) [ par smook ] boujour a tous bon je vais commencer part bien vous detailler ce qui a detailler : j utilise dev c++ 4.9.9.2 et mon ^programme a pour but d ecouter un [C] socket [ par sheorogath ] bonjour ,j'essai de me faire une sorte de lib client dans un premier temps pour utiliser les socket mais avec mon code je ne peut me connecter null pa


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.