Bonjour,

Je suis actuellement en train de faire un petit prog de chat entre 2 pc en reseaux.J essaye donc d associer le tuto sur les socket et celui sur l API WINDOWS sans trop de succes pour le moment.Je n arrive pas a etablir de connexion!Je ne sais pas si j utilise la fonction WSAAsyncSelect corectement.
Je me tourne donc vers vous :
Mon serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
 
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
 
#define ID_ENVOYER 1
#define WM_SOCKET 4
 
HINSTANCE instance;
 
LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
 
//Socket globale
SOCKET sock;
SOCKET csock;
SOCKADDR_IN csin;
SOCKADDR_IN sin;
 
//Stock la taille de SOCKADDR
typedef int socklen_t;
 
int WINAPI WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage)
{
    //Utilisation socket
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,2), &WSAData);
 
    //Variable
    HWND fenetrePrincipale;
    MSG message;
    WNDCLASS classeFenetre;
 
    //Creation socket
    sock = socket(AF_INET,SOCK_STREAM,0);
 
    WSAAsyncSelect(sock,fenetrePrincipale,WM_SOCKET,FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE);
 
 
    //Parametrage de la socket
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(23);
 
    //Association socket
    bind(sock,(SOCKADDR*)&sin,sizeof(sin));
 
    //Adressage de port
    listen(sock, 5);
 
    //Configuration fenetre
    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName =  NULL;
    classeFenetre.lpszClassName = "classeF";
 
    if(!RegisterClass(&classeFenetre)) return FALSE;
 
    fenetrePrincipale = CreateWindow("classeF", "chat!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, cetteInstance, NULL);
 
    if (!fenetrePrincipale) return FALSE;
 
    ShowWindow(fenetrePrincipale, modeDAffichage);
    UpdateWindow(fenetrePrincipale);
 
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
 
    //Fin socket
    WSACleanup();
}
 
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
    //Variables
    socklen_t recsize = sizeof(sin);
    socklen_t crecsize = sizeof(csin);
    static HWND edit;
    static HWND clic;
    char texte[16];
    HDC affichage;
 
    affichage = GetDC(fenetrePrincipale);
 
    switch (message)
    {
        case WM_CREATE:
            edit = CreateWindow("EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER|ES_AUTOHSCROLL|ES_CENTER, 25,10,340,150,fenetrePrincipale,NULL,instance,NULL);
            clic = CreateWindow("BUTTON", "Envoyer", WS_VISIBLE|WS_CHILD|WS_DISABLED, 160,200,80,30,fenetrePrincipale,(HMENU)ID_ENVOYER,instance,NULL);
            return 0;
 
        case WM_COMMAND:
            if(HIWORD(wParam) == EN_CHANGE)
            {
                if(GetWindowTextLength(edit))
                  EnableWindow(clic, TRUE);
                else
                  EnableWindow(clic, FALSE);
            }
 
            switch(LOWORD(wParam))
            {
                case ID_ENVOYER:
                    GetWindowText(edit, texte, 16);
                    send(csock,texte,16,0);
                    TextOut(affichage,30,200,texte,strlen(texte));
                    break;
            }
            return 0;
        case WM_SOCKET:
            switch(WSAGETSELECTEVENT(lParam))
		    {
		        case FD_ACCEPT:
                    csock = accept(sock, (SOCKADDR*)&csin, &recsize);
                    printf("accepter");
                    break;
 
		    }
        case WM_SETFOCUS:
            SetFocus(edit);
            return 0;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
 
        default:
            return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
    }
}
Et mon client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
 
#define ID_ENVOYER 1
#define WM_SOCKET 4
 
HINSTANCE instance;
 
LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);
 
//Socket globale
SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
 
//Stock la taille de SOCKADDR
typedef int socklen_t;
 
int WINAPI WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage)
{
    //Utilisation socket
    WSADATA WSAData;
    WSAStartup(MAKEWORD(2,2), &WSAData);
 
    //Variable
    char buffer[16];
    HWND fenetrePrincipale;
    MSG message;
    WNDCLASS classeFenetre;
 
    // Création de la socket
    sock = socket(AF_INET, SOCK_STREAM, 0);
 
    WSAAsyncSelect(sock,fenetrePrincipale,WM_SOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
 
    // Configuration de la connexion
    sin.sin_addr.s_addr = inet_addr("127.0.0.1");
    sin.sin_family = AF_INET;
    sin.sin_port = htons(23);
 
    //Configuration fenetre
    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName =  NULL;
    classeFenetre.lpszClassName = "classeF";
 
    if(!RegisterClass(&classeFenetre)) return FALSE;
 
    fenetrePrincipale = CreateWindow("classeF", "chat!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, cetteInstance, NULL);
 
    if (!fenetrePrincipale) return FALSE;
 
    ShowWindow(fenetrePrincipale, modeDAffichage);
    UpdateWindow(fenetrePrincipale);
 
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
 
    //Fin socket
    WSACleanup();
}
 
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
{
    //Variables
    static HWND edit;
    static HWND clic;
    char texte[16],recu[16];
 
    switch (message)
    {
        case WM_CREATE:
            edit = CreateWindow("EDIT", "", WS_VISIBLE|WS_CHILD|WS_BORDER|ES_AUTOHSCROLL|ES_CENTER, 25,10,340,150,fenetrePrincipale,NULL,instance,NULL);
            clic = CreateWindow("BUTTON", "Envoyer", WS_VISIBLE|WS_CHILD|WS_DISABLED, 160,200,80,30,fenetrePrincipale,(HMENU)ID_ENVOYER,instance,NULL);
            return 0;
 
        case WM_COMMAND:
            if(HIWORD(wParam) == EN_CHANGE)
            {
                if(GetWindowTextLength(edit))
                  EnableWindow(clic, TRUE);
                else
                  EnableWindow(clic, FALSE);
            }
 
            switch(LOWORD(wParam))
            {
                case ID_ENVOYER:
                    GetWindowText(edit, texte, 16);
                    send(sock,texte,16,0);
                    break;
 
            }
            return 0;
        case WM_SOCKET:
            switch(WSAGETSELECTEVENT(lParam))
		    {
		        case FD_CONNECT:
		            connect(sock, (SOCKADDR*)&sin, sizeof(sin));
		            break;
 
		        case FD_READ:
                    recv(sock,recu,16,0);
                    break;
		    }
		    return 0;
 
        case WM_SETFOCUS:
            SetFocus(edit);
            return 0;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
 
        default:
            return DefWindowProc(fenetrePrincipale, message, wParam, lParam);
    }
}
Merci d avance!