I need help about message queues, i have a server-client program that communicates each other via msg queue, firstly server opens its msg queue and waits for msg then client opens server msg queue and its own msg queue(for receiving msg from server,clients sends msg to server msg queue,but receives their reply from their private msg queue).
I have problem at sending generated structure to the server ...
I am also sending my source code for help..
Code:
//Here is my client source
#define MAXLEN 32
#define MSGKEY 5L
typedef struct my1_msgbuf
{
int receiver_id; //server msg queue
int sender_id; //client msg queue
char message[MAXLEN]; //msg to server
}my_msgbuf;
void main (int argc, char *argv[])
{
my_msgbuf buffer;
int msgID;
int myId;
if (argc<2)
{
printf("Give message as parameter!");
exit(-1);
}
//create and get a message queue
if ((msgID=msgget(MSGKEY,0666|IPC_CREAT))<0)
{
perror("Error getting msg queue.");
exit(-1);
}
if((myId=msgget(112233,0666|IPC_CREAT))<0){//create client msgq-im just testing with 112233
perror("Error getting client msg queue!\n");
exit(-2);
}
//copy the message into the buffer (prepare)
strcpy(buffer.message,argv[1]);
buffer.receiver_id=msgID; //server msgq id
buffer.sender_id=myId;//client msg q id - server need to know client id
//send the message to the OS-managed buffer
if (msgsnd(msgID,&buffer,sizeof(buffer.message),0)<0)//here i have an invalid argument exception!!!
{
perror("Error writing to message queue.");
exit(-1);
}
printf("Message has been send.\n\n");
//wait msg from server
if(msgrcv(myId,&buffer,sizeof(buffer),0L,0)<0){//waiting server to reply me..
printf("Unable to receive client msg\n.");
exit(1);
}
exit(0);
}
//Here is the server side
define MAXLEN 256
#define MSGKEY 5L
typedef struct my1_msgbuf
{
int receiver_id;
int sender_id;
char message[MAXLEN];
}my_msgbuf;
void main ()
{
my_msgbuf buffer;
int msgID;
int temp;
//create and get a message queue
if ((msgID=msgget(MSGKEY,0666|IPC_CREAT))<0)
{
perror("Error getting msg queue.");
exit(-1);
}
//RECEIVE MESSAGE FROM OPERATING SYSTEMS QUEUE
if (msgrcv(msgID,&buffer,
sizeof(buffer.message),0L,0)<0)
{
perror("Error receiving message from Queue.");
exit(-1);
}
printf("\nMessage read from queue:\n\n");
printf("MESSAGE: %s\n",buffer.message);
printf("Sender id: %d\n",buffer.sender_id);
printf("Receiver id: %d\n",buffer.receiver_id);
temp = buffer.receiver_id;
buffer.receiver_id = buffer.sender_id;
buffer.sender_id = temp;
//Send same msg to the client that send..
while(msgsnd(buffer.receiver_id,&buffer,sizeof(buffer),0)>0);
//DELETE QUEUE
if (msgctl(msgID,IPC_RMID,0)<0)
{
perror("Error deleting message queue.");
exit(-1);
}
exit(0);
}
probably you need to compile server.c like
gcc -o server server.c -lpthread
for including thread objects.
This is the default structural approach of message queues Perderabo
Code:
struct mymsg {
long mtype; /* message type */
char mtext[1]; /* message text */
}
but the main idea is the first long type describes the type of the message and the char pointer shows the starting address of other things in the structure...
if you send a custom structure and receive it with the same structure, you got the message. (Mainly the flexibility of the message queue comes here, you can send and receive your custom structure.)
Code:
typedef struct message{
long mtype;
int receiver_id;
int sender_id;
char type;
int length;
char data[MAXDATA];
}msg_tb;
Here, under the 'long mtype' understood with a char pointer by the message queue, because at the message queue process it only need the starting address of the message (size of the message gave at the msgsnd command) so that you can send whatever structure you want with the message queue.
hi me to have a problem with msg queues.
let it be 3 processes a,b,and c.'a' is sending msg to 'c' and 'c' is sending it back to 'b'.i had used 2 msg queues here.one for 'a' and 'c' and the other for 'c' and 'b'.When something happens to 'c',how does process 'a' and 'b' knows that 'c' got some problem?????
Hello !!!!! I have a simple question but i can't find the answer anywhere hope to meet it here.
Why it is a bad idea to pass pointers through message queues ?
Most structs i see all of their char types are arrays... Is it becase having pointers means we could possibily send wrong bytes ?
For... (2 Replies)
Hii can anyone pls tell how to limit the max no of message in a posix message queue. I have made changes in proc/sys/fs/mqueue/msg_max
But still whenever i try to read the value of max. message in the queue using attr.mq_curmsgs (where struct mq_attr attr) its giving the default value as 10.... (0 Replies)
Hi!!
This code works if I don't remove the message queue.
In A.c I create 3 processes that send a message in a message queue.
in B.c other 3 processes receive 1 message for each (the messages sent from A), change the value of "dato" and put again the message in the queue.
The processes in A.c... (0 Replies)
Hello,
i need to write a message queue "chat server", that should work only localy.
Can anyone please help me with some ideas and peshaps code. I'm studying the UNIX IPC mechanisms right now. So far, i understand how it works but i still cannot get an idea how to write a chat programm...
... (2 Replies)
hi all...
ive been trying this program where i spawn 4 threads... and i am trying to use message queue to send msgs from 3 of the threads to the parent thread... but it doent seem to be working... ive almost pulled out my hair tryin to fix the prob :confused:
another wierd thing... (1 Reply)
I am sending and retriving the message to the queue
the problem is
after retrieving the message can i see what is there in my message queue.
(actually in my application i am encountring some garbage value)
so i want to retieve this garbage value and also want to know its size
how... (0 Replies)
Hi there:
Thanks first. When I use a message queue amony severl processes, will I have to synchronize the queue? I don't think I would have to because a message queue is implemented in a link listed. Correct me If I am wrong... (0 Replies)
I have a problem with running jobs out of cron on Solaris 8.
Initially when one of the users on the box (other than root) attempted to save the crontab after modification by using "crontab -e", the message "Crontab: cannot open the crontab file in the crontab directory" was given.
I then... (7 Replies)
Hi,
I am working closly with unix message queues i have encountered the following -
after creating the Q and start working with it (pushing & pulling) i receive the following stange parameters on the q's -
STIME=no_entry
Qnum=0
CBYTES=4140
when this happens, the Q is disabled (meaning i... (3 Replies)