Je souhaite passer l'adresse de la structure "tableau[i]" à chaque thread.
Dans la fonction, mon problème est que je n'arrive pas à récupérer cette structure "tableau[i]" ?
void *fonction (void *p_data)
{
...
struct partie * t = (struct partie *) p_data; // problème ici surement
t.var1 = 3;
...
}
dans la compilation j'ai l'erreur pour la fonction : "request for member var1 in something not a structure or union"
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 29 oct. 2007 à 15:08
Autre remarque pendant que j'y pense, pourquoi ne passes tu pas directement le param de type partie, ca t'evite de faire un cast juste après.
Puis pas besoin de créer une nouvelle valeur en local, tu peux directement de te servir de ton paramètre.
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 29 oct. 2007 à 17:21
Oui il y a surement un moyen, a tio de voir lequel car je ne connais pas ton code.
Je dirais de déclarer un tableau d'entier qui stock la valeur de i pour chaque thread lancé. Ainsi ton thread sera capable de retrouvé la valeur de i qui va bien.... A essayer :)
ulukai44
Messages postés4Date d'inscriptionmercredi 17 octobre 2007StatutMembreDernière intervention 2 novembre 2007 31 oct. 2007 à 16:24
Merci ta réponse marche. En fait j'ai un autre problème dans mon code :
Je programme une application client / serveur en C (en utilisant les threads dans mon fichier serveur.c)
Je lance mon fichier serveur.
Je lance un client ca fonctionne, il me demande si je veux continuer, je taper 1.
Je lance un autre client, et pour ce dernier client ca fonctionne, je taper 1 aussi.
Mais si je reviens à la fenêtre du premier client dans le terminal et que je retape 1 pour continuer encore ba il bloque.
J'ai passé qq heures sur le code; et j'vois pas pouquoi. si vous avez des solutions merci.
En fait le plus récent client lancé marche et les anciens ne marchent plus en même temps.
int ladcour; /*longeur d'adresse courante d'un client*/
struct sockaddr_in adsock, /*structure d'adresse locale*/
adclcour; /*adresse client courant*/
struct hostent *hptr; /*les infos recuperee sur la machine hote*/
struct servent *sptr; /*les infos recuperee sur le service de la machine*/
char machine[MAXDATASIZE]; /*nom de la machine locale*/
char *prog; /*nom du programme*/
prog=argv[0]; /*recuperation du nom du programme*/
gethostname(machine, MAXDATASIZE); /*recuperation du nom de la machine*/
if ((hptr=gethostbyname(machine))==NULL)
{
perror(">> Machine inconnue");
exit(1);
}
bcopy((char *)hptr->h_addr,
(char *)&adsock.sin_addr,
hptr->h_length);
adsock.sin_family=hptr->h_addrtype; /*ou bien AF_INET*/
adsock.sin_addr.s_addr=INADDR_ANY; /*ou bien AF_INET*/
if ((sptr=getservbyname("irc", "tcp"))==NULL)
{
perror(">> Probleme de recuperation des infos sur le service");
exit(1);
}
adsock.sin_port= htons(sptr->s_port);
if ((sd=socket(AF_INET,SOCK_STREAM, 0))<0)
{
perror(">> Probleme de creation du socket");
exit(1);
}
int j = 1;
if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &j, sizeof(j))<0)
{
printf("Can't set SO_REUSEADDR");
exit(1);
}
if ((bind(sd,&adsock, sizeof(adsock)))<0)
{
perror(">> Probleme avec le binding");
exit(1);
}
printf("%d = Num-Port\n", ntohs(adsock.sin_port)); /*juste une trace*/
printf("Creation de la socket et attente d'une connexion...\n");
listen(sd,5);
pthread_t t;
int code;
/*attente des connexions et traitement*/
while (1) {
srand (time (NULL));
ladcour=sizeof(adclcour);
/*adclcour sera renseigne par accept via les infos du connect*/
/* nsd est une socket d'échange que l'on doit fermer dans la boucle while(1){}*/
if ((nsd = accept(sd, &adclcour, &ladcour))<0) {
perror(">> Probleme sur l'accept");
exit(1);
}
/*création des threads*/
code = pthread_create(&t, NULL, fonction, NULL);
if (code < 0) perror("Creation du thread");
int main(argc, argv)
int argc;
char **argv;
{
int sd, /* descripteur de socket */
lenght_buffer; /* longueur d'un buffer utilisé */
struct sockaddr_in adsock; /* structure d'adresse locale */
struct hostent *hptr; /* les infos recuperee sur la machine hote */
struct servent *sptr; /* les infos recuperee sur le service de la machine */
char buf[MAXDATASIZE];
char *prog; /* nom du programme */
char *host; /* nom de la machine distance */
if (argc != 2)
{
perror(">> Il faut deux arguments au programme");
exit(1);
}
host = argv[1];
printf("Code client --> machine = %s \n", host);
if ((hptr gethostbyname(host)) NULL)
{
perror(">> Pb pour la recup des infos du host");
exit(1);
}
bcopy((char *)hptr->h_addr,
(char *)&adsock.sin_addr,
hptr->h_length);
adsock.sin_family= AF_INET;
if ((sptr getservbyname("irc", "tcp")) NULL)
{
perror("Pb pour la recup des infos sur le service");
exit(1);
}
adsock.sin_port = htons(sptr->s_port);