(port uint16)
| 293 | } |
| 294 | |
| 295 | func (bind *WinRingBind) Open(port uint16) (recvFns []ReceiveFunc, selectedPort uint16, err error) { |
| 296 | bind.mu.Lock() |
| 297 | defer bind.mu.Unlock() |
| 298 | defer func() { |
| 299 | if err != nil { |
| 300 | bind.closeAndZero() |
| 301 | } |
| 302 | }() |
| 303 | if bind.isOpen.Load() != 0 { |
| 304 | return nil, 0, ErrBindAlreadyOpen |
| 305 | } |
| 306 | var sa windows.Sockaddr |
| 307 | sa, err = bind.v4.Open(windows.AF_INET, &windows.SockaddrInet4{Port: int(port)}) |
| 308 | if err != nil { |
| 309 | return nil, 0, err |
| 310 | } |
| 311 | sa, err = bind.v6.Open(windows.AF_INET6, &windows.SockaddrInet6{Port: sa.(*windows.SockaddrInet4).Port}) |
| 312 | if err != nil { |
| 313 | return nil, 0, err |
| 314 | } |
| 315 | selectedPort = uint16(sa.(*windows.SockaddrInet6).Port) |
| 316 | for i := 0; i < packetsPerRing; i++ { |
| 317 | err = bind.v4.InsertReceiveRequest() |
| 318 | if err != nil { |
| 319 | return nil, 0, err |
| 320 | } |
| 321 | err = bind.v6.InsertReceiveRequest() |
| 322 | if err != nil { |
| 323 | return nil, 0, err |
| 324 | } |
| 325 | } |
| 326 | bind.isOpen.Store(1) |
| 327 | return []ReceiveFunc{bind.receiveIPv4, bind.receiveIPv6}, selectedPort, err |
| 328 | } |
| 329 | |
| 330 | func (bind *WinRingBind) Close() error { |
| 331 | bind.mu.RLock() |
nothing calls this directly
no test coverage detected