Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

socket.write failed #27

Closed
lparam opened this issue Jul 23, 2013 · 8 comments
Closed

socket.write failed #27

lparam opened this issue Jul 23, 2013 · 8 comments

Comments

@lparam
Copy link

lparam commented Jul 23, 2013

socket.write失败时没有反馈给应用层,这会导致应用层在连接已经断开的情况下还继续发送数据

@lparam lparam closed this as completed Jul 23, 2013
@cloudwu
Copy link
Owner

cloudwu commented Jul 23, 2013

write 是非阻塞接口。 实现成阻塞的太过复杂。(需要在发送队列里做标记,并且用消息反馈)

@lparam
Copy link
Author

lparam commented Jul 24, 2013

如果没有反馈的话,应用层会在连接断开之类的异常情况下,依然继续发送数据.这个有什么解决办法呢?

@cloudwu
Copy link
Owner

cloudwu commented Jul 24, 2013

谢谢. 已经增加了 socket.write 的返回值. 如果 fd 已关闭, 返回空. 否则返回 true . write 依旧是非阻塞的, 所以不会在连接关闭时立刻得到正确返回值.

@lparam
Copy link
Author

lparam commented Jul 24, 2013

谢谢.另外,socket.lock,socket.unlock这个函数的主要作用是什么呢?看得不是很明白

@cloudwu
Copy link
Owner

cloudwu commented Jul 24, 2013

lock/unlock 属于 low level api , 只在实现某些库的时候使用.
因为, 在 read 的时候, 服务可能挂起等待数据. 但在等待期间, 有可能有别的 coroutine 去操作同一个 fd .
例如, 你需要先读 4 个字节表示长度, 再根据长度读后面的数据块.
如果没有 lock/unlock. 你读完 4 个字节长度后, 可能别的 coroutine 读走了后面的数据, 而不是当前 coroutine.

如果你不会在 coroutine 间共享 fd 的读写, 那么就不需要调用 lock/unlock.

对于库实现, 比如 redis driver 就是有必要的. 你不同的 coroutine 可能都会共享同一个 redis 的连接. 而分析 redis 数据需要多步 read 才能实现.

@lparam
Copy link
Author

lparam commented Jul 24, 2013

明白了.谢谢.

@microcai
Copy link

这返回值有什么意义? 误导用户?不过, 符合天朝人想法. 哈哈

@cloudwu
Copy link
Owner

cloudwu commented Mar 28, 2014

目前提供了高阶库 socketchannel . 不用再直接调用 socket.write , 使用 socketchannel:request 会在连接断开后抛出 error .

发自我的 iPhone

在 2014年3月28日,上午1:19,microcai notifications@github.com 写道:

这返回值有什么意义? 误导用户?不过, 符合天朝人想法. 哈哈


Reply to this email directly or view it on GitHub.

@DeanHH DeanHH mentioned this issue Aug 23, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants