Thanks, that makes sense. So the documentation here needs some work since 
that is not at all clear. 

On Sunday, April 7, 2019 at 11:42:52 AM UTC-4, Pelle Johansson wrote:
>
> Hi John,
>
> The oob data used in these system calls are not for communicating with the 
> peer. UDP doesn't support OOB data on the wire, I think the name here is a 
> bit unfortunate, it should rather be called "control" or somesuch. This 
> data is processed/created locally by the kernel and its structure is 
> probably OS specific. On Linux see the ip(7) man page for information about 
> how it can be used (search for control).
>
> Regards,
> -- 
> Per Johansson
>
> On Saturday, April 6, 2019 at 11:24:04 PM UTC+2, John Dreystadt wrote:
>>
>> I wrote some sample code (at the end of this message) to see how UDP 
>> worked in the Go environment. And I wound up with some issues because 
>> things did not seem to work as I expected. I am running go1.11.2 on both a 
>> Windows box and a Ubuntu box.
>>
>> Issue 1, when I call WriteMsgUDP with both a regular buffer and an out of 
>> band buffer, I get back the length as I expected. But I never see any out 
>> of band data on the read side. Is this a known error or am I just missing 
>> something?
>>
>> Issue 2, when I send a UDP message longer than the buffer at the 
>> receiving end I get an error on the Windows side along with a bit set in 
>> flags. The Ubuntu side does not report an error but does set a bit (but a 
>> different one). Even more odd, the Windows side does not return the address 
>> of the sending machine when this error occurs. While having one report an 
>> error while not the other is not unreasonable, losing the address of the 
>> sending machine seems really bad unless it just is not there on Windows.
>>
>> Issue 3, the documentation for the flags return from ReadMsgUDP just says 
>> "the flags set on the message" which is pretty short and does not even 
>> indicate who set the flags. Maybe something like "the flags are set on the 
>> message by the network stack and are operating system dependent".
>>
>> I used two copies of the following program running to see the issues. To 
>> replicate, first run one without any flags and then run the second with 
>> -mode=wr . 
>>
>> package main
>>
>> import (
>> "errors"
>> "flag"
>> "fmt"
>> "net"
>> )
>>
>> var rfserver = flag.String("RFS", "127.0.0.1:6000", "Read First Server 
>> Name:Port Number")
>> var wfserver = flag.String("WFS", "127.0.0.1:6001", "Write First Server 
>> Name:Port Number")
>>
>> type modeValue string
>>
>> func (mode *modeValue) String() string {
>> return string(*mode)
>> }
>>
>> func (mode *modeValue) Set(s string) error {
>> switch s {
>> case "rw":
>> *mode = modeValue(s)
>> return nil
>> case "wr":
>> *mode = modeValue(s)
>> return nil
>> default:
>> return errors.New("Mode must be rw or wr")
>> }
>> }
>>
>> var mode modeValue
>>
>> func main() {
>> mode = modeValue("rw")
>> flag.Var(&mode, "mode", "rw for read then write and wr for the reverse")
>> flag.Parse()
>> fmt.Println("Parameters", *rfserver, *wfserver, mode)
>>
>> rfudpaddr, err := net.ResolveUDPAddr("udp", *rfserver)
>> if err != nil {
>> panic(err)
>> }
>> wfudpaddr, err := net.ResolveUDPAddr("udp", *wfserver)
>> if err != nil {
>> panic(err)
>> }
>> var rudpaddr, wudpaddr *net.UDPAddr
>> if mode == "rw" {
>> rudpaddr, wudpaddr = rfudpaddr, wfudpaddr
>> } else {
>> wudpaddr, rudpaddr = rfudpaddr, wfudpaddr
>> }
>> pc, err := net.ListenUDP("udp", rudpaddr)
>> if err != nil {
>> panic(err)
>> }
>>
>> if mode == "rw" {
>> buffer := make([]byte, 5)
>> oobbuffer := make([]byte, 5)
>> n, oobn, flags, addr, err := pc.ReadMsgUDP(buffer, oobbuffer)
>> fmt.Println("n,oobn,flags,addr,err", n, oobn, flags, addr, err)
>> n, oobn, flags, addr, err = pc.ReadMsgUDP(buffer, oobbuffer)
>> fmt.Println("n,oobn,flags,addr,err", n, oobn, flags, addr, err)
>> n, oobn, flags, addr, err = pc.ReadMsgUDP(buffer, oobbuffer)
>> fmt.Println("n,oobn,flags,addr,err", n, oobn, flags, addr, err)
>> }
>>
>> n, oobn, err := pc.WriteMsgUDP([]byte("1234"), []byte("1"), wudpaddr)
>> fmt.Println("n, oobn, err", n, oobn, err)
>> n, oobn, err = pc.WriteMsgUDP([]byte("12345"), nil, wudpaddr)
>> fmt.Println("n, err", n, oobn, err)
>> n, oobn, err = pc.WriteMsgUDP([]byte("123456"), nil, wudpaddr)
>> fmt.Println("n, err", n, oobn, err)
>>
>> if mode == "wr" {
>> buffer := make([]byte, 5)
>> oobbuffer := make([]byte, 5)
>> n, oobn, flags, addr, err := pc.ReadMsgUDP(buffer, oobbuffer)
>> fmt.Println("n,oobn,flags,addr,err", n, oobn, flags, addr, err)
>> n, oobn, flags, addr, err = pc.ReadMsgUDP(buffer, oobbuffer)
>> fmt.Println("n,oobn,flags,addr,err", n, oobn, flags, addr, err)
>> n, oobn, flags, addr, err = pc.ReadMsgUDP(buffer, oobbuffer)
>> fmt.Println("n,oobn,flags,addr,err", n, oobn, flags, addr, err)
>> }
>>
>> }
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to