Bonjour,
J'ai codé un tchat en Tcp avec les socket sous Linux, il marche tres bien (connection , propagation des messages , deconection)
Maintenant je veux faire le portage sous windows , j'ai donc remplacé toutes les variables par les macros windows , et j'ai adapté les tests.
Le seul Probleme c'est au niveau du select() , qui renvoie -1 je ne sais pas pourquoi , ça enraye tout le fonctionnement car du coup un client ne peut ecrire qu'une seule fois apres quoi il passe en reception pour aucune raison.
voici le code serveur:
et le 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 #include <sys/types.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <sys/time.h> #define BUF_LENGTH 256 #define DNS "motamarid.ddns.net" #define PORT 30001 #define UTF8 65001 #define MAX_CLIENT 20 #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") void test(int aTester , char* sujet) { if(aTester) { printf("%s réussi.\n" , sujet); } else { printf("erreur de %s.\n" , sujet); exit(EXIT_FAILURE); } } int main() { SetConsoleOutputCP(UTF8); SetConsoleTitleA("(serveur)"); // WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); //variables SOCKADDR_IN serveur; // Br serveur // traitement pour BR serveur int descbr = socket(PF_INET, SOCK_STREAM,0); test(descbr,"ouverture socket publique"); // serveur.sin_family = AF_INET; serveur.sin_addr.s_addr = INADDR_ANY; serveur.sin_port=htons((short)PORT); //BIND int res = bind(descbr,(SOCKADDR*)&serveur,sizeof(serveur)); test(res!= SOCKET_ERROR,"bind"); // int i=0; SOCKADDR_IN client/*[MAX_CLIENT]*/; // Br client à accepter SOCKET descrCli[MAX_CLIENT] ; for( i = 0; i < MAX_CLIENT; i ++ ) descrCli[i] = INVALID_SOCKET; int taille = sizeof(client); fd_set tab;//tableau de descripteur struct timeval t; t.tv_sec = (long)20; t.tv_usec = (long)0; int ret = 0, ecoute=0, j ,compteur = 0; char buf[BUF_LENGTH]; // while(1) { ecoute = listen(descbr,5); test(ecoute!= SOCKET_ERROR , "listen"); // FD_ZERO(&tab);//initialisation FD_SET(descbr, &tab); for(i = 0 ; i < compteur ; i++) if(descrCli[i] != INVALID_SOCKET) FD_SET(descrCli[i], &tab); printf("En attente d'evenement...\n"); ret = select(FD_SETSIZE, &tab, NULL, NULL, NULL); test(ret != SOCKET_ERROR,"select"); if(FD_ISSET(descbr, &tab)) { //traitement client descrCli[compteur] = accept(descbr,(SOCKADDR*)&client,&taille); test(descrCli[compteur] != INVALID_SOCKET, "accept"); printf("Client n°%d (de descripteur %d) accepté.\n",compteur,descrCli[i]); compteur++; } for(i = 0 ; i < compteur ; i++) if(descrCli[i] != INVALID_SOCKET && FD_ISSET(descrCli[i], &tab)) { int recevoir = recv(descrCli[i],buf,BUF_LENGTH,0); //test(recevoir,"recv"); if(recevoir ==0) // si deconnection { printf("Client n°%d déconnecté.\n",descrCli[i]); closesocket(descrCli[i]); descrCli[i] = INVALID_SOCKET; continue; } printf("Le client n°%d (de descripteur %d) a dit la phrase[%s].\n",i , descrCli[i],buf); for(j = 0 ; j < compteur ; j++) { if(j != i) { int result = send(descrCli[j],buf,BUF_LENGTH,0); test(result!= SOCKET_ERROR,"send propagation"); } } memset(buf,0,BUF_LENGTH); } } WSACleanup(); closesocket(descbr); return 0; }
J'ai vraiment besoin d'aide j'ai passé toute la nuit dessus et la journée d'hier.
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 #include <sys/types.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define BUF_LENGTH 256 #define DNS "motamarid.ddns.net" #define PORT 30001 #define UTF8 65001 #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") void test(int aTester , char* sujet) { if(aTester) { printf("%s réussi.\n" , sujet); } else { printf("erreur de %s.\n" , sujet); Sleep(3000); exit(EXIT_FAILURE); } } void getIp(char* nom , char* adresse) { struct hostent* mahostent = gethostbyname(nom);//roburc.ddns.net test(mahostent != NULL , "gethostbyname"); struct in_addr addr; unsigned char v[4]; int i=0,j=0; printf("Le nom de %s est %s et possede les adresses suivantes\n", nom,mahostent->h_name); while (mahostent->h_addr_list[i] != 0) { for(j=0;j<4;j++) v[j] = (unsigned char)mahostent->h_addr_list[i][j]; sprintf(adresse , "%d.%d.%d.%d", v[0],v[1],v[2],v[3] ); printf("adresse %d : %s\n" , i , adresse); i++; } } int main() { SetConsoleOutputCP(UTF8); SetConsoleTitleA(DNS ); // WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); // SOCKADDR_IN serveur; // Br publique char buf[BUF_LENGTH]; int j=0,i=0; // traitement pour BR serveur int descbrCli = socket(PF_INET, SOCK_STREAM,0); test(descbrCli,"ouverture socket"); // char adresse[256] = ""; getIp( "localhost", adresse);//"motamarid.ddns.net" // serveur.sin_family = AF_INET; serveur.sin_addr.s_addr = inet_addr(adresse); serveur.sin_port=htons((short)PORT); // envoi de demande de connexion au serveur int tailleServeur = sizeof(serveur); printf("Demande de connexion en cours...\n"); int result = connect(descbrCli,(SOCKADDR *)&serveur,tailleServeur); test(result >= 0,"connexion avec le serveur"); // fd_set tab; while(1) { FD_ZERO(&tab); FD_SET(descbrCli, &tab); FD_SET(0, &tab); //write(1,"parlez: ",sizeof("parlez: ")); int ret = select(FD_SETSIZE, &tab, NULL, NULL, NULL); test(ret != SOCKET_ERROR,"select"); if(FD_ISSET(0,&tab)) { printf("Ecriture!\n"); fgets(buf, BUF_LENGTH-1, stdin); buf[strlen(buf)-1]='\0'; int result = send(descbrCli,buf,BUF_LENGTH,0); //test(result,"send"); } if(FD_ISSET(descbrCli, &tab)) { printf("Reception!\n"); int recevoir = recv(descbrCli,buf,sizeof(buf),0); if(!recevoir) { closesocket(descbrCli); printf("déconnexion du serveur.\n"); exit(EXIT_FAILURE); } //test(recevoir,"recv"); printf("quelqu'un a dit: [%s].\n" , buf); } } WSACleanup(); closesocket(descbrCli); return 0; }
Partager