mirror of https://github.com/v2ray/v2ray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
733 B
39 lines
733 B
package buf |
|
|
|
import ( |
|
"syscall" |
|
) |
|
|
|
type windowsReader struct { |
|
bufs []syscall.WSABuf |
|
} |
|
|
|
func (r *windowsReader) Init(bs []*Buffer) { |
|
if r.bufs == nil { |
|
r.bufs = make([]syscall.WSABuf, 0, len(bs)) |
|
} |
|
for _, b := range bs { |
|
r.bufs = append(r.bufs, syscall.WSABuf{Len: uint32(Size), Buf: &b.v[0]}) |
|
} |
|
} |
|
|
|
func (r *windowsReader) Clear() { |
|
for idx := range r.bufs { |
|
r.bufs[idx].Buf = nil |
|
} |
|
r.bufs = r.bufs[:0] |
|
} |
|
|
|
func (r *windowsReader) Read(fd uintptr) int32 { |
|
var nBytes uint32 |
|
var flags uint32 |
|
err := syscall.WSARecv(syscall.Handle(fd), &r.bufs[0], uint32(len(r.bufs)), &nBytes, &flags, nil, nil) |
|
if err != nil { |
|
return -1 |
|
} |
|
return int32(nBytes) |
|
} |
|
|
|
func newMultiReader() multiReader { |
|
return new(windowsReader) |
|
}
|
|
|