UNP 的writen函数疑惑?
时间:2010-09-02
来源:互联网
UNP 中writen 代码,应该 错误返回 -1或者返回实际写入socket的字节数
而write返回0代表socket发送缓冲区已满,应返回while中写入的字节数才对,而为何直接返回-1
还有 最后return n,,为什么不是 n - nleft
复制代码
而write返回0代表socket发送缓冲区已满,应返回while中写入的字节数才对,而为何直接返回-1
还有 最后return n,,为什么不是 n - nleft
- ssize_t writen(int fd, const void *vptr, size_t n)
- {
- size_t nleft;
- ssize_t nwritten;
- const char *ptr;
-
- ptr = vptr;
- nleft = n;
- while (nleft > 0) {
- if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
- if (nwritten < 0 && errno == EINTR)
- nwritten = 0;
- else
- return -1;
- }
-
- nleft -= nwritten;
- ptr += nwritten;
- }
- return n;
- }
作者: 日月并行 发布时间: 2010-09-02
执行到return n时,nleft的值为多少?
好好想想。
好好想想。
作者: lenovo 发布时间: 2010-09-02
只有 nleft == 0 时,write才会返回0,而 nleft 显然不会为0,所以就返回-1,表示发生了某种错误。if (nwritten < 0 && errno == EINTR) 的else部分,可能是error != EINTR,而不是nwriten == 0
作者: zzyong08 发布时间: 2010-09-02
QUOTE:
执行到return n时,nleft的值为多少?
好好想想。
lenovo 发表于 2010-09-02 13:13
好好想想。
lenovo 发表于 2010-09-02 13:13
恩 最后 return n时 nleft == 0;当时是这么想的,而write返回0代表socket发送缓冲区已满,
应返回while中写入的字节数才对,直接返回-1不妥
- if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
- if (nwritten < 0 && errno == EINTR)
- nwritten = 0;
- else if (nwritten == 0) ++++++++
- break; ++++++++
- else
- return -1;
- }
作者: 日月并行 发布时间: 2010-09-02
已经妥了. 这个函数的设计逻辑是, 如果write返回0, 你必须关闭socket, 不能再使用这个socket了.
作者: ideawu 发布时间: 2010-09-02
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28