The UNIX and Linux Forums  

Go Back   The UNIX and Linux Forums > Top Forums > High Level Programming
Google UNIX.COM


High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
message queue etenv High Level Programming 2 11-02-2007 02:09 AM
message queue problem ramneek IP Networking 0 09-13-2005 11:14 PM
Message Queue Problem Again.. satansfury High Level Programming 2 07-05-2005 07:52 AM
a message queue question.. yanhu High Level Programming 0 03-30-2004 06:29 PM
Cron message queue problem mattd UNIX for Dummies Questions & Answers 7 12-16-2003 04:24 PM

Reply
 
Submit Tools LinkBack Thread Tools Display Modes
  #1  
Old 05-01-2005
Registered User
 

Join Date: May 2005
Posts: 18
Angry Message Queue Problem

Hi all,

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);
}
What is the problem here?
Thanks.
Reply With Quote
Forum Sponsor
  #2  
Old 05-03-2005
Perderabo's Avatar
Unix Daemon
 

Join Date: Aug 2001
Location: Washington DC Area
Posts: 8,616
Code:
typedef struct my1_msgbuf
{
        int receiver_id;  //server msg queue
	int sender_id;  //client msg queue
        char message[MAXLEN]; //msg to server
}my_msgbuf;
No OS that I have ever seen has a msgbuf that looks like that. Read the man page for msgsnd:
Code:
struct  mymsg {
        long  mtype;     /* message type */
        char  mtext[1];  /* message text */
}
Reply With Quote
  #3  
Old 05-19-2005
mgchato's Avatar
Registered User
 

Join Date: May 2005
Posts: 7
Hey SaTYR, I have to do a program which is very similar to yours, and I was wondering if you got yours going.

Bye!
Reply With Quote
  #4  
Old 06-19-2005
Registered User
 

Join Date: May 2005
Posts: 18
Red face

Hi there, i wrote the code but i forgot to update my message..
Now i'm uploading my code...
While you are compiling, make

client.txt->client.c
server.txt->server.c
local.txt->local.h

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.

Thats it.
Attached Files
File Type: txt client.txt (6.6 KB, 71 views)
File Type: txt server.txt (7.3 KB, 52 views)
File Type: txt local.txt (1.2 KB, 51 views)
Reply With Quote
  #5  
Old 06-19-2005
Registered User
 

Join Date: Oct 2004
Posts: 235
That is fine hope it will help me also
Reply With Quote
  #6  
Old 07-22-2005
Registered User
 

Join Date: Jul 2005
Posts: 3
Question

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?????
Reply With Quote
  #7  
Old 07-31-2005
Registered User
 

Join Date: May 2005
Posts: 18
You can do it with signals.When the problem was appeared, send a signal and let your processes to catch it.
Reply With Quote
Google The UNIX and Linux Forums
Reply

Thread Tools
Display Modes




All times are GMT -7. The time now is 06:32 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited.
The UNIX and Linux Forums Content Copyright ©1993-2008. All Rights Reserved.Ad Management by RedTyger Visit The Complex Event Processing Blog

Content Relevant URLs by vBSEO 3.2.0