conn(net.Conn)不会一直写在socket上

时间:2017-05-23 14:20:47

标签: sockets go tcp byte

我已经完成了一个服务器和客户端的应用程序,用于通过套接字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

关闭服务器端的连接

2 个答案:

答案 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()
    }
}

我不知道这个解决方案是否真的很好但是有效!