2 回答
TA貢獻1797條經驗 獲得超6個贊
這是一個echo_srv為你工作。你也需要@jnml 的建議!
實際上分配一些緩沖區來接收 - 你做了一個 0 字節的緩沖區!
在EOF上整齊地退出
只寫收到的字節 msg[:n]
func echo_srv(c net.Conn, wg *sync.WaitGroup) {
defer c.Close()
defer wg.Done()
for {
msg := make([]byte, 1000)
n, err := c.Read(msg)
if err == io.EOF {
fmt.Printf("SERVER: received EOF (%d bytes ignored)\n", n)
return
} else if err != nil {
fmt.Printf("ERROR: read\n")
fmt.Print(err)
return
}
fmt.Printf("SERVER: received %v bytes\n", n)
n, err = c.Write(msg[:n])
if err != nil {
fmt.Printf("ERROR: write\n")
fmt.Print(err)
return
}
fmt.Printf("SERVER: sent %v bytes\n", n)
}
}
TA貢獻1946條經驗 獲得超4個贊
我沒有檢查它是否是罪魁禍首,但在“技術分析”方面,我注意到您的代碼中有一個錯誤:您將 a 的副本傳遞sync.Workgroup給echo_srv. 對副本所做的任何更改對原始實例都無效。
將簽名更改echo為:
func echo_srv(c net.Conn, wg *sync.WaitGroup)
然后像這樣調用它:
go echo_srv(conn, &wg)
附帶說明:_在慣用的 Go 代碼名稱中間不使用下劃線 ( )。慣用名稱將是例如。echoSrv反而。
- 2 回答
- 0 關注
- 197 瀏覽
添加回答
舉報
