Problème adresse ip et inet_addr

Résolu
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 - 15 déc. 2008 à 18:15
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 - 16 déc. 2008 à 14:04
Bonjour à tous,


une petite question qui reste sans réponse et très mystérieuse pour moi
(ou alors c'est tellement gros que depuis que je me pose la question je
ne vois plus le pb)


voici le contexte:

j'essaie de faire un transfert en UDP unicast entre 2 machines. pour
cela j'ai une fonction sendTo qui prend en argument divers paramètres
(dont l'ip de destination du message)

jusque là rien d'étonnant.


à l'utilisation je vois que les messages sont bien transmis mais pas de la façon souhaitée (cf. code ci dessous), les messages sont envoyés en broadcast et pas à la machine ciblée...

si l'un d'entre vous voit une explication à cela je serai très heureux de la connaitre.

merci d'avance

Spiffou

// Avec char *destIp = 10.0.11.7 à l'entrée de la fonction

char constDestIp[256];

sprintf (constDestIp,"%s",destIp);

sockaddr_in fsock;

memset(&fsock, 0, sizeof(fsock));

fsock.sin_family = AF_INET;           

fsock.sin_port = htons((u_short)destPort);   

fsock.sin_addr.s_addr = inet_addr(constDestIp);

printf(str,"TEST -%s",inet_ntoa(fsock.sin_addr));    // mon ip vaut 255.255.255.255

if (destIp)

{

    fsock.sin_addr.s_addr = inet_addr(destIp);

    printf(str,"TEST -%s",inet_ntoa(fsock.sin_addr));    // mon ip vaut 255.255.255.255

}

fsock.sin_addr.s_addr = inet_addr("10.0.11.7");

printf(str,"TEST -%s",inet_ntoa(fsock.sin_addr));    // mon ip vaut 10.0.11.7

3 réponses

Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
16 déc. 2008 à 14:04
J'ai trouvé la solution:
la chaine que je recevais en entrée était erronée et commençait par un espace:
" 10.0.11.7"
ce qui avait pour effet d'initialiser le sin_addr à INADDR_BROADCAST.

En espérant que cela serve à d'autres.
Merci à ceux qui se sont penchés sur mon pb.

Spiffou
3
f_l_a_s_h_b_a_c_k Messages postés 56 Date d'inscription vendredi 14 avril 2006 Statut Membre Dernière intervention 1 février 2009
15 déc. 2008 à 18:49
un class tres simple pour utiliser sochet
http://files.codes-sources.com/fichier.aspx?id=48531&f=websuck.cpp

<li>class Socket
</li><li>{
</li><li>public:
</li><li> Socket(){};
</li><li> Socket(constchar * ip, constint port)
</li><li> {
</li><li> WSAStartup(0x0101,&wsaDATA);
</li><li> socket_result = socket(PF_INET,SOCK_STREAM,0);
</li><li> server_ip = newchar [strlen(ip)+1];
</li><li> strcpy(server_ip, ip);
</li><li> server_port = port;
</li><li> address.sin_family = AF_INET;
</li><li> address.sin_addr.s_addr = inet_addr(server_ip);
</li><li> address.sin_port = htons(server_port);
</li><li> }
</li><li> ~Socket()
</li><li> {
</li><li>delete[] server_ip;
</li><li> WSACleanup();
</li><li> close(socket_result);
</li><li> }
</li><li>int Connect()
</li><li> {
</li><li>return connect(socket_result,(struct sockaddr *)&address,sizeof(address));
</li><li> }
</li><li>int Send(constchar *buf)
</li><li> {
</li><li>return send(socket_result, buf, strlen(buf), 0);
</li><li> }
</li><li>int Recive(char *buf, constint len)
</li><li> {
</li><li>return recv(socket_result, buf, len, 0);
</li><li> }
</li><li>void Close() { delete[] server_ip; WSACleanup(); close(socket_result);}
</li><li>private:
</li><li>char *server_ip;
</li><li>int server_port;
</li><li> SOCKET socket_result;
</li><li> WSADATA wsaDATA;
</li><li>struct sockaddr_in address;
</li><li>};
</li><li>////////////////////////////////////////////////////////
</li>

<li>void Get_mon_IP(char *ip)
</li><li>{
</li><li>struct hostent *host_entry;
</li><li>char szHostName[128];
</li><li>
</li><li>
</li><li>///////////////////////////test lan
</li><li>Socket resoudre("127.0.0.1", 80);
</li><li>//////////////////////////////
</li><li>
</li><li>gethostname(szHostName, 128);
</li><li>host_entry=gethostbyname(szHostName);
</li><li>
</li><li>
</li><li>// sprintf(ip, "%s", inet_ntoa(*( (struct in_addr *)host_entry->h_name ) ) );
</li><li> sprintf(ip, "%s", inet_ntoa(*( (struct in_addr *)host_entry->h_addr) ) );
</li><li>// sprintf(ip, "%s", inet_ntoa(*( (struct in_addr *)host_entry->h_addr_list ) ) );
</li><li>
</li><li> resoudre.Close();
</li><li>}
</li><li>
</li><li>
</li><li>
</li><li>int URL2IP(char *ip)
</li><li>{
</li><li>struct hostent *host_entry;
</li><li>char szHostName[128];
</li><li>//unsigned int addr;
</li><li>
</li><li>
</li><li>///////////////////////////test lan
</li><li>Socket resoudre("127.0.0.1", 80);
</li><li>//////////////////////////////
</li><li>
</li><li>strcpy(szHostName,ip);
</li><li>
</li><li>host_entry=gethostbyname(szHostName);
</li><li>
</li><li>
</li><li>// sprintf(ip, "%s", inet_ntoa(*( (struct in_addr *)host_entry->h_name ) ) );
</li><li> sprintf(ip, "%s", inet_ntoa(*( (struct in_addr *)host_entry->h_addr) ) );
</li><li>// sprintf(ip, "%s", inet_ntoa(*( (struct in_addr *)host_entry->h_addr_list ) ) );
</li><li>
</li><li>
</li><li>//say(ip);
</li><li> resoudre.Close();
</li><li>
</li><li>return 0;
</li><li>}
</li><li>
</li><li>rien plus simple!!!
</li>
0
Spiffou Messages postés 100 Date d'inscription jeudi 1 avril 2004 Statut Membre Dernière intervention 9 juin 2014 1
15 déc. 2008 à 22:13
merci, mais je cherche à comprendre pourquoi ma classe ne fonctionne pas correctement.

qqun a t il une idée qui expliquerait le comportement bizarre de ma classe?
0
Rejoignez-nous