`

UNP_2_Read Line Function

阅读更多
UNP Code
ssize_t Readline(int fd, void *ptr, size_t maxlen)
{
    ssize_t n;

    if ( (n = readline(fd, ptr, maxlen)) < 0)
        err_sys("readline error");  //  套头函数,多了错误信息

    return(n);
}

ssize_t readline(int fd, void *vptr, size_t maxlen)
{
    int  n, rc;
    char c, *ptr;

    ptr = vptr;
    for (n = 1; n < maxlen; n++)
    {
        if ( (rc = my_read(fd, &c)) == 1)   //  my_read相当于一个数据池的作用
        {                                   //  readline只专注于行的逻辑关系
            *ptr++ = c;
            if (c == '\n')  break;          /* newline is stored, like fgets() */
        }
        else 
        {
            if (rc == 0)     
            {
                if (n == 1) return(0);  /* EOF, no data read */
                else    break;          /* EOF, some data was read */

            } else return(-1);          /* error, errno set by read() */
        }
    }

    *ptr = 0;    /* null terminate like fgets() */
    return(n);
}

//  static function
static ssize_t my_read(int fd, char *ptr)
{
    static int     read_cnt = 0;
    static char    *read_ptr;
    static char    read_buf[MAXLINE];   //  缓存池

    if (read_cnt <= 0) 
    {
again:
        //  sizeof(read_buf) = 1 => read_cnt = 1,这里可以做缓存机制
        if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0) 
        {
            if (errno == EINTR) //  Interrupted system call
                goto again;
            return(-1); //  其它错误
        }

        if (read_cnt == 0)
            return(0);

        read_ptr = read_buf;
    }

    read_cnt--;
    *ptr = *read_ptr++;
    return(1);
}
分享到:
评论

相关推荐

    UNP_v2_CN经典图书part3part4

    UNP书籍是网络编程领域的权威之作,由W. Richard Stevens撰写,对理解和实践网络通信有着深远的影响。这份压缩包文件包含了part3和part4两部分,意味着我们需要将part1到part5的所有部分下载并放在同一个目录下,...

    nercoeus#UNP_reading_notes#27.IP选项1

    1. NOP:单字节选项,典型的用途是为某个后续选项落在 4 字节边界上进行填充 2. EOL:单字节选项,终止选项的处理 6. Record route 7.

    unp源码_UNIX_

    "unp源码_UNIX_"这个标题暗示我们正在讨论一个与UNIX操作系统相关的开源代码库,可能是某个软件或工具的实现,其名称为UNP。在UNIX系统中,UNP可能代表"Unix Network Programming",这是一个广泛使用的术语,通常指...

    TCPIP协议详解卷二:实现

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCPIP协议详解卷三.rar

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议——高清文字(china-pub经典系列)

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议.rar

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCP-IP详解卷三

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCP-IP详解卷三:TCP事务协议,HTTP,NNTP和UNIX域协议

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCPIP协议详解卷3-事务协议

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    TCP-IP详解卷3.rar

    TCP-IP详解卷2_1.rar TCP-IP详解卷2_2.rar;TCP-IP详解卷3.rar 都上传了。只下第一部分不全 目 录 译者序 前言 第一部分 TCP事务协议 第1章 T/TCP概述 1 1.1 概述 1 1.2 UDP上的客户-服务器 1 1.3 TCP上的客户-...

    TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

    17.11 PRU_CONNECT2请求和unp_connect2 函数 195 17.12 socketpair系统调用 198 17.13 pipe系统调用 202 17.14 PRU_ACCEPT请求 203 17.15 PRU_DISCONNECT请求和 unp_disconnect函数 204 17.16 PRU_SHUTDOWN请求和unp...

    unp.rar_W. Richard Stevens_c/C++_unp

    2. "unp" - 这个文件名可能是某个程序或代码库的名称,很可能与Stevens的网络编程工作相关,它可能包含了一系列的源代码文件,用于演示和解释网络编程的各种概念和技术。 综合以上信息,这个压缩包对于想要深入学习...

    Java网络编程--Unix域协议:实现

    17.2和17.3中提及的全局变量(如图17-2所示)维护了协议的状态和资源管理,例如`unp_deferred`用于无用单元的收集,`unp_gc_int`记录是否正在执行收集,`unp_ino_t`分配给新套接字的伪i_node号,以及缓冲区大小的...

    TCP/IP详解part_2

    第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行...

    UNP学习笔记讲义

    Linux网络编程修炼指南内功心法,即通过学习UNP(Unix Network Programming)来深入理解Linux下的网络编程技术。网络协议基础部分是学习Linux网络编程的前置知识,它主要包括ISO/OSI七层模型的理解、网络协议的概念...

    unp 64bit CentOS编译

    【标题】"unp 64位 CentOS编译"涉及的是在64位的CentOS操作系统上编译Unix网络编程卷1第三版所使用的`unp.h`头文件及其相关库。这个压缩包包含了必要的源代码和配置文件,使得用户能够在这样的环境中进行编程和开发...

    Python-unp一个用来方便解包归档文件的命令行工具

    2. **使用unp解压文件** 安装完成后,你可以使用`unp`命令来解压文件。例如,如果你有一个名为`example.tar.gz`的文件,只需要在终端中输入: ``` unp example.tar.gz ``` unp会自动识别文件类型,并执行相应的...

Global site tag (gtag.js) - Google Analytics