From:
http://blog.csdn.net/yanook/article/details/6587542
作者:yanook
socket上的read write操作不同与一般的文件IO操作,socket上的用read write读写的字节数
可能比要求的少,但这并不是错误,原因是socket的缓冲区可能已经到达了极限。此时所需要
的就是再次调用read write以写入或输出剩余的字符。这种情况下在socket中很常见,但在
写字节流socket时只能在socket非阻塞的情况下才会出现,然而为预防实现万一返回不足的字符
数值,我们总是调用writen和readn函数,而不是read和write.
下面就是readn、writen函数源码:
ssize_t /* Read "n" bytes from a descriptor. */
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; /* and call read() again */
            else
                return (-1);
        }
        else if(nread == 0)
            break; /*EOF*/
        nleft -= nread;
        ptr += nread;
    }
    return (n-nleft); /* return >= 0 */
}
 
ssize_t /* write "n" bytes to a descriptor. */
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; /* and call write() again */
            else
                return (-1); /* error */
        }
        nleft -= nwritten;
        ptr += nwritten;
    }
    return n;
}