+ -
当前位置:首页 → 问答吧 → UNP 的writen函数疑惑?

UNP 的writen函数疑惑?

时间:2010-09-02

来源:互联网

UNP 中writen 代码,应该 错误返回 -1或者返回实际写入socket的字节数
而write返回0代表socket发送缓冲区已满,应返回while中写入的字节数才对,而为何直接返回-1
还有 最后return n,,为什么不是 n - nleft
  1. ssize_t writen(int fd, const void *vptr, size_t n)
  2. {
  3.         size_t nleft;
  4.         ssize_t nwritten;
  5.         const char *ptr;

  6.         ptr = vptr;
  7.         nleft = n;
  8.         while (nleft > 0) {
  9.                 if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
  10.                         if (nwritten < 0 && errno == EINTR)
  11.                                 nwritten = 0;
  12.                         else
  13.                                 return -1;
  14.                 }

  15.                 nleft -= nwritten;
  16.                 ptr += nwritten;
  17.         }
  18.         return n;
  19. }
复制代码

作者: 日月并行   发布时间: 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



恩 最后 return n时 nleft == 0;当时是这么想的,而write返回0代表socket发送缓冲区已满,
应返回while中写入的字节数才对,直接返回-1不妥
  1.   if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
  2.                          if (nwritten < 0 && errno == EINTR)
  3.                                  nwritten = 0;
  4.                          else if (nwritten == 0)   ++++++++
  5.                                  break;                    ++++++++
  6.                          else
  7.                                  return -1;
  8.                  }
复制代码

作者: 日月并行   发布时间: 2010-09-02

已经妥了. 这个函数的设计逻辑是, 如果write返回0, 你必须关闭socket, 不能再使用这个socket了.

作者: ideawu   发布时间: 2010-09-02

相关阅读 更多

热门下载

更多