mirror of
https://github.com/PeernetOfficial/core.git
synced 2026-07-17 02:47:51 +01:00
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
/*
|
|
File Username: File Transfer.go
|
|
Copyright: 2021 Peernet s.r.o.
|
|
Author: Peter Kleissner
|
|
|
|
Encoding of file transfer protocol. Each transfer starts with a header:
|
|
Offset Size Info
|
|
0 8 Total File Size
|
|
8 8 Transfer Size
|
|
*/
|
|
|
|
package protocol
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"errors"
|
|
"io"
|
|
)
|
|
|
|
// FileTransferWriteHeader starts writing the header for a file transfer.
|
|
func FileTransferWriteHeader(writer io.Writer, fileSize, transferSize uint64) (err error) {
|
|
// Send the header: Total File Size and Transfer Size.
|
|
header := make([]byte, 16)
|
|
binary.LittleEndian.PutUint64(header[0:8], fileSize)
|
|
binary.LittleEndian.PutUint64(header[8:16], transferSize)
|
|
if n, err := writer.Write(header); err != nil {
|
|
return err
|
|
} else if n != len(header) {
|
|
return errors.New("error sending header")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// FileTransferReadHeader starts reading the header for a file transfer. It will only read the header and keeps the connection open.
|
|
func FileTransferReadHeader(reader io.Reader) (fileSize, transferSize uint64, err error) {
|
|
// read the header
|
|
header := make([]byte, 16)
|
|
if n, err := reader.Read(header); err != nil {
|
|
return 0, 0, err
|
|
} else if n != len(header) {
|
|
return 0, 0, errors.New("error reading header")
|
|
}
|
|
|
|
fileSize = binary.LittleEndian.Uint64(header[0:8])
|
|
transferSize = binary.LittleEndian.Uint64(header[8:16])
|
|
|
|
return fileSize, transferSize, nil
|
|
}
|