码迷,mamicode.com
首页 > 其他好文 > 详细

四、网络编程-读写函数

时间:2016-03-07 19:15:59      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

1、写函数write

函数原型:

size_t write(int fd,const void *buf,size_t nbytes);

write函数将buf中的nbytes字节内容写入文件描述符fd,成功时返回写的字节数,失败时返回-1。在网络程序中,向套接字文件描述符写时有两种情况:

1)write的返回值大于0,表示写了部分或者是全部数据。

2)返回值小于0,此时出现了错误,要根据错误类型来处理。如果错误为EINTR,表示写的时候出现了中断错误;如果为EPIPE表示网络连接出现了问题(对方关闭了连接)。

可以自定义写函数来处理上面的情况:

int my_write(int fd, void *buffer, int length)
{
    int bytes_left;
    int written_bytes;
    char *ptr;

    ptr = buffer;
    bytes_left = length;
    while (bytes_left>0)
    {
        /* 开始写*/
        written_bytes = write(fd, ptr, bytes_left);
        if (written_bytes <= 0) /* 出错了*/
        {
            if (errno == EINTR) /* 中断错误 我们继续写*/
                written_bytes = 0;
            else             /* 其他错误 没有办法,只好撤退了*/
                return(-1);
        }
        bytes_left -= written_bytes;
        ptr += written_bytes;     /* 从剩下的地方继续写  */
    }
    return(0);
}

2、读函数read

函数原型:

size_t read(int fd,void *buf,size_t nbytes);

read函数是负责从fd中读取内容。当读成功时,read返回实际所读的字节数。如果返回的值是0 表示已经读到文件的结束了;小于0表示出现了错误:如果错误为EINTR说明读是由中断引起的,如果是ECONNREST表示网络连接出了问题。
可以自定义读函数来处理上面的情况:

int my_read(int fd, void *buffer, int length)
{
    int bytes_left;
    int bytes_read;
    char *ptr;

    bytes_left = length;
    while (bytes_left>0)
    {
        bytes_read = read(fd, ptr, bytes_read);
        if (bytes_read<0)
        {
            if (errno == EINTR)
                bytes_read = 0;
            else
                return(-1);
        }
        else if (bytes_read == 0)
            break;
        bytes_left -= bytes_read;
        ptr += bytes_read;
    }
    return(length - bytes_left);
}

四、网络编程-读写函数

标签:

原文地址:http://www.cnblogs.com/tgycoder/p/5251155.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!