coldfire De lumière et d'obscurité | Hop
Je cherche à faire ça:
un 1er thread envoie des messages dans une file de messages. Il envoie cette structure:
struct trigctx {
struct libnet_ip_hdr ip ;
char lpfound [1024] ;
time_t when ;
}
Le 2 thread regarde régulièrement dans la file de messages s'il y a un message, et le décortique pour voir s'il correspond à ce dont il a besoin. Il regarde avec IPC_NOWAIT en flag pour pas attendre qu'un message soit là.
Pb: un seg fault.
Code :
- Envoi du message:
- déclaré:
- struct trigctx {
- struct libnet_ip_hdr ip ;
- char lpfound [1024] ;
- time_t when ;
- } ;
- struct trigctx * context ;
- Puis, pour l'envoi du message:
- if (idmq = msgget (MSGQUEUE, 0) == -1)
- perror ("Cannot link to message queue\n" ) ;
- else
- {
- context -> ip = (struct libnet_ip_hdr) *ip ;
- context -> when = time(NULL) ;
- strcpy (context -> lpfound, obuf) ; // obuf est une chaine, évidemment
- msgsnd (idmq, (void *) context, sizeof (context), IPC_NOWAIT) ;
- }
|
Code :
- Lecture du message, dans l'autre thread. Même déclarations.
- if (msgrcv (idmq, (struct trigctx *) context, 1000, 0, IPC_NOWAIT) == -1)
- perror ("Cannot retreive info" ) ;
- }
- else
- {
- if ((ctx->ip_src == context->ip.ip_src.s_addr) && (ctx -> ip_dst == context->ip.ip_dst.s_addr) && ((context -> ip.ip_p == ctx -> p_src) || (context ->ip.ip_p == ctx->p_dst)) && (time(NULL) - context->when < 5))
- {
- strcpy (ctx->user, context->lpfound) ;
- printf ("lpfound: %s\n", context->lpfound) ;
- }
- }
|
ctx est un struct ctx_t *, et cette structure contient entre autre:
u_long ip_src ; // ip source
u_long ip_dst ; // ip dest
u_short p_src ; // port source
u_short p_dst ; // port dest
char user [STRING_NAME_SIZE+1] ; // nom de l'utilisateur
Une idée? Message édité par coldfire le 24-07-2002 à 15:59:15
|