J' ai un Problème avec les sokets. Peut on m' aider a faire un serveur

Signaler
Messages postés
10
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
29 juillet 2004
-
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
-
Arsenic

Et oui encore un Problème de débutant avec les sokets mais bon !!
je n' arive pa a coder un serveur pour un Chat.
Voiçi le code source pouriez vous me coriger les faute mercie.
Et avé vous des tutoriaux sur le sujet merci d' avence.

#include <Windows.h>
#include "resource.h"

// ****************pour le réseau***************
#pragma comment(lib, "wsock32.lib")
#include <winsock.h>

//***********************************************

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

{
DialogBox(hInstance,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)MainProc);
return 0;
}

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{

int Select;

switch(message)
{
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
case IDC_CONNECTION:

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

SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
char buffer [255];

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);
while(1)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
recv(sock, buffer, sizeof(buffer), 0);

SetDlgItemText(Dlg,IDC_LIST,buffer);
}
}


return 0;
case IDOK:
EndDialog(Dlg,0);
return TRUE;
case IDCANCEL:
EndDialog(Dlg,Select);
return TRUE;
}
default:
return FALSE;
}
}

8 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
La boucle while(1) ne peut pas se trouver dans la MainProc car elle bloque le traitement des messages !
Il faut soit la mettre dans un thread a part, soit utiliser un autre modele de winsock (comme par exemple WSAAsyncSelect ou WSAEventSelect).

Pour les tutos j'en ai pas, mais voici un livre sur la programmation avec les sockets:
http://betouchi.free.fr/doc_et_ebook/prog_reseau/network2.chm
et les exemples du bouquin:
http://betouchi.free.fr/doc_et_ebook/prog_reseau/exemples-network2.zip
Messages postés
10
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
29 juillet 2004

Arsenic

Mercie pour c indication.
Donc il faudrait que je transforme while(1) en fonction pour pouvoire y faire appelle non ?
Ah oui et c koi "thread".

Je c ke pour certaine personne c kestion seron absurde mais kan on début c normal je pence de se les poser.

mercie
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Lorsque tu lance ton programe, le systeme crée un processus et dans ce processus, un thread, et ce thread (appelé thread principal) execute la fonction WinMain et toutes les fonctions qu'elle appele, les unes a la suites des autres.
Créer un nouveau thread te permetra d'executer des fonctions independament et simultanément du thread principal.
En d'autres termes, ta fonction qui initialise, accepte et traite les connexions une fois lancée dans un autre thread ne bloquera plus le traitement des messages de ta MainProc.
Messages postés
10
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
29 juillet 2004

Arsenic te dit Mercie

Je comprend mieux déja se que tu a voulu dire mais tou cela est encore trés théorique pour moi.
si tu pouvais m' envoyer se qu' il faudrait rajouté ou modifier sa m'aiderais beaucoup car sa fait déja 1 semaine ke je suis desu et je trouve kasi aucun tuto sur le sujet.

merci d' avence
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Déja il faudrait mettre toute la partie socket dans une fonction et lancer cette fonction dans un nouveau thread avec CreateThread(...) lors de l'evenement IDC_CONNECTION.

En haut de cette page je t'ai donné le lien d'un bouquin sur la programmatition en C avec les sockets. Evidement c'est plus long a lire qu'un 'tuto' trouvé sur le net mais au niveau du contenu et de la qualité c'est incomparable...
Messages postés
10
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
29 juillet 2004

Arsenic

OK je v tester se ke tu ma conseillé.
Je v te donner prochènementle code modifier.

merci
Messages postés
10
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
29 juillet 2004

Arsenic

C bon g fait des modification sur le code mais j' ai des problème avec ma class. mais j' espère etre ds la bonne direction.

#include <Windows.h>
#include "resource.h"

// ****************pour le réseau***************
#pragma comment(lib, "wsock32.lib")
#include <winsock.h>

SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;

BOOL Connection(char buffer [255]);

//***********************************************

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

{
DialogBox(hInstance,(LPCTSTR)IDD_MAIN,NULL,(DLGPROC)MainProc);
return 0;
}

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{

int Select;

switch(message)
{
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
case IDC_CONNECTION:

char buffer [255]

BOOL CConnection(buffer);
break;

SetDlgItemText(Dlg,IDC_LIST,buffer);

return 0;
case IDOK:
EndDialog(Dlg,0);
return TRUE;
case IDCANCEL:
EndDialog(Dlg,Select);
return TRUE;
}
default:
return FALSE;
}
}

BOOL CConnection(char buffer [255])
{

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

char buffer [255];

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);

while(1)
{
int sinsize = sizeof(csin);
if((csock = accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
{
recv(sock, buffer, sizeof(buffer), 0);
}
}
}
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Un thread se crée avec CreateThread(...). La fonction lancée par le thread doit avoir un prototype bien précis (voir msdn).

Le probleme est toujours le meme car tu appeles dans ta MainProc une fonction qui contient un 'while(1)' ... du coup cela bloque tout.