bonjour à tous,
Je suis en train de faire des essai avec les sockets et donc j'ai fait une petite application chat client/serveur qui marche sans problème sur mon réseau.
Là où sa foire c'est quand j'essai de la faire marcher par internet et en plus derrière des routeurs. Bon je sais pas si j'ai été très clair mais voici les schémas:
ça sa marche :
C'est sa qui foire :
voici les codes :
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 #include <stdio.h> #include <winsock2.h> #include "iostream" #include "Sthread.h" using namespace std; //structure dans laquelle sera contenu les info, pour le thread de réception typedef struct params params; struct params { SOCKET sock; char buffer[50]; }; //thread pour la récup des messages void functionthread(void* param) // pas très propre mais c'est juste pour un essai { params* p=(params*)param; char buffer[50]; while(1) { memset(buffer,0,sizeof(buffer)); recv(p->sock,buffer,sizeof(buffer),0); cout<<buffer<<endl; } } int main(int argc, char* argv[]) { cout << "NETWORK serveur"<<endl; system("TITLE NETWORK serveur"); WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); SOCKET server;//Le socket qui servira à écouter sur un port SOCKET sock;//le socket qui servira à communiquer SOCKADDR_IN sinserv; //parametres pour server SOCKADDR_IN sin; //parametres pour sock params p; //structure dans laquel il y aura les paramètres pour le trhead de récup int port; cout << "port :"<< endl; cin >> port; sinserv.sin_family=PF_INET; sinserv.sin_addr.s_addr=INADDR_ANY;//Pas besoin d'ip pour le server sinserv.sin_port=htons(port); server=socket(PF_INET,SOCK_STREAM,0); //SOCK_STREAM pour le TCP bind(server,(SOCKADDR*)&sinserv,sizeof(sinserv)); listen(server,0);//On se met à écouter avec server, 0 pour n'accepter qu'une seule connection char buffer[50];//Pour stocker les messages string buffer2; int sinsize; int err=0;//pour détecter si la connection est toujours valide //creer le trhead pour la récup des infos du client. Sthread Sth((void*)functionthread,&p); while(1) { sinsize=sizeof(sin); if((sock=accept(server,(SOCKADDR*)&sin,&sinsize))!=INVALID_SOCKET) { cout << "connecter à "<< inet_ntoa(sin.sin_addr) <<endl; p.sock=sock; Sth.start(); while(err>-1) { memset(buffer,0,sizeof(buffer)); getline(cin, buffer2); sprintf(buffer,"%s",buffer2.c_str()); buffer[strlen(buffer)]='\0'; err=send(sock,buffer,strlen(buffer),0); } Sth.stop(); } } }
comment faire pour que sa marche ? j'ai chercher sur google mais j'ai rien trouvé. Y doit bien y avoir une solution puis que des logs comme logmein le font
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 #include <stdlib.h> #include <iostream> #include <winsock2.h> #include "Sthread.h" using namespace std; typedef struct params params; struct params { SOCKET sock; char buffer[50]; }; //thread pour la récup des messages void functionthread(void* param) // pas très propre mais c'est juste pour un essai { params* p=(params*)param; char buffer[50]; int err=0; while(1) { memset(buffer,0,sizeof(buffer)); recv(p->sock,buffer,sizeof(buffer),0); cout<<buffer<<endl; } } int main(int argc, char* argv[]) { cout << "NETWORK client" << endl; WSADATA wsa; WSAStartup(MAKEWORD(2,0),&wsa); SOCKET sock; SOCKADDR_IN sin; char ip[15]; int port; printf("Ip : "); cin >> ip; printf("%s","Port : "); cin >> port; params p; //structure dans laquelle il y aura les paramètres pour le trhead de récup sin.sin_family=PF_INET; sin.sin_addr.s_addr=inet_addr(ip); sin.sin_port=htons(port); sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); if(connect(sock,(SOCKADDR*)&sin,sizeof(sin))) { cout << "la connection à echouee" << endl; system("PAUSE"); exit(0); } char host[50];//pour stocker le nom de l'ordi local gethostname(host, sizeof(host));//obtient le nom de l'ordi local cout << host << " connecte a " << ip << endl; char buffer[50]; string buffer2; memset(buffer,0,sizeof(buffer)); int err=0; Sthread Sth((void*)functionthread,&p); p.sock=sock; Sth.start(); while(err>-1)//qn y'a err=-1 c'est que la connection foire { getline(cin, buffer2); sprintf(buffer,"%s",buffer2.c_str()); err=send(sock,buffer,strlen(buffer),0);//on envoie memset(buffer,0,sizeof(buffer));) } cout << "connection terminee" << endl; Sth.stop(); WSACleanup(); system("pause"); return 0; }
merci d'avance.![]()
Partager