There are a number of channel exits available which allow you to see data as it comes across the channel. These exits serve different purposes, and present different data to you, so it is important to use the correct exit type for the correct purpose.
Send and Receive exits show you the transmissions across the channel. These transmissions include various internal flows that the channel makes as part of its protocol, as well as various flows that contain portions of your message. Your message is broken down into 32KB chucks to be sent across channels. The format of these transmissions is not intended to be decomposed, and is not a public protocol.
To work with the message and/or the MQMD that goes with the message you need an exit that presents you with public formatted data. The choice here depends on whether you wish to use this on a QMgr-QMgr channel or a client-svrconn channel - which you don't mention.
For a QMgr-QMgr channel you should use a Message exit. This exit deals in whole messages prior to them being broken down into 32KB chunks. You have the MQMD as well and everything is in published formats so you can easily find what you need.
For a client-svrconn channel you should use an API exit. This exit deals in the API calls made by the application, since in this case the flow across the channel is a flattened MQPUT call, which includes your message buffer, MQMD and other things from the MQPUT call.
Cheers,
Morag