请教一下该代码段的功能

2017-12-17 16:17:38 +08:00
 acpanda

请问该段代码,函数实现的功能是什么了?相互调用 io.Copy 的意图是?

func Join(c Conn, c2 Conn) (int64, int64) {
	var wait sync.WaitGroup

	pipe := func(to Conn, from Conn, bytesCopied *int64) {
		defer to.Close()
		defer from.Close()
		defer wait.Done()

		var err error
		*bytesCopied, err = io.Copy(to, from)
		if err != nil {
			from.Warn("Copied %d bytes to %s before failing with error %v", *bytesCopied, to.Id(), err)
		} else {
			from.Debug("Copied %d bytes to %s", *bytesCopied, to.Id())
		}
	}

	wait.Add(2)
	var fromBytes, toBytes int64
	go pipe(c, c2, &fromBytes)
	go pipe(c2, c, &toBytes)
	c.Info("Joined with connection %s", c2.Id())
	wait.Wait()
	return fromBytes, toBytes
}
1622 次点击
所在节点    Go 编程语言
9 条回复
Immortal
2017-12-17 16:34:20 +08:00
这个你得结合 Con 结构体的 reader 和 writer 的实现一起看才能知道哦
rrfeng
2017-12-17 16:35:48 +08:00
函数实现的功能就是互相 copy

至于它能干什么你得问写这个函数的人了
rrfeng
2017-12-17 16:37:07 +08:00
看起来像代理程序转发链接数据的。
acpanda
2017-12-17 21:52:23 +08:00
@rrfeng 问题是,互相 copy 不会形成一个环吗?
acpanda
2017-12-17 21:53:59 +08:00
@Immortal 如果都是 net.Conn 的实现了?
acpanda
2017-12-17 21:55:46 +08:00
@rrfeng 都是实现了 net.Conn 的 reader 和 writer。我的疑惑是,两次调用交换了参数的位置,不会形成一个循环吗?
rrfeng
2017-12-17 21:57:22 +08:00
@acpanda 同一个对象的 reader 和 writer 对应的不一定是同一个 buffer,这么说就明白了吧
sirgod
2017-12-18 08:56:24 +08:00
tcp 连接是双工的,如果你在同一端先写再读,那么读出来的并不是刚才你写进去的,而是另一端的人写进去的
JohnSmith
2017-12-18 10:33:12 +08:00
一般代理都是这么实现的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/415471

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX