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 : connection client serveur avec MFC [ Archives / Réseau / Internet ] (Spiffou)

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é dans : port, serveur, client, socket, adresse


Répondre à ce message

Sujets en rapport avec ce message

Tutorial - Socket, serveur, client BCPP + GUI [ par NyxArm ] Bonjours tout le monde, je suis présentement en période d'appretissage du language CPP sur Borland(v.6). Maintenant que j'ai acquis quelque conna Evènement sur un socket client [ par darsh99 ] J'aimerais savoir si la méthode utilisée par BlackGoddess pour son serveur (http://www.cppfrance.com/article.aspx?ID=1287) est récupérable pour gérer Thread et socket besoin de conseil [ par kawito ] Salut,je desire realiser un client/serveur TCPle probleme est que les fonctions accept et recv sont bloquante.donc cela bloque l'affichage etc...mon p programmation socket sous linux [ par blazman34 ] Bonjour à tous !!Voici mon probleme :Je suis en train de programmer une application client serveur sous linux, tout a bien marcher juska présent juska Récupérer l'adresse IP du client qui se connecte à mon serveur [ par HolyDev ] Bonjour, bon alor j'utilise et VS C++Lorsqu'un client se connecte à mon serveur j'aimerai afficher l'adresse IP de celui-ci après le message FD_ACCEP problème socket sous windows [ par kod32 ] Voici mon code : (winsock2.h)-----------------------------int main(){ /* inialisation */ WSADATA wsa; WSAStartup(MAKEWORD(2,0), &wsa); /* client & server [ par Stormy ] J'ai codé un serveur simple usant de TCP. Comme client j'utilise NetCat. Or, quand NetCat 'ferme', mon serveur ne détecte pas la clôture de la relatio Qd un Socket reçoit une trame erronée ... [ par valoue ] Bonjour,Je suis en train de développer una appli client serveur sous VC++, j'utilise des SOCKET.Le client et le serveur communiquent en s'envoyant des Client/Serveur, encore..... [ par glubust ] Je veux faire fonctionner une application client/serveur sous UNIX (client) et WINDOWS (serveur).Le programme client envoi une simple requête au serve Question socket - Client/Serveur [ par LordBob ] Bonjour a tous,alors voila je suis en train de developper un petit programme client/serveur... donc tout se passe bien, mon client se connecte parfait


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

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,281 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é.