Heim > System-Tutorial > LINUX > Readn-, Writen- und Readline-Funktionen in der Linux-Netzwerkprogrammierung: Wie man Byteströme effizient liest und schreibt

Readn-, Writen- und Readline-Funktionen in der Linux-Netzwerkprogrammierung: Wie man Byteströme effizient liest und schreibt

王林
Freigeben: 2024-02-14 13:00:03
nach vorne
977 Leute haben es durchsucht

在Linux网络编程中,我们经常需要使用字节流套接字来进行数据的传输和接收。但是,字节流套接字上调用read和write函数时,输入或输出的字节数可能比请求的数量少,因为内核中用于套接字的缓冲区是有限制的,需要调用者多次调用read或write函数。这样会增加编程的复杂度和出错的可能性。为了解决这个问题,我们可以使用一些封装好的函数来实现固定长度或按行读写的功能,这些函数就是readn、writen和readline函数。本文将介绍这些函数的作用、原理、实现和使用方法,帮助你提高Linux网络编程的效率和可靠性。

Readn-, Writen- und Readline-Funktionen in der Linux-Netzwerkprogrammierung: Wie man Byteströme effizient liest und schreibt

readn函数功能:在网络编程的读取数据中,通常会需要用到一个读指定字节才返回的函数,linux系统调用中没有给出,需要自己封装。

readn实现代码:

int readn(int fd, void *vptr, size_t n)
{
  size_t     nleft = n;     //readn函数还需要读的字节数
  ssize_t    nread = 0;     //read函数读到的字节数
  unsigned char *ptr = (char *)vptr; //指向缓冲区的指针

  while (nleft > 0)
  {
    nread = read(fd, ptr, nleft);
    if (-1 == nread)
    {
      if (EINTR == errno)
        nread = 0;
      else
        return -1;
    }
    else if (0 == nread)
    {
      break;
    }
    nleft -= nread;
    ptr += nread;
  }
  return n - nleft;
}
Nach dem Login kopieren

writen函数功能:读满n个字节才返回

writen代码实现:

int writen(int fd, const void *vptr, size_t n)
{
  size_t     nleft = n; //writen函数还需要写的字节数
  ssize_t    nwrite = 0; //write函数本次向fd写的字节数
  const char*  ptr = vptr; //指向缓冲区的指针

  while (nleft > 0)
  {
    if ((nwrite = write(fd, ptr, nleft)) if (nwrite else
        return -1;
    }
    nleft -= nwrite;
    ptr += nwrite;
  }
  return n;
}
Nach dem Login kopieren

readline函数功能:读到’\n’或者读满缓冲区才返回

readline函数实现:

static ssize_t readch(int fd, char *ptr)
{
  static int     count = 0;
  static char*    read_ptr = 0;
  static char    read_buf[1024*4] = {0};

  if (count read(fd, read_buf, sizeof(read_buf));
    if (-1 == count)
      if (EINTR == errno)
        goto again;
      else
        return -1;
    else if (0 == count)
      return 0;
    read_ptr = read_buf;
  }
  count--;
  *ptr = *read_ptr++;
  return 1;
}

ssize_t readline(int fd, void *vptr, size_t maxlen)
{
  ssize_t    i = 0;
  ssize_t    ret = 0;
  char      ch = '\0';
  char*     ptr = NULL;

  ptr = (char *)vptr;

  for (i = 1; i if (1 == ret)
    {
      *ptr++ = ch;
      if ('\n' == ch)
        break;
    }
    else if (0 == ret)
    {
      *ptr = 0;
      return i-1;
    }
    else
      return -1;
  }
  *ptr = 0;
  return i;
}
Nach dem Login kopieren

通过本文,你应该对readn、writen和readline函数有了一个基本的了解,它们是对read和write函数的封装,可以实现固定长度或按行读写的功能,避免了字节流套接字上读写时可能出现的不足或错误。当然,这些函数也不是完美无缺的,它们有一些局限性和注意事项,比如对于非阻塞套接字、多线程环境、信号处理等情况,需要进行额外的处理或修改。总之,readn、writen和readline函数是Linux网络编程中非常有用的工具,值得你深入学习和掌握。

Das obige ist der detaillierte Inhalt vonReadn-, Writen- und Readline-Funktionen in der Linux-Netzwerkprogrammierung: Wie man Byteströme effizient liest und schreibt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:lxlinux.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage