Andy Pan

Results 356 comments of Andy Pan

i don't understand why test-sanitizer-address was failing on this commit, can anyone help me out?

> i don't understand why test-sanitizer-address was failing on this commit, can anyone help me out? is it an intermittent failure? how can we determine? @oranagra @sundb

有没有具体的例子可以进一步说明你的需求?

> 不管是建立连接后马上给你发一个PP包,还是等有正式数据包之后连同 PP包+正式数据包 一起转发,在gnet实现中,你只能在OnTraffic中去解析,因为即使建连之后马上发一个PP包,OnOpen也无法读到。 其实你可以调用 `c.Fd()` 返回 fd,然后通过系统调用 `syscall.Read` 读这个 PP 包,不过 fd 是非阻塞的,所以你需要用 for 循环一直到读到完整的 PP 包。 > 所以问题就变成了,怎么在OnTraffic中先解析PP包(一次),然后正常处理正式数据包。 如果要在 `OnTraffic` 里处理,你可以用 `sync.Once`

当初实现客户端的时候之所以选择只使用一个 event-loop,是因为考虑到客户端相对服务端来说是很轻量的,单个实例通常不会管理太多连接,要轻量很多,所以单一 event-loop 应该是足够的。你现在使用 gnet 是碰到性能瓶颈了?即便是真的有性能瓶颈,使用多个 client 应该也是能解决的。

If this is for the proxy scenario, would #689 cover your case?

> [streamproxy](https://github.com/panjf2000/gnet/blob/dev/gnet_test.go) 目前 streamProxy 实现中,对端连接占用了 context 变量,这导致用户很难自定义 context。是否有可能在保持现有逻辑的同时对用户屏蔽写法差异,让 client 和 server 分别实现 OnTraffic 但是注册到同一 eventloop? 希望register 不要占用 context 那个只是一个示例,调用 `Conn.Register` 时你可以调用 [`gnet.NewContext `](https://pkg.go.dev/github.com/panjf2000/gnet/v2#NewContext) 设置任意类型的数据,然后 gnet 会在内部将之取出并设置到 Conn 里,后面你就可以通过 `c.Context()` 取出来了,你可以设置任何你想要的数据并在之后取出来使用,并没有所谓的"占用"。

This issue should have been fixed by [CL 573895](https://go-review.googlesource.com/c/go/+/573895).

因为 UDP 是基于报文而非连接,所以 conn 对于 UDP 来说只是一层抽象,用来和 TCP 或 Unix 保持 API 兼容而已,这个 context 是连接级别的,UDP 的服务端通常没有连接的概念,所以 context 在 UDP 中也就不会持久化保存。