Structure sockaddr_in - C - Programmation
Marsh Posté le 25-03-2006 à 17:10:19
> son_s->sin_addr.s_addr
- contient une adresse ip sous forme binaire
utilise une fonction de conversion:
char *inet_ntoa(struct in_addr in);
Marsh Posté le 25-03-2006 à 17:28:10
J'ai esseye avec
printf("Adresse %s\n", inet_ntoa(son_s->sin_addr));
et il imprime
Adresse 0.0.0.0
C'est normal?
Marsh Posté le 25-03-2006 à 17:33:16
tu essaie d'afficher l'adresse de la machine sur laquelle le process s'execute ou celle de la machine avec laquelle tu communique?
Marsh Posté le 25-03-2006 à 17:36:40
J'esseye d'afficher l'adresse de la machine sur laquelle le process s'execute (si c une machine distante ca revient a dire la machine avec laquelle je communique, non?..enfin je ne vois pas vraiment la différence entre les deux)..
Marsh Posté le 25-03-2006 à 17:39:03
il faudrait que tu montre la partie de code qui accèpte la connexion client et récupère son adresse...
D où vient le ``son_s->sin_addr.s_addr``?
Marsh Posté le 25-03-2006 à 17:43:19
nargy a écrit : il faudrait que tu montre la partie de code qui accèpte la connexion client et récupère son adresse... |
Voila le code, pourtant j'ai bien rempli les structures sockaddr_in..
En tout cas merci pour ton aide, je commence à etre fatiguée
Code :
|
Marsh Posté le 25-03-2006 à 18:08:13
1°) INADDR_ANY=0.0.0.0
est utiliser pour indiquer que l on accepte toute adresse ip valide (un ordinateur peut en avoir plusieurs comme par ex. les passerelles internet)
Marsh Posté le 25-03-2006 à 18:12:57
2°) il manque un connect quelquepart
le bind sert suelement à affecter une adresse ip à la socket, mais pour effecture la connection:
connect() -> côté client
listen() -> côté serveur
Marsh Posté le 25-03-2006 à 18:17:51
entre la ligne 55 et 68 ci sessus, il manque:
int socket_client=listen(sd,SOMAXCONN);
Marsh Posté le 25-03-2006 à 18:19:11
Ben c'est une connection UDP donc je n en ai pas besoin, connect et listen c est pour TCP..
Marsh Posté le 25-03-2006 à 18:20:31
3°) ensuite on lit la socket client à l aide de recvfrom
----
errata, pour udp tu n a pas besoin de connect côté client, c est juste sendto(...)
Marsh Posté le 25-03-2006 à 18:21:07
si si tu as besoin quand même de listen pour udp
Marsh Posté le 25-03-2006 à 18:24:18
C est bon ArthurDent a trouvé: c'est *fromlen = sizeof(*son_s);
au lieu de *fromlen = sizeof(son_s);
Il fallait avoir l'oeil! En tout cas merci pour ton aide nargy
Une dernere question:
a l execution des fois j'obtient:
> ./udpser 4679
udpser.c: err bind: Address already in use
errno =29
Exit 1
Tu sais comment liberer le port?
Marsh Posté le 25-03-2006 à 18:26:34
killall udpser : ça tuera les eventuels serveurs qui sont encore en execution, meme si c'est bizarre que cela arrive
Marsh Posté le 25-03-2006 à 18:29:21
c est SO_REUSEADDR à mettre en flag de bind.
man 7 socket:
Citation : |
Marsh Posté le 25-03-2006 à 18:31:07
sans SO_REUSEADDR, les ports utilisés sont invalidés pendant un certain temps (même si aucun processus n écoute sur le port) ce qui peut poser problème pour un serveur.
Marsh Posté le 25-03-2006 à 18:45:37
mais il n y a pas d arguments dans le bind():
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
A moins que tu en utilise un autre, moi c'est le seul pour les socket que j ai trouvé.
Si c est bien dans celui la que tu mets le flag, tu le mets ou?
Marsh Posté le 25-03-2006 à 19:01:50
pardon je suis vraiment à l ouest aujourd hui:
Code :
|
Marsh Posté le 25-03-2006 à 16:36:28
Salut,
J'essaie de programmer un serveur UDP et un client UDP aui echangent des messages. Dans mon serveur je veux reccuperer l'adresse IP du client. Pour cela j imprime sut stdout "sin_addr.s_addr" mais je me retrouve avec une adresse nulle.
printf("Adresse IP client: %s \n", son_s->sin_addr.s_addr);
Quelqu'un peut m'aider?
Merci.
Message édité par dounia2 le 25-03-2006 à 17:01:11