Avatar billede dragnor Juniormester
05. februar 2004 - 12:33 Der er 2 kommentarer og
1 løsning

underlig fejl ved message overførsel

Jeg har det her kode:

void msg_send(int id, int fra, int til) {
    if (id<13){
    printf("Sender besked hvor id=%d, fra=%d, til=%d\n",id,fra,til);
    }
    int msqid;
    int msgflg = IPC_PRIVATE | 0666;
    key_t key;
    message_buf sbuf;
    size_t buf_length;
    key = 1234;
    /*(void) fprintf(stderr, "\nmsgget: Calling msgget(%#lx,\%#o)\n",key, msgflg); */
    /*printf("msgget status: %d\n", msqid = msgget(key, msgflg));*/
   
    if ((msqid = msgget(key, msgflg)) < 0) {
        printf("Fejl i at skabe køen\n");
        perror("msgget");
        exit(1);
    }
    else
    /*(void) fprintf(stderr,"msgget: msgget succeeded: msqid = %d\n", msqid); */

    /*We'll send message type 1 */

    sbuf.til = til;   
    sbuf.mtype = id;
    sbuf.fra = fra;

    buf_length = strlen(sbuf.mtext) + 1 ;
 
    /* Send a message. */
    if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) {
        printf("ERROR");
        exit(1);
    }/* else {
        printf("Besked sendt\n");
    }*/
    printf("Send: tog=%d, fra=%d, til=%d\n",sbuf.mtype,sbuf.fra,sbuf.til);


}

void udfoer_forespoergsel(message_buf besked) {
    /*printf("Forespørgsel fra tog %d fra segment %d til segment %d\n", besked.mtype, besked.fra, besked.til);*/
    if (besked.mtype<13) { /*forespørgsel til forældre-processen*/
        printf("Forespørgsel fra tog %d fra segment %d til segment %d\n", besked.mtype, besked.fra, besked.til);
        if (sek[besked.til]->status==0) {

            msg_send(besked.mtype+12,1,1);/*Sender besked tilbage*/
            sek[besked.fra]->status = 0;
            /*printf("Status for fra (%d): %d\n",besked.fra,sek[besked.fra]->status);*/
            sek[besked.til]->status = 1;
            int i = 1;
            for(i=1;i<7;i++) {
                printf("Segment %d: %d\n",i,sek[i]->status);
            }
        }
    } else {
        printf("Svar modtaget til tog %d\n", besked.mtype-12);
    }
}

void msg_rec(int afsender, int loop) {
    int msqid;
    key_t key;
    message_buf  rbuf;

    /*Get the message queue id for the "name" 1234, which was created by the server. */
    key = 1234;
    if ((msqid = msgget(key, 0666)) < 0) {
        perror("msgget");
        exit(1);
    }
 
      /*Modtag beskeder fra den angivne afsender. Venter på den første besked og læser derefter alle beskeder uden at vente og afslut*/
    do {
        if (msgrcv(msqid, &rbuf, MSGSZ, afsender, 0) < 0) {
            perror("msgrcv");
            printf("Fejl i modtagelse af besked");
            exit(1);
        } else {  }

        printf("Modtag: tog=%d, fra=%d, til=%d\n",rbuf.mtype,rbuf.fra,rbuf.til);
        udfoer_forespoergsel(rbuf);
    } while (loop==1);
   
    while(msgrcv(msqid, &rbuf, MSGSZ, afsender, -1) > -1) {
        udfoer_forespoergsel(rbuf);
    }
   
}

ideen er at "void msg_rec" skal modtage de her værdier som står i denne sætning:
printf("Send: tog=%d, fra=%d, til=%d\n",sbuf.mtype,sbuf.fra,sbuf.til);

med underligt nok kan "void msg_rec" godt modtage sbuf.mtype og sbuf.fra men i sbuf.til bruger den værdien fra sbuf.fra???
Avatar billede dragnor Juniormester
05. februar 2004 - 12:36 #1
det er under "void msg_rec" i sætningen:

printf("Modtag: tog=%d, fra=%d, til=%d\n",rbuf.mtype,rbuf.fra,rbuf.til);

at den udskriver værdierne fra:

printf("Send: tog=%d, fra=%d, til=%d\n",sbuf.mtype,sbuf.fra,sbuf.til);
Avatar billede segmose Nybegynder
06. februar 2004 - 17:12 #2
prøv lige at indsætte

memset(&rbuf, -1, sizeof(rbuf)); // sætter hele rbuf til -1 (0xFF)

lige før din:
if (msgrcv(msqid, &rbuf, MSGSZ, afsender, 0) < 0) {
Avatar billede dragnor Juniormester
08. juni 2004 - 14:47 #3
ingen har kunne svare mig så jeg trækker spørgsmålet tilbage...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester