Bonjour à tous,
je voudrais savoir si il est possible de récupérer toutes les informations d'un client à partir de son socket (IP,PORT, ...):
Merci à ceux qui se pencheront sur mon cas![]()
Bonjour à tous,
je voudrais savoir si il est possible de récupérer toutes les informations d'un client à partir de son socket (IP,PORT, ...):
Merci à ceux qui se pencheront sur mon cas![]()
a partir du moment ou le client est connecter tu peu recuperer toute les infos de sa SOCK_ADDR (ip, port ) et avec l ip son hostname (et pas mal d autre info)
oui, d'accord mais voila à quoi ressemble la structure
il faut utiliser quelle fonction pour récuperer les paramètres ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 struct sockaddr { u_short sa_family; char sa_data[14]; };
Merci à ceux qui continueront à se pencher sur mon cas ....![]()
tu dois caster ta structure en SOCKADDR_IN :
la structure in_addr contient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; };
4 unsigned char (s_b1, s_b2, sb3 et sb4)
OU
2 unsigned short (s_w1 et s_w2)
OU
1 unsigned long (S_addr)
pour mettre une ip dans ta struct in_addr tu peu aussi utiliser cette fonction:
struct sockaddr_in sock;
sock.sin_addr.s_addr=inet_addr("147.94.38.17");
et pour l afficher:
std::cout << inet_ntoa(sock.sin_addr);
puis y a aussi les fonction pour les ports:
short htons(short int arg) /* Host TO Network Short*/
long htonl(long int arg) /* Host TO Network Long*/
short ntohs(short int arg) /* Network TO Host Short*/
long ntohl(long int arg) /* Network TO Host Long*/
et pour caster t a strcuture c est:
si j me rappel bien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 sockaddr s; sockaddr_in s_in; s_in = (sockaddr_in) s;
puis si tu veux faire une conersion plus c++ utilise reinterpret_cast<sockaddr_in>(...) ou autre
Merci Fry d'essayer de résoudre mon problème, c super sympa![]()
Mais ca marche toujours pas![]()
Voici le code de départ :
Mais donc je n'arrive pas à récupérer les infos à partir de la structure sockaddr.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SOCKET buffer_socket; sockaddr buffer_sockaddr; buffer_socket = accept(Server_socket,&buffer_sockaddr,0);
Donc j'ai essayé comme tu m'as dit de faire, essayer de caster :
De cette manière je caste directement les informations. Mais voila ce que je récupère dans la structure
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SOCKET buffer_socket; sockaddr_in buffer_sockaddr; buffer_socket = accept(Server_socket,(sockaddr*)&buffer_sockaddr,0);
- sin_family = -13108;
sin_port = 52428;
sin_addr.S_addr = 3435973836 (converti en IP => 204.204.204.204)
sin_zero = "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌH"
D'après mon instinct naturel , ca me parrait pas tres correct![]()
J'ai aussi essayer de caster par apres :
Comme tu m'as dit de faire => ca marche pas (impossible de convertir directement)
Par le biais d'un memcpy pour copier la structure sockaddr en sockaddr_in.
Mais rien à faire , je récupère pas les bons paramètres![]()
: N'y a-t-il pas moyen de les récupérer à l'aide du socket Client (qui lui est correct)
Merci à ceux qui continueront à se pencher sur mon cas ....![]()
dans accept(Server_socket,&buffer_sockaddr,0);, au lieu de 0 il faut mettre sizeof(sockaddr_in) sinon ça ne marchera pas (cf. msdn).
PS: je devine au 204.204.204.204 que tu utilises visual c++ ou visual studio!!
Oui bleyblue , j'utilise bien Visual Studio , je l'utilise tellement bien qu'en regardant l'aide MSDN fournie avec je constate que
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen );
- addrlen
[out] Optional pointer to an integer that contains the length of addr.
Et donc en aucun cas cela ne permet de faire avancer le schmilblik.
Mais j'ai quand meme essayer toutes les possibilités avec ce paramètre, de mettre un sizeof(), ou de faire une référence vers un INT, ... rien à faire , ce la ne fonctionne toujours pas ... (Ca empire les choses plutôt)
Mais merci quand même à toi Bleyblue d'essayer de résoudre mon cas (à 3H20 du mat. on ne pond pas forcément QUE des choses censéesje connais ca aussi
)
Merci à ceux qui continueront à se pencher sur mon cas ...![]()
PS: J'ai relu un cours sur les sockets, et il est bien précisé qu'on peut récupérer les informations (IP,PORT) à partir du Accept() mais il n'explique pas comment![]()
dans la doc VC++
donc si on fait quelque chose commeThe integer referred to by addrlen initially contains the amount of space pointed to by addr. On return it will contain the actual length in bytes of the address returned.
pinfo doit permettre de retrouver pas mal de choses
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SOCKET buffer_socket; sockaddr buffer_sockaddr; int lgdonneesinout ; lgdonneesinout = sizeof(sockaddr) buffer_socket = accept(Server_socket,&buffer_sockaddr,&lgdonneesinout ); sockaddr_in *pinfo = (sockaddr_in *) &buffer_sockaddr ;
Ouiiiiiii , ca fonctionne !!!!![]()
![]()
![]()
![]()
![]()
Merci à tous pour votre aide !!!
Voici le code Final qui fonctionne:
(ne pas oublier de libérer la mémoire de IP apres
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 SOCKET buffer_socket; sockaddr buffer_sockaddr; int lgdonneesinout; lgdonneesinout = sizeof(sockaddr); buffer_socket = accept(Server_socket,&buffer_sockaddr,&lgdonneesinout); sockaddr_in *pinfo = (sockaddr_in *) &buffer_sockaddr ; char *ip = new char[16]; ip = inet_ntoa(pinfo->sin_addr);)
En tout cas encore un grand merci à tous ceux qui se sont penché sur mon cas ...![]()
La gestion de la mémoire pour ip est fausse et fuis, même si tu delete.Envoyé par voltx4
Tu es en C++ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::string ip = inet_ntoa(pinfo->sin_addr);
Partager