首页 > 解决方案 > 您如何在与 libp2p-go 的直接 p2p 连接中手动刷新写入?

问题描述

我找不到与 libp2p 中的对等点直接连接来刷新写入的 API(它在 pubsub 中运行良好)。libp2p-go我在 Go 中使用using创建了一个直接的 libp2p 连接host.NewStream。该流由下面的包装器使用。问题是当我写入这个流时,另一端的对等端没有收到消息。底层network.Stream似乎在 libp2p 的网络中进行了内部缓冲。但是我找不到一种方法来network.Stream刷新go-libp2p-core. 其实我到处都找不到。更改我的包装器以使用bufio读取器和写入器没有效果,因为它不会刷新 libp2p 的内部缓冲。我知道消息已发送,因为当我关闭流时,远程对等方会收到它们。

// NetReaderWriter is a wrapper for a libp2p network stream to an individual peer.
type NetReaderWriter struct {
    stream network.Stream
}

// NewNetReaderWriter creates a new ReadWriteCloser based on a ReadCloser and a WriteCloser.
func NewNetReaderWriter(stream network.Stream) *NetReaderWriter {
    return &NetReaderWriter{
        stream: stream,
    }
}

// Read like in io.Reader
func (rwc *NetReaderWriter) Read(p []byte) (int, error) {
    return rwc.stream.Read(p)
}

// Write like in io.Writer
func (rwc *NetReaderWriter) Write(p []byte) (int, error) {
    k, err := rwc.stream.Write(p)
    // <== flush here, but how???
    return k, err
}

// Close like in io.Closer - this closes both the reader and writer.
func (rwc *NetReaderWriter) Close() error {
    err := rwc.stream.Close()
    if err != nil {
        return fmt.Errorf("unable to close network stream: %v", err)
    }
    return nil
}

标签: golibp2p

解决方案


推荐阅读