嗨,我使用udp协议(必须使用它)传输文件,接收字节流时遇到问题并写入文件。
如下图所示:
type FileInfo struct {
Flen int64
Fname [24]byte
}
type Datapackage struct {
NContent [1000]byte
Finfo FileInfo
Datatype byte
NContentLen int64
}
func main(){
var dp Datapackage
var recvChan = make(chan []byte)
var buf :=new(bytes.Buffer)
p :=make([]byte, 1041) // 1041 is receive package len
ser, _ := net.ListentenUDP("udp", &addr)
for {
_ ,err := ser.Read(p)
buf.Write(p)
binary.Read(buf, binary.BigEndian, &dp)
if dp.Datatype =='A'{
filenamelen := bytes.IndexByte(dp.Finfo.Fname[:], 0)
filename := string(dp.Finfo.Fname[:filenamelen])
fp, err := os.Create(filename)
if err != nil {
fmt.Println(err)
}
go func(fp *os.File){
for {
wn, err := fp.Write(<-recvChan)
if err != nil {
fmt.Println(err)
}
if wn < 1000{
fmt.Println(wn)
break
}
}(fp)
close(recvChan)
fp.Close()
}
} else{
recvChan<-dp.NContent[:dp.NContentLen]
}
// }else{
// wn, err = fp.Write(dp.NContent[:dp.NContentLen])
// if err != nil {
// fmt.Println(err)
// }
// if wn < 1000{
// fp.Close()
// continue
// }
//}
}
}
现在如上所述,有两种方法可以将数据流写入文件,一种是通常的方式,即Annotations,另一种是使用通道。但是当使用频道时,获取文件的大小是否严格,但无法打开(例如exe,zip)正确,如果不使用频道,文件可以打开正确,我不知道为什么?
任何帮助将不胜感激。