Allenxuxu / gev

🚀Gev is a lightweight, fast non-blocking TCP network library / websocket server based on Reactor mode. Support custom protocols to quickly and easily build high-performance servers.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于sendInLoop中EAGAIN的处理

M6ZeroG opened this issue · comments

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。

n, err := unix.Write(c.fd, data)
if err != nil {
if err == unix.EAGAIN {
return
}
c.handleClose(c.fd)
return

非常感谢,这里确实有问题。 已经提了修复的 PR ,可以看下 #61 @M6ZeroG

非常感谢,这里确实有问题。 已经提了修复的 PR ,可以看下 #61 @M6ZeroG

不客气,还以为我对EAGAIN的理解有问题呢,查了资料又看了好久:joy:

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。

n, err := unix.Write(c.fd, data)
if err != nil {
if err == unix.EAGAIN {
return
}
c.handleClose(c.fd)
return

我理解 linux 里返回 EAGAIN , n 会被置为 -1, golang 里n会返回啥,我没找到确切的资料。
按你这里所说,返回 EAGAIN ,会存在 n 大于 0 的情况?有相关资料吗?

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。

n, err := unix.Write(c.fd, data)
if err != nil {
if err == unix.EAGAIN {
return
}
c.handleClose(c.fd)
return

我理解 linux 里返回 EAGAIN , n 会被置为 -1, golang 里n会返回啥,我没找到确切的资料。
按你这里所说,返回 EAGAIN ,会存在 n 大于 0 的情况?有相关资料吗?

根据golang封装的Write()源码上看,这个n应该就是 linux系统调用返回值,暂时还没有实测过
https://github.com/golang/sys/blob/master/unix/zsyscall_linux.go#L1565-L1578

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。

n, err := unix.Write(c.fd, data)
if err != nil {
if err == unix.EAGAIN {
return
}
c.handleClose(c.fd)
return

我理解 linux 里返回 EAGAIN , n 会被置为 -1, golang 里n会返回啥,我没找到确切的资料。
按你这里所说,返回 EAGAIN ,会存在 n 大于 0 的情况?有相关资料吗?

根据golang封装的Write()源码上看,这个n应该就是 linux系统调用返回值,暂时还没有实测过
https://github.com/golang/sys/blob/master/unix/zsyscall_linux.go#L1565-L1578

这里我也看过,结合 linux man,似乎会返回 -1 ,但是返回 -1 的话又不符合 go 的“哲学”了,已经返回 err 了,n 应该是一个零值