用于字节流套接字的readn函数和writen函数

       字节流套接字上的read和write函数所表现的行为不同于通常的文件I/O。字节流套接字上调用read或write函数输入或输出的字节数可能比请求的数量少,然而这不是出错的状态。这个现象的原因可能是内核中用于套接字的缓冲区可能已经到达了极限。此时所需的是调用者再次调用read或write函数,以输出或输入剩余的字节。这是分别实现对read和write函数的改进函数readn和writen。

readn:

ssize_t readn(int fd, void *vptr, size_t n)
{
    size_t nleft;
    ssize_t nread;
    char *ptr;
    
    ptr = vptr;
    nleft = n;
    while( nleft > 0 )
    {
        if( (nread = read(fd, ptr, nleft)) < 0 )
        {
            if(errno == EINTR)
            {
                nread = 0;
            }
            else
            {
                return -1;
            }
        }
        else if ( nread == 0 )  //EOF
        {
            break;
        }
        
        nleft -= nread;
        ptr += nread;  
    }
    
    return (n - nleft);
}


writen:

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 )
            {
                written = 0;
            }
            else
            {
                return -1;
            }
        }
        
        nleft -= nwritten;
        ptr += nwritten;
    }
    
    return n;
}


 

你可能感兴趣的:(用于字节流套接字的readn函数和writen函数)