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 关注
- 170 浏览
添加回答
举报