begin process at 2012 02 11 06:02:09
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

connection client serveur avec MFC


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

connection client serveur avec MFC

lundi 8 novembre 2004 à 22:19:24 | connection client serveur avec MFC

Spiffou

Bonjour à tous,
j'avance petit à petit dans la programmation socket, mais je suis confronté à une nouvelle difficulté et j'ai une ou deux question sans réponse...

mon but est de developper un jeu dans lequel on peut s'affronter à 2 en LAN. Il n'y aura pas de fort trafic réseau. je cherche cependant à créer une interface client serveur afin d'échanger des données sur l'etat des 2 joueurs, d'ou mes questions:

1- dans mon systeme l'utilisateur doit pouvoir choisir d'etre client ou serveur, mais est il necessaire pour celui qui joue le role du serveur d'avoir un client qui se connecte à lui même pour participer aux échanges (à mon avis non, mais je ne m'y connais pas trop...)

2- j'ai vu dans des programmes l'utilisation massive de threads à tel point que l'on utilisait plus le support MFC est ce que c'est recommandé ou pas?. je m'explique, dans mon appli j'utilise pour la gestion d'évenements:
void CRoomDlg::OnConnetionClient()
et j'ai vu dans d'autres progs la creation d'un thread qui fait l'analyse évenementielle:
LRESULT CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch(Msg)
{
case WM_INITDIALOG:
hDlg = hWnd;
SetClassLong(hWnd, GCL_HICON, (LONG) LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1))); //Permet de charger l'icone
break;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_LISTEN:
char tBuff[6];
int PORT;

GetDlgItemText(hWnd,IDC_PORT,tBuff,5);
PORT = atoi(tBuff);

CListen(PORT);
break;

...
...
laquelle de ces 2 solutions est la meilleure et pourquoi??

3- enfin ma derniere question, en rapport avec l'affreux bout de code ci dessous. j'ai crée un projet MFC AppWizard sur VC++6 et lors de l'execution du code pour les évenements creation serveur et connection client, le prog se bloque(j dois quitter le prog avec fin de tache) et rien ne se passe alors que mon code de connection me semble correct...
si qqun sait pkoi il m'aiderait bien...

merci à tous ceux qui auront le courage de me lire jusque là, si jamais ils ont maintenant le courage pour une réponse ca serait sympa...


//
// code
//

// Définition des variables Globables :
//-------------------------------------
SOCKET C_socket; // socket Client pour emission/reception sur le reseau
SOCKET L_socket; // socket pour ecoute sur le reseau (listen)
SOCKET S_socket; // socket Serveur pour emission/reception sur le reseau

SOCKADDR_IN S_adresse; // adresse du serveur
SOCKADDR_IN C_adresse; // adresse du client

int N_port = 6667; // numero du port de communication
int QUEUE = 5; // taille de la file d'attente pour la connection sur le listen socket


void CRoomDlg::OnConnetionClient()
{
int Ret;
WSADATA WSAData;


// initialisation de Winsock version 2.2
//--------------------------------------
if ((Ret = WSAStartup(MAKEWORD(2,2), &WSAData)) != 0)
{
MessageBox("ERREUR :WSAStartup a echoue","CLIENT",MB_ICONSTOP);

return;
}

// Création du socket client de communication
// sur le reseau
//-------------------------------------------
C_socket = socket( AF_INET, // famille d'adresse du protocol (ici IPv4)
SOCK_STREAM, // type de socket du protocol (ici TPC/IP)
0); // protocol utilisé (ici TCP/IP)

// recuperation de l'adresse ip du serveur en notation point
//----------------------------------------------------------
char ipbuff[16];
GetDlgItemText(IDC_IPSERV,ipbuff,16);


// remplissage de la structure d'adressage winsock
// pour les communication reseau en IPv4
//------------------------------------------------
C_adresse.sin_family = AF_INET;
C_adresse.sin_addr.s_addr = inet_addr(ipbuff);
C_adresse.sin_port = htons(N_port);


// connection du socket sur le reseau
// avec les paramtres definis precdements
//----------------------------------------
if (connect(C_socket,(SOCKADDR*) &C_adresse,sizeof(C_adresse)) == SOCKET_ERROR)
{
MessageBox("ERREUR :connection socket a echoue","CLIENT",MB_ICONSTOP);
WSACleanup();
return ;
}
else
{
MessageBox("Connection OK","CLIENT",MB_ICONINFORMATION);
}

// Reception de données sur socket
//--------------------------------
char buffer[255];
recv( C_socket, // socket sur lequel on recoit
buffer, // buffer de reception
sizeof(buffer), // taille du buffer
0); // flag (dans notre cas tjs 0)


// affichage des données recues
//-----------------------------
SetDlgItemText(IDC_CHAT,buffer);



/*
//Initialisation de WSAAsyncSelect
if(WSAAsyncSelect(m_socket, hDlg, WM_SOCKET, FD_READ|FD_WRITE|FD_CONNECT) == SOCKET_ERROR)
{
MessageBox("ERREUR : WSAAsyncSelect a provoque une erreur","CLIENT",MB_ICONINFORMATION);
WSACleanup();
return ;
}
*/
}

void CRoomDlg::OnCreationServeur()
{
int Ret;
WSADATA WSAData;

printf("Serveur !\n");

// initialisation de Winsock version 2.2
//--------------------------------------
if ((Ret = WSAStartup(MAKEWORD(2,2), &WSAData)) != 0)
{
// NOTE: Since Winsock failed to load we cannot use
// WSAGetLastError to determine the specific error for
// why it failed. Instead we can rely on the return
// status of WSAStartup.
MessageBox("ERREUR :WSAStartup a echoue","SERVEUR",MB_ICONSTOP);
return ;
}


// Création du socket d'écoute sur le reseau
// (demande de connexion client)
//-------------------------------------------
L_socket = socket( AF_INET, // famille d'adresse du protocol (ici IPv4)
SOCK_STREAM, // type de socket du protocol (ici TPC/IP)
IPPROTO_TCP); // protocol utilisé (ici TCP/IP)

// remplissage de la structure d'adressage winsock
// pour les communication reseau en IPv4
//------------------------------------------------
S_adresse.sin_family = AF_INET;
S_adresse.sin_addr.s_addr = htonl(INADDR_ANY);
S_adresse.sin_port = htons(N_port);


// Bind du Socket
// association de l'adresse avec le socket
//----------------------------------------
if( bind( L_socket, (SOCKADDR *)&S_adresse, sizeof(S_adresse)) == SOCKET_ERROR)
{
MessageBox("ERREUR :bind a echoue","SERVEUR",MB_ICONSTOP);
closesocket(L_socket);
return ;
}

// mise à l'écoute de demande de connection client
// on utilise une file d'attente de 5 place
//------------------------------------------------
if (listen(L_socket,QUEUE) == SOCKET_ERROR)
MessageBox("ERREUR :listen on socket a echoue","SERVEUR",MB_ICONSTOP);


// accepation d'une nouvelle connexion quand elle arrive
// cette connexion se fait avec le socket de reception
// prevu a cet effet.
//------------------------------------------------------
char buff[255];
strcpy(buff,"Connexion avec le Serreur OK!\r\n\r\0");

// calcul de la taille du buffer d'adresse client
int taille_adr = sizeof(C_adresse);
if((S_socket = accept(L_socket, (SOCKADDR *)&C_adresse, &taille_adr)) != INVALID_SOCKET)
{
if (S_socket != SOCKET_ERROR)
{
// envoi des données, ici une chaine de caracteres
send( S_socket, // socket sur lequel on envoie
buff, // buffer d'envoi
strlen(buff)+1, // taille du buffer
0); // flag ( dans notre cas

MessageBox("ERREUR :listen on eeeeb socket a echoue","SERVEUR",MB_ICONSTOP);

}
else
MessageBox("ERREUR :listen on beeeesocket a echoue","SERVEUR",MB_ICONSTOP);
}




/*
if(WSAAsyncSelect(m_socket, hDlg, WM_SOCKET, FD_ACCEPT|FD_CLOSE|FD_READ|FD_WRITE) == SOCKET_ERROR)
{
CError(hDlg,"WSAAsyncSelect Error occured : ");
WSACleanup();
return false;
}*/

//Arrivée a ce stade les attentes de connexions se font a l'aide de FD_READ




}
lundi 8 août 2005 à 13:15:46 | Re : connection client serveur avec MFC

YanisLiadon

Réponse acceptée !
Je ne suis pas sur de ce que je vais avancer, mais je crois me souvenir que les fonctions recv et send sont bloquantes.

C'est à dire que si tu lances recv, alors ton appli ne bougera plus tant qu'elle n'aura rien recu.

C'est peut être pour ca qu'on utilise souvent les thread... ca permet de ne pas figer l'appli tant que tu n'as rien recu ;)
lundi 8 août 2005 à 18:30:13 | Re : connection client serveur avec MFC

Spiffou

oui le sujet est un peu vieux et j'ai déjà reglé mes pbs (merci à aardman entre autre).

néanmoins, merci pour la réponse, et oui en effet, la fonction recv est bloquante alors que la fonction send n'occupe le processeur que le temps de l'envoi si je me rappelle bien.
c'est pourquoi j'ai utilisé une programmation evenementielle avec wsa event (pas facile d'ailleurs quand on part de zero...) et tout un tas de threads
^^

bonne continuation et à bientôt pour de nouveaux problèmes
^^






Cette discussion est classée dans : port, serveur, client, socket, adresse


Répondre à ce message

Sujets en rapport avec ce message

socket en C sous Qt [ par taifone ] je developpe une application client/serveur en C.Le client est une interface graphique en Qt et le serveur est un programme serveur.c sous linux j'ai plantage du serveur [ par Adict ] Bonjour [^^happy13] alors voila j'ai fini un projet mais il y a un problème. Il se compose d'une application client et serveur. Il y a quelque temps client/serveur [ par drass00 ] je suis en train de créer une connexion entre client et serveur et je veut de l'aide sur l'affichage de nombre de clients connecte sur le serveur (lis Meilleur solution pour serveur MMORPG. [ par LA_Tupac ] Bonjour à tous! voila ma question: Je développe actuellement mon premier jeu en réseau. Le socket d'envoi du client est en tcp et le socket d'envoi du les socket [ par ben83510 ] Bonjour, Je me suis lancer dans le tutoriel sur les socket. J arrive a effectuer la connexion lorsque j execute le serveur et le client sur mon pc.Ma Thread & Socket [ par katerson ] Bonjour tout le monde! Je travaille actuellement sur un projet serveur/client sur UDP. Mon serveur comporte 3 threads qui doivent scruter (indépenda [C.] 2 Problèmes sur le serveur [ par Adict ] bonsoir tout le monde. [^^happy13] alors ça va faire vraiment longtemps que je patine sur mon serveur. J'ai cherché et cherché pour le 2ème problème serveur web HTML : indentification unique d'un client [ par steph12358 ] BonjourDans le cadre u développement d'un petit serveur HTML propriétaire je cherche à identifier de manière unique chaque client connecté pour gérer socket en C++ [ par rimbaw ] Salut à tous!!-- J'ai fait un petit serveur en C++; tout marche bien mais lorsque le port que j'ecoute est deja occupé, mon application ferme simpleme SOCKET Information serveur [ par kiki67100 ] Salut tout le monde,Je voudrais retirer les information d'un serveur UDP "Gta en multi-joueur" , juste renvoyez se que le client "Officiel" a envoyez


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,618 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales