readv_windows.go 789 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // +build windows
  2. package buf
  3. import (
  4. "fmt"
  5. "syscall"
  6. )
  7. type windowsReader struct {
  8. bufs []syscall.WSABuf
  9. }
  10. func (r *windowsReader) Init(bs []*Buffer) {
  11. if r.bufs == nil {
  12. r.bufs = make([]syscall.WSABuf, 0, len(bs))
  13. }
  14. for _, b := range bs {
  15. r.bufs = append(r.bufs, syscall.WSABuf{Len: uint32(b.Len()), Buf: &b.v[0]})
  16. }
  17. }
  18. func (r *windowsReader) Clear() {
  19. for idx := range r.bufs {
  20. r.bufs[idx].Buf = nil
  21. }
  22. r.bufs = r.bufs[:0]
  23. }
  24. func (r *windowsReader) Read(fd uintptr) int32 {
  25. var nBytes uint32
  26. var flags uint32
  27. err := syscall.WSARecv(syscall.Handle(fd), &r.bufs[0], uint32(len(r.bufs)), &nBytes, &flags, nil, nil)
  28. if err != nil {
  29. fmt.Println("Err=", err)
  30. return -1
  31. }
  32. return int32(nBytes)
  33. }
  34. func newMultiReader() multiReader {
  35. return new(windowsReader)
  36. }