mirror of
https://github.com/openp2p-cn/openp2p.git
synced 2025-10-06 00:57:23 +08:00
66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
package openp2p
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
)
|
|
|
|
type underlay interface {
|
|
Read([]byte) (int, error)
|
|
Write([]byte) (int, error)
|
|
ReadBuffer() (*openP2PHeader, []byte, error)
|
|
WriteBytes(uint16, uint16, []byte) error
|
|
WriteBuffer([]byte) error
|
|
WriteMessage(uint16, uint16, interface{}) error
|
|
Close() error
|
|
WLock()
|
|
WUnlock()
|
|
SetReadDeadline(t time.Time) error
|
|
SetWriteDeadline(t time.Time) error
|
|
Protocol() string
|
|
}
|
|
|
|
func DefaultReadBuffer(ul underlay) (*openP2PHeader, []byte, error) {
|
|
headBuf := make([]byte, openP2PHeaderSize)
|
|
_, err := io.ReadFull(ul, headBuf)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
head, err := decodeHeader(headBuf)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
dataBuf := make([]byte, head.DataLen)
|
|
_, err = io.ReadFull(ul, dataBuf)
|
|
return head, dataBuf, err
|
|
}
|
|
|
|
func DefaultWriteBytes(ul underlay, mainType, subType uint16, data []byte) error {
|
|
writeBytes := append(encodeHeader(mainType, subType, uint32(len(data))), data...)
|
|
ul.SetWriteDeadline(time.Now().Add(TunnelHeartbeatTime / 2))
|
|
ul.WLock()
|
|
_, err := ul.Write(writeBytes)
|
|
ul.WUnlock()
|
|
return err
|
|
}
|
|
|
|
func DefaultWriteBuffer(ul underlay, data []byte) error {
|
|
ul.SetWriteDeadline(time.Now().Add(TunnelHeartbeatTime / 2))
|
|
ul.WLock()
|
|
_, err := ul.Write(data)
|
|
ul.WUnlock()
|
|
return err
|
|
}
|
|
|
|
func DefaultWriteMessage(ul underlay, mainType uint16, subType uint16, packet interface{}) error {
|
|
writeBytes, err := newMessage(mainType, subType, packet)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ul.SetWriteDeadline(time.Now().Add(TunnelHeartbeatTime / 2))
|
|
ul.WLock()
|
|
_, err = ul.Write(writeBytes)
|
|
ul.WUnlock()
|
|
return err
|
|
}
|