我已经完成了一个服务器和客户端的应用程序,用于通过套接字TCP发送信息
问题是,如果函数zfs.ReceiveSnapshot(在服务器端)没有返回错误(err == nil),conn.Write([]byte("0"))
不起作用,客户端没有收到任何字节继续,它无法关闭连接...
我向您展示服务器和客户端的代码
服务器
package main
import (
"net"
"github.com/mistifyio/go-zfs"
)
func main() {
// Listen for incoming connections
l, _ := net.Listen("tcp", ":7766")
// Close the listener when the application closes
defer l.Close()
fmt.Println("Listening on port 7766...")
for {
// Listen for an incoming connection.
conn, _ := l.Accept()
// Handle connections in a new goroutine.
go handleRequest(conn)
}
}
// Handles incoming requests
func handleRequest(conn net.Conn) {
// Receive snapshot
_, err := zfs.ReceiveSnapshot(conn, "tank/replication")
if err != nil {
conn.Write([]byte("1"))
zfs.ReceiveSnapshot(conn, "tank/replication")
conn.Close()
} else {
conn.Write([]byte("0"))
conn.Close()
}
}
客户端:
package main
import (
"net"
"github.com/mistifyio/go-zfs"
)
func main() {
conn, _ := net.Dial("tcp", "192.168.99.5:7766")
for i := 0; i < 1; i++ {
// Get all snapshots in tank/test
take, _ := zfs.Snapshots("tank/test")
// Select snapshots
snap := take[0].Name
ds1, _ := zfs.GetDataset(snap)
// Send first snapshot
ds1.SendSnapshot(conn)
defer conn.Close()
buff := make([]byte, 1024)
n, _ := conn.Read(buff)
if n != 0 {
snap = take[1].Name
ds2, _ := zfs.GetDataset(snap)
zfs.SendSnapshotIncremental(conn, ds1, ds2, zfs.IncrementalStream)
conn.Close()
}
}
}
[编辑]:
如果ReceiveSnapshots
返回错误,conn.Write([] byte)写入&#34; 1&#34;,cliente接收它,执行SendSnapshotIncremental(如果n!= 0则执行)并关闭客户端中的连接但是,如果ReceiveSnapshot
没有返回错误,conn.Write([] byte)不会写&#34; 0&#34;只是我用ctrl + C
答案 0 :(得分:1)
我认为问题出在以下几个方面:
buff := make([]byte, 1024)
n, _ := conn.Read(buff)
在这种情况下,n是读取的字节的数字,而不是其中任何一个的值。
我做:
buff := make([]byte, 1)
n,err := conn.Read(buff)
buff = buff[:n]
if len(buff) == 0 {
//error
}
if(buff[0] != 0){...
答案 1 :(得分:0)
[编辑&amp;解决]
要解决这个问题的几个修改...
服务器强>
func handleRequest(conn net.Conn) {
// Number of snapshots in server side
take, _ := zfs.Snapshots("tank/replication")
count := len(take)
if count < 1 {
conn.Write([]byte("0"))
} else {
conn.Write([]byte("1"))
}
// Receive snapshot
zfs.ReceiveSnapshot(conn, "tank/replication")
}
count
返回服务器拥有的快照数,因此如果没有,客户端将执行该情况,在其他情况下是默认情况。
<强>客户端:强>
func main() {
// Get the last two snapshots
take, _ := zfs.Snapshots("tank/test")
snap := take[0].Name
ds1, _ := zfs.GetDataset(snap)
snap = take[1].Name
ds2, _ := zfs.GetDataset(snap)
// New server connection
conn, _ := net.Dial("tcp", "192.168.99.5:7766")
// Read data of server side
buff := bufio.NewReader(conn)
n, _ := buff.ReadByte()
// Execute the correct case
switch string(n) {
case "0":
ds1.SendSnapshot(conn)
conn.Close()
default :
zfs.SendSnapshotIncremental(conn, ds1, ds2, zfs.IncrementalStream)
conn.Close()
}
}
我不知道这个解决方案是否真的很好但是有效!