3

golangでTCP経由でファイルを送信したい。ここに私のサーバーコードがあります:

    c is connected *net.TCPConn

    file, _ := os.Open(fn)
    defer file.Close()
    io.Copy(c, file)
    // c.CloseWrite()

とクライアント:

    as above, c is connected *net.TCPConn

    file, _ := os.Create("file.txt")
    defer file.Close()
    io.Copy(file, c)

私の質問は: この方法では、クライアントはファイルの EOF を受け取ることができません

だから、io.Copyブロックされました。c.CloseWriteファイルが終了したことをクライアントに通知するために電話する必要があります。

ファイルを送信したいのですが、うまくいきません。どうすれば解決できますか?

4

3 に答える 3

5

TCP 接続を使用している場合、os.EOF エラーは、接続が相手側で閉じられたことを意味します。

ファイルを確実に送信する唯一の方法は、マルチステート プロトコルを実装することだと思います。

例えば。転送の最初の状態で、読み取るバイト数をクライアントに伝え、状態 2 に進みます。状態 2 で、すべてのバイトが読み取られた場合、ファイル全体を読み取ったことがわかります。すべてのバイトが読み取られる前に os.EOF が検出された場合は、破棄して再度開始します。

于 2012-11-01T10:54:01.353 に答える
2

通常の C では、相手側に EOF を示すために TCP 接続をシャットダウン (fd, SHUT_WR) します。goでもこれを行うことができます:

func shutdownWrite(conn net.Conn) {
     // anonymous interface. Could explicitly use TCP instead.
     if  v, ok := conn.(interface{ CloseWrite() error }); ok {
         v.CloseWrite()
     }
 }

https://golang.org/src/net/tcpsock_posix.go?s=2073:2109#L75を参照してください

于 2016-08-01T16:59:36.583 に答える