Author |
Message
|
keerthikumar |
Posted: Mon May 15, 2006 10:35 pm Post subject: Put C structure object into queue |
|
|
 Novice
Joined: 23 Nov 2005 Posts: 13
|
hello
I want to put a C structure object into queue.
I have the data stored in a C structure object .
What attributes in MQPUT api should i change so that i can send that structure into the queue
thanks and regards |
|
Back to top |
|
 |
keerthikumar |
Posted: Mon May 15, 2006 11:24 pm Post subject: |
|
|
 Novice
Joined: 23 Nov 2005 Posts: 13
|
I tried to use memcpy() function to copy the contents of the struct to unsigned char array but I am not able to copy entire data
so How can i send the entire information of the struct to the queue |
|
Back to top |
|
 |
Nigelg |
Posted: Mon May 15, 2006 11:26 pm Post subject: |
|
|
Grand Master
Joined: 02 Aug 2004 Posts: 1046
|
In the MQPUT API there are 2 arguments which relate to the data, a char * which is a pointer to the start of the data, and a long which is the length of the data.
Pass your structure to MQPUT by casting a pointer to it to a char *, and set the length to be sizeof your structure. _________________ MQSeries.net helps those who help themselves.. |
|
Back to top |
|
 |
bob_buxton |
Posted: Tue May 16, 2006 12:45 am Post subject: |
|
|
 Master
Joined: 23 Aug 2001 Posts: 266 Location: England
|
Does your structure contain any non character data and could your message be sent to a queue manager on a different platfom or to a Java application?
If the answer is yes you will need to consider format conversion.
You would need to invent a format name to put in the MQMD format field and provide a format conversion exit on your receiving system to convert data to the appropriate encoding and code page. _________________ Bob Buxton
Ex-Websphere MQ Development |
|
Back to top |
|
 |
keerthikumar |
Posted: Tue May 16, 2006 1:17 am Post subject: |
|
|
 Novice
Joined: 23 Nov 2005 Posts: 13
|
yes my structure contains non character data also
struct sAccountDetails
{
char acAccType[10];
double fbalance;
};
struct sPersonalDetails
{
char acCustID[10];
char acCustFirstName[20];
char acCustLastName[20];
char acCustDOB[15];
char acCustAddress[100];
char acCustCity[15];
char acCustPincode[10];
char acCustPhone[12];
};
struct sCustomerDetails
{
struct sPersonalDetails personaldetails;
struct sAccountDetails accountdetails;
}custdetails;
this is my structure.
i tried to do memcpy as
unsigned char buffer[500];
struct sCustomerDetails * temp;
temp=&custdetails;
memcpy(buffer,temp,sizeof(custdetails));
but I could not copy entire structure only custdetails.sPersonalDetails.acCustID was only copied
how should I proceed now |
|
Back to top |
|
 |
keerthikumar |
Posted: Tue May 16, 2006 1:25 am Post subject: |
|
|
 Novice
Joined: 23 Nov 2005 Posts: 13
|
MQMD md = {MQMD_DEFAULT}; /* Message Descriptor */
memcpy(md.Format, /* character string format */
MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH);
This the message format i have chosen
MQPUT(Hcon, /* connection handle */
Hobj, /* object handle */
&md, /* message descriptor */
&pmo, /* default options (datagram) */
messlen, /* message length */
buffer, /* message buffer */
&CompCode, /* completion code */
&Reason); /* reason code */
What should i change so that i can send the structure
thanks and regards |
|
Back to top |
|
 |
mvic |
Posted: Tue May 16, 2006 1:53 am Post subject: |
|
|
 Jedi
Joined: 09 Mar 2004 Posts: 2080
|
keerthikumar wrote: |
What should i change so that i can send the structure |
Don't use MQFMT_STRING; this indicates to MQ that your message contains character data encoded in the CCSID you store in md.CodedCharSetId
Here's a good place to start reading about sending/converting known-user-format messages : http://publib.boulder.ibm.com/infocenter/wmqv6/v6r0/topic/com.ibm.mq.csqzak.doc/convx.htm
(NB. If you are always sending between similar machines, you could plan not to use data conversion at all. This is a detail I didn't see in the problem description).
EDIT: tiny editorial change to paragraph 1
Last edited by mvic on Tue May 16, 2006 8:03 am; edited 1 time in total |
|
Back to top |
|
 |
EddieA |
Posted: Tue May 16, 2006 7:53 am Post subject: |
|
|
 Jedi
Joined: 28 Jun 2001 Posts: 2453 Location: Los Angeles
|
Or, if you do need to convert the data between code pages, you could convert the non-character data to character for the "journey", and then convert back at the other end.
Cheers, _________________ Eddie Atherton
IBM Certified Solution Developer - WebSphere Message Broker V6.1
IBM Certified Solution Developer - WebSphere Message Broker V7.0 |
|
Back to top |
|
 |
jefflowrey |
Posted: Tue May 16, 2006 9:18 am Post subject: |
|
|
Grand Poobah
Joined: 16 Oct 2002 Posts: 19981
|
you could convert the non-character data to character for the "journey", and then convert back at the other end.
Or instead of building a language and endian-specific message, you could do something more platform neutral like represent the data as XML, and write it to the message as a string. _________________ I am *not* the model of the modern major general. |
|
Back to top |
|
 |
RogerLacroix |
Posted: Tue May 16, 2006 10:08 pm Post subject: |
|
|
 Jedi Knight
Joined: 15 May 2001 Posts: 3264 Location: London, ON Canada
|
keerthikumar wrote: |
struct sCustomerDetails
{
struct sPersonalDetails personaldetails;
struct sAccountDetails accountdetails;
}custdetails;
...
unsigned char buffer[500];
struct sCustomerDetails * temp;
temp=&custdetails;
memcpy(buffer,temp,sizeof(custdetails)); |
Hi,
This is a C programming error and has nothing to do with MQ. Any decent debugger would have shown the result of sizeof(custdetails) and you would known what the problem was (hopefully known).
keerthikumar wrote: |
but I could not copy entire structure only custdetails.sPersonalDetails.acCustID was only copied |
Impossible. That field has a length of 10. You are actually ONLY copying 8 bytes.
Dig out your C programming references and look up struct and struct within a struct. This will lead you to the answer.
Regards,
Roger Lacroix
Capitalware Inc. _________________ Capitalware: Transforming tomorrow into today.
Connected to MQ!
Twitter |
|
Back to top |
|
 |
tleichen |
Posted: Wed May 17, 2006 11:13 am Post subject: |
|
|
Yatiri
Joined: 11 Apr 2005 Posts: 663 Location: Center of the USA
|
I suppose now we have to teach the inexperienced how to write code too?  _________________ IBM Certified MQSeries Specialist
IBM Certified MQSeries Developer |
|
Back to top |
|
 |
leehairy |
Posted: Tue Aug 08, 2006 3:32 am Post subject: |
|
|
Novice
Joined: 04 Aug 2006 Posts: 13
|
I dont get the last comment..
RogerLacroix - What would make you think that structs in structs would not be the cumulative size of a structure?
The struct does not contain pointers to other structures. Did you misread?
sizeof(custDetails) is 232 == sizeof(struct sCustomerDetails)
which is correct..
Quote: |
keerthikumar wrote:
but I could not copy entire structure only custdetails.sPersonalDetails.acCustID was only copied |
Do you mean only 10 bytes where copied to char *buffer or only 10 bytes appeared on the queue?
My little test harness based seems to work fine ...
Code: |
// con1.cpp : Defines the entry point for the console application.
//
#include <string.h>
struct sAccountDetails
{
char acAccType[10];
double fbalance;
};
struct sPersonalDetails
{
char acCustID[10];
char acCustFirstName[20];
char acCustLastName[20];
char acCustDOB[15];
char acCustAddress[100];
char acCustCity[15];
char acCustPincode[10];
char acCustPhone[12];
};
struct sCustomerDetails
{
struct sPersonalDetails personaldetails;
struct sAccountDetails accountdetails;
}custdetails;
int _tmain(int argc, _TCHAR* argv[])
{
strcpy(custdetails.accountdetails.acAccType, "10");
custdetails.accountdetails.fbalance = 10.0f;
strcpy(custdetails.personaldetails.acCustAddress, "add1");
strcpy(custdetails.personaldetails.acCustFirstName, "first");
strcpy(custdetails.personaldetails.acCustLastName, "last");
strcpy(custdetails.personaldetails.acCustDOB, "13-15-03");
strcpy(custdetails.personaldetails.acCustID, "10");
strcpy(custdetails.personaldetails.acCustCity, "bighton");
strcpy(custdetails.personaldetails.acCustPincode, "4738");
strcpy(custdetails.personaldetails.acCustPhone, "911");
unsigned char buffer[500];
memcpy(buffer,(char *)(&custdetails),sizeof(custdetails));
int l = (int)sizeof(sCustomerDetails);
int x = (int)sizeof(custdetails);
// unpack ...
struct sCustomerDetails unpack = { 0x00 };
memcpy((char *)&unpack, buffer, sizeof(struct sCustomerDetails));
return 0;
} |
|
|
Back to top |
|
 |
|