Pb avec les sockets: fonction bind

Pb avec les sockets: fonction bind - C - Programmation

Marsh Posté le 14-07-2005 à 12:15:27    

Bonjour,
Je développe une application en C standard sur une architecture C/S; J'essaie d'utiliser les sockets pour communiquer avec le servuer (qui est déjà implémenté, j'essaie mtn d'implémentr le client, le serveur tourne pour l'instant sur la même machine ).
D après la doc, la focntion bind doit retourner 0, sinon il y a erreur. Dans mon cas à chaque fois le bind me retourne -1 et quand j essaie d envoyer un message UDP au serveur ça ne marche pas.
Voici un bout de code
 
SOCKET l_i_sd;
struct sockaddr_in  l_s_socketAddress;  
l_i_sd =(SOCKET)socket(AF_INET, SOCK_DGRAM, 0);
 
l_s_socketAddress.sin_family = AF_INET;
l_s_socketAddress.sin_port = htons((unsigned short)port);  //numéro de port:le même que  
                                                           //celui du serveur
l_s_socketAddress.sin_addr.s_addr =inet_addr("10.0.0.1" );
 
 
int k = bind(l_i_sd,(struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in));
 
//envoi du message UDP
if(sendto(l_i_sd, "test send UDP", 13, 0, (struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in))<0)
{
 printf"Send UDP KO" );
}
else
{
 printf(" Send UDP OK" );
}

Reply

Marsh Posté le 14-07-2005 à 12:15:27   

Reply

Marsh Posté le 14-07-2005 à 12:39:08    

zied3 a écrit :

Bonjour
int k = bind(l_i_sd,(struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in));
 
//envoi du message UDP
if(sendto(l_i_sd, "test send UDP", 13, 0, (struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in))<0)
...
}


tu testes le retour dans une variable mais tu t'en sers pas. regardes les conditions d'erreurs genre  

Code :
  1. if( bind(l_i_sd,(struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in)) < 0) {
  2.   perror("bind" );
  3.   ...
  4. }


là tu auras ton erreur
 
et pour du udp il me semble que tu n'as pas besoin de bind()...

Reply

Marsh Posté le 14-07-2005 à 13:12:55    

Non en fait j ai enlevé le bout de code ou je testais sur la valeur (pour faciliet la lisibilité).
T'es sur que pour UDP t'as pas besoin de bind?
je viens de regarder un exemple de C/S sous VC++, le bind retourne -1 mais même avec ça il envoie le message.
Moi j'utilise un compilateur ARM (pour l'embarqué) je ne sais pas si tu connais, mais en tout cas ça donne pas le même resultat

Reply

Marsh Posté le 14-07-2005 à 13:53:36    

(sous linux) coté client le noyau affecte une adresse correcte lorsqu'on rentre en communication avec un autre processus

Reply

Marsh Posté le 14-07-2005 à 20:13:47    

zied3 a écrit :

Bonjour,
Je développe une application en C standard sur une architecture C/S; J'essaie d'utiliser les sockets pour communiquer avec le servuer (qui est déjà implémenté, j'essaie mtn d'implémentr le client, le serveur tourne pour l'instant sur la même machine ).
D après la doc, la focntion bind doit retourner 0, sinon il y a erreur. Dans mon cas à chaque fois le bind me retourne -1 et quand j essaie d envoyer un message UDP au serveur ça ne marche pas.
Voici un bout de code
 
SOCKET l_i_sd;
struct sockaddr_in  l_s_socketAddress;  
l_i_sd =(SOCKET)socket(AF_INET, SOCK_DGRAM, 0);
 
l_s_socketAddress.sin_family = AF_INET;
l_s_socketAddress.sin_port = htons((unsigned short)port);  //numéro de port:le même que  
                                                           //celui du serveur
l_s_socketAddress.sin_addr.s_addr =inet_addr("10.0.0.1" );
 
 
int k = bind(l_i_sd,(struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in));
 
//envoi du message UDP
if(sendto(l_i_sd, "test send UDP", 13, 0, (struct sockaddr_in *)&l_s_socketAddress, sizeof(struct sockaddr_in))<0)
{
 printf"Send UDP KO" );
}
else
{
 printf(" Send UDP OK" );
}


 
Que ce soit en TCP ou en UDP La fonction "bind" n'est pas à appeler pour le client (mais il la faut sur le serveur)
Tu trouveras un cours complet de programmation socket à l'adresse suivante: http://fr.lang.free.fr/cours/SocketCsyst_v1.0.pdf
 
Petit détail: Quand tu envoies "test send UDP", n'oublie pas d'envoyer le '\0' final pour que ton serveur qui lit la socket récupère ce caractère et puisse gérer ce qu'il reçoit comme "chaine de caractères" => remplace le "13" par "14" dans "sendto"


Message édité par Sve@r le 15-07-2005 à 14:58:42

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-07-2005 à 10:38:21    

puis tu peux pas "binder" 2 sockets sur le meme port me semble

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed