sockets - conn (net.Conn) 并不总是写在套接字上

标签 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) 写入“1”,客户端接收它,执行 SendSnapshotIncremental(如果 n != 0 执行)并关闭客户端的连接。 .. 但是,如果 ReceiveSnapshot 没有返回错误,conn.Write([]byte) 不会写“0”,只是我用 ctrl+C 关闭服务器端的连接

最佳答案

我认为问题在于这些行:

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){...

关于sockets - conn (net.Conn) 并不总是写在套接字上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44137432/

相关文章:

node.js - 空闲 WebSocket 的开销

c++ - 安装 socket.io C++

json unmarshal 不工作但解码确实

go - 在 slice 中使用 interfaces{} 似乎会导致 40 倍的减速。在实现基于 `interface{}` 的数据结构时有没有办法绕过这个?

java - InputDataStream.available() 始终为 0 Java Socket 客户端

java - 从 GPS 设备读取数据

c - select() 在非阻塞 AF_PACKET 套接字上立即返回 0,忽略 timeval

sockets - 任何人都可以指导我或建议如何制作通过 HTTP 进行实时媒体服务器流传输的客户端

apache-flex - Adobe Flex : Why do I get intermittent SecurityErrorEvents on some browsers?

golang POST 图像和文本字段,带有 multipart/form-data