Re: Using GNAT.Sockets with Streams and Byte Swapping
- From: Simon Wright <simon@xxxxxxxxxxxx>
- Date: Thu, 26 May 2005 07:00:08 +0100
"markp" <markwork66@xxxxxxxxx> writes:
> I am having a problem using GNAT.socket with streams. I can create a
> stream easily and send data as follows:
>
> Msg_Type'Write(
> My_Stream_Access,
> Msg);
>
> This will work fine of both machines are the same "endian". However, if
> I need to swap bytes on the variable Msg before I send, I get garbled
> data on the other end.
>
> Is there a problem with swapping bytes before the call to 'Write?
Not as far as I know. Though it's a much better idea to swap bytes
_in_ 'Write (and 'Read).
You can write your own 'Read, 'Write attribute subprograms.
Or, you can rebuild the runtime on both sides using an XDR version of
System.Stream_Attributes (s-stratt.adb).
In recent (supported) GNATs and in GCC 3.4, 4.0 this has been supplied
in s-strxdr.adb (so copy s-strxdr.adb to s-stratt.adb and rebuild --
see Makefile.adalib in your .../adalib directory under the GCC
runtime, though Some Assembly Will [probably] Be Required).
If you are on a PowerPC the only difference between doing this and
doing nothing on the PPC (running natively big-endian -- who does
otherwise?) is that natively Wide_Character is 2 bytes, while the XDR
form is 4 bytes.
There is a problem with s-strxdr.adb, it raises the wrong exception
(an internal Data_Error rather than the standed End_Error, ISTR).
What we ended up doing was using the native PPC s-stratt.adb and
writing our own on the x86 side to match what the PPC was doing
(easier to argue the acceptability of a vendor-supplied runtime, and
our delivery platform is the PPC!)
.
- Follow-Ups:
- References:
- Prev by Date: Re: Gnat STORAGE_ERROR
- Next by Date: Re: Using GNAT.Sockets with Streams and Byte Swapping
- Previous by thread: Using GNAT.Sockets with Streams and Byte Swapping
- Next by thread: Re: Using GNAT.Sockets with Streams and Byte Swapping
- Index(es):
Relevant Pages
|