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 :
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
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); } }
Merci d avance!
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); } }
Partager