2017-03-01 107 views
0

我的代碼有問題。我的客戶端沒有正確發送到服務器

我有這個客戶與posix隊列。是一個posix隊列與濃縮服務器通信。 問題是關閉的。

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"); 

而這個服務器

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); 

這裏就是問題所在。當我PRINF MESS.OP我會記錄「3」。我簽下客戶的號碼。當我這樣做,mess.op有0,而不是3.

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

} 

謝謝。

+0

你的代碼太亂了,你能格式化它,所以它的可讀性? –

+0

請閱讀旅程,不要這樣做。 –

回答

1

看起來你打電話pthread_create()與本地(or automatic)變量mess有時在實際啓動線程之前解除分配。您需要在堆上分配mess,並且要非常小心地在適當的時候釋放它。

而且(void *) func看起來不正確的,因爲,

並且如果你忽視編譯警告,或迫使他們這樣看來通過隨機鑄造消失一個指向編譯器建議類型的指針。

+0

是的,但故障出現在前一個命令行中。當我收到與mq_receive混亂。 Mess.op會是3而不是0,所有收到的數據都是0。我不知道爲什麼。 – Fils

相關問題