From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,8bbf2dbc48e08e2f X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news2.google.com!news2.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Alex R. Mosteo" Newsgroups: comp.lang.ada Subject: Re: Question about Streams and UDP sockets using GNAT.Sockets Date: Tue, 18 Jul 2006 12:25:16 +0200 Message-ID: <4i3r3nF215adU1@individual.net> References: <1153215666.455584.201990@m73g2000cwd.googlegroups.com> <1fpj192j49rf4$.ma23qkoukku3.dlg@40tude.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7Bit X-Trace: individual.net mxB5dTv4DOOZRnVFctVGzAflh0MLZphK+TUQHV6cD4sv16su0= User-Agent: KNode/0.10.2 Xref: g2news2.google.com comp.lang.ada:5757 Date: 2006-07-18T12:25:16+02:00 List-Id: Dmitry A. Kazakov wrote: > On 18 Jul 2006 02:41:06 -0700, lekktu@gmail.com wrote: > >> I'm using GNAT GPL 2006 (20060522-34) on Windows XP. >> >> I'm trying to broadcast an UDP packet, with the following test code: >> >> ---------------------------------------------------------------------- >> with GNAT.Sockets; use GNAT.Sockets; >> procedure Test is >> Local_Port : constant Port_Type := 20769; >> Remote_Port : constant Port_Type := 20770; >> Address : Sock_Addr_Type; >> Socket : Socket_Type; >> Channel : Stream_Access; >> Local_Host : String := "127.0.0.1"; >> begin >> Initialize; >> Create_Socket (Socket, Family_Inet, Socket_Datagram); >> Set_Socket_Option (Socket, Socket_Level, (Broadcast, True)); >> Address.Addr := Inet_Addr (Local_Host); >> Address.Port := Local_Port; >> Bind_Socket (Socket, Address); >> Address.Addr := Broadcast_Inet_Addr; >> Address.Port := Remote_Port; >> Channel := Stream (Socket, Address); >> String'Write (Channel, "TEST"); -- sends "T", "E", "S", "T". >> Free (Channel); >> Close_Socket (Socket); >> Finalize; >> end Test; >> ---------------------------------------------------------------------- >> >> The trouble I'm having is not about sockets, but the streams vs. >> sockets interaction. The above code does not send one UDP packet, but >> four, one for each byte of the test message. What I'm doing wrong? > > Don't use String'Write. GNAT implementation treats strings as array so > characters don't coalesce. It is unexpected, but legal. You might wish to > define your own type of the packet and implement a suitable write (and > read) for it. I've workarounded this in past versions of GNAT using a direct call to the Write procedure in Ada.Streams, though you must use a Stream_Element_Array instead of a String. Doing so your array is transferred in a single call and packet. (Contrarily to using the 'Write attribute of Stream_Element_Array, that will also make a call for every element, which is very CPU expensive for large arrays).