#1 Le 10/08/2008, à 14:51
- Damiens
probleme avec des sockets en LOCAL et la fonction sendto().
Bonjour,
j'ai un premier programme qui envoie des entiers par une socket en local par la fonction sendto dont voici le code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
int main (void)
{
int ret = 0;
struct sockaddr_un addr_loc;
int sock;
const char pth_unix[] = "/tmp/my_sock_1";
int addr_len;
int ret_func;
int pack = 5;
unlink(pth_unix);
memset(&addr_loc,0,sizeof addr_loc);
addr_loc.sun_family = AF_LOCAL;
strncpy(addr_loc.sun_path, pth_unix, sizeof addr_loc.sun_path);
addr_len = SUN_LEN(&addr_loc);
sock = socket(PF_LOCAL, SOCK_DGRAM, 0);
if (sock == -1)
{
puts("ERREUR socket().");
ret = EXIT_FAILURE;
}
else
{
do
{
ret_func = sendto(sock, (int *)&pack, sizeof pack, 0, (struct sockaddr *)&addr_loc, addr_len);
if (ret_func < 0)
{
puts("ERREUR sendto().");
ret = EXIT_FAILURE;
}
}
while(1);
close(sock);
}
return ret;
}
je compile grace a cette commande : gcc send.c -o send
J'ai un deuxieme programme qui doit recevoir des entier par la meme socket en local par la fonction recvfrom dont voici le code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
int main (void)
{
int ret = 0;
struct sockaddr_un addr_loc;
int sock;
const char pth_unix[] = "/tmp/my_sock_1";
int addr_len;
int ret_func;
int pack;
unlink(pth_unix);
memset(&addr_loc,0,sizeof addr_loc);
addr_loc.sun_family = AF_LOCAL;
strncpy(addr_loc.sun_path, pth_unix, sizeof addr_loc.sun_path);
addr_len = SUN_LEN(&addr_loc);
sock = socket(PF_LOCAL, SOCK_DGRAM, 0);
if (sock == -1)
{
puts("ERREUR socket().");
ret = EXIT_FAILURE;
}
else
{
ret_func = bind(sock, (struct sockaddr *)&addr_loc, addr_len);
if (ret_func == -1)
{
puts("ERREUR bind().");
ret = EXIT_FAILURE;
}
else
{
do
{
ret_func = recvfrom(sock, (int *)&pack, sizeof pack, 0, (struct sockaddr *)&addr_loc, &addr_len);
if (ret_func < 0)
{
puts("ERREUR recvfrom.");
ret = EXIT_FAILURE;
}
printf("%d\n", pack);
}
while(1);
}
close(sock);
}
return ret;
}
Je compile le code avec la commande suivante : gcc rec.c -o rec.
Lorsque je lance le serveur, il se met en attente.
Mon probleme arrive lorsque je lance le client. J'ai ceci comme sortie standard :
ERREUR sendto().
ERREUR sendto().
ERREUR sendto().
ERREUR sendto().
ERREUR sendto().
...
Pourriez-vous m'aider svp ?
Damiens.
Hors ligne
#2 Le 10/08/2008, à 15:04
- Link31
Re : probleme avec des sockets en LOCAL et la fonction sendto().
Remplace puts("ERREUR sendto()."); par perror("ERREUR sendto()."); pour savoir d'où vient le problème.
Hors ligne
#3 Le 10/08/2008, à 15:11
- Damiens
Re : probleme avec des sockets en LOCAL et la fonction sendto().
Il me met : ERREUR sendto().: No such file or directory
A part la socket /tmp/my_sock_1 qui ne serait pas cree, je ne vois pas ce que ca pourrait etre.
Le probleme, c'est que meme quand je cree manuellement un fichier /tmp/my_sock_1, cette erreur revient.
Hors ligne
#4 Le 10/08/2008, à 15:53
- robrob
Re : probleme avec des sockets en LOCAL et la fonction sendto().
Tu ne fais pas de bind sur ton premier programme, c'est normal?
Hors ligne
#5 Le 10/08/2008, à 16:06
- Damiens
Re : probleme avec des sockets en LOCAL et la fonction sendto().
Oui, il me semble que le client ne fait pas d'appel a bind. Que l'on me corrige si j'ai tort mais avec SOCK_DGRAM le client fait les appels suivant :
socket
sendto
Pour le serveur c'est :
socket
bind
recvfrom
Avec SOCK_STREAM ce serait pour le client :
socket
connect
write
Et pour le serveur :
socket
bind
listen
accept
read
Voila. Je pense avoir raison mais si c'est faux, n'hesitez pas a me le dire
Hors ligne
#6 Le 10/08/2008, à 16:35
- robrob
Re : probleme avec des sockets en LOCAL et la fonction sendto().
Ah en effet, tu m'apprends quelque chose
Sinon en regardant sur cette page:
http://www.ecst.csuchico.edu/~beej/guide/ipc/usock.html
- Ils utilisent AF_UNIX plutôt AF_LOCAL
- Ils ont un autre mode de calcul pour la taille de l'adresse (taille du path + taille de la structure)
Hors ligne
#7 Le 10/08/2008, à 17:37
- Damiens
Re : probleme avec des sockets en LOCAL et la fonction sendto().
ca ne change rien ...
Hors ligne
#8 Le 11/08/2008, à 16:33
- robrob
Re : probleme avec des sockets en LOCAL et la fonction sendto().
Bon alors en fait c'est tout bête mais ça vient du unlink(pth_unix); dans le programme qui envoie.
Sinon quelques rapides suggestions:
- ajouter un #include <unistd.h> pour éviter le warning sur close et unlink
- addr_len doit être du type size_t
Hors ligne