2017-03-01 6 views
0

Ich habe Probleme mit meinem Code.Mein Client sendet nicht korrekt an den Server

Ich habe diesen Client mit Posix-Warteschlange. Ist eine POSIX-Queue-Kommunikation mit einem Conc-Server. Die Frage ist nicht beantwortet.

mqd_t server; 
mqd_t client; 
struct request req; //char *name, int pos, int op... 
struct reply rep; //int num, int ret... 
struct mq_attr attr; 

attr.mq_maxmsg = 1; 
attr.mq_msgsize = sizeof(struct reply); 
client = mq_open("/CLIENT", O_CREAT|O_RDONLY, 0700, &attr); 
server = mq_open("/SERVER", O_WRONLY); 


req.name = name; 
req.op = 3; 

mq_send (server, (const char *) &req, sizeof(struct req),0); 
mq_receive(client, (char*)&rep, sizeof(struct reply), 0); 

mq_close(server); 
mq_close(client); 
mq_unlink("/CLIENT"); 

Und dieser Server

struct db mydb[100]; //Struct with char*name.... 
    for (int i = 0; i<100;i++){ 
    strcpy(mydb[i].name,""); 
    mydb[i].vec =NULL; 
    mydb[i].size =0; 
} 

mqd_t server; 

struct request mess; 
struct mq_attr q_attr; 
pthread_attr_t t_attr; 

q_attr.mq_maxmsg = 10; 
q_attr.mq_msgsize=sizeof(struct request); 
server = mq_open ("/SERVER", O_CREAT|O_RDONLY, 0700, &q_attr); 
    if (server == -1){ 
    perror("Er"); 
} 

pthread_mutex_init (&mutex_msj, NULL); 
pthread_cond_init (&cond_msj, NULL); 
pthread_attr_init(&t_attr); 

pthread_attr_setdetachstate(&t_attr, PTHREAD_CREATE_DETACHED); 

while(1){ 
    pthread_t thid; 

mq_receive(server, (char*) &mess, sizeof(struct request), 0); 

UND IST HIER DAS PROBLEM. WENN ICH PRINF MESS.OP HABE, WÜRDE ICH "3" ERHALTEN. Die Nummer, die ich dem Kunden zugewiesen habe. Und wenn ich das tue, habe mess.op 0, nicht 3.

pthread_create(&thid, &t_attr, (void*)func, &mess); 
... 
... 
... 
... 

} 

Danke.

+0

Ihr Code ist zu chaotisch, können Sie ihn formatieren, damit er lesbar ist? –

+0

Bitte lesen Sie die Tour, und tun Sie dies nicht. –

Antwort

1

Es scheint, dass Sie pthread_create() mit einer lokalen (or automatic) Variablen mess aufrufen, die manchmal freigegeben wird, bevor der Thread tatsächlich gestartet wird. Sie müssen mess auf dem Heap reservieren und sehr vorsichtig sein, um es zur richtigen Zeit freizugeben.

Auch (void *) func sieht nicht richtig, weil,

ist und es scheint, als ob Sie Kompilierung Warnungen wurden ignoriert, oder zwingen sie durch Zufall verschwinden Gießen ein Zeiger auf den Typ, den der Compiler vorgeschlagen hat.

+0

Ja, aber der Fehler erscheint in der vorherigen Befehlszeile. Wenn ich Unordnung mit mq_receive erhalte. Mess.op wäre 3 nicht 0, und alle Daten, die in Chaos empfangen werden, sind 0. Ich weiß nicht warum. – Fils

Verwandte Themen