zoukankan      html  css  js  c++  java
  • 四、网络编程-读写函数

    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;
       ptr = buffer;
        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);
    }
  • 相关阅读:
    database join
    图像超分辨率重建
    信号处理
    将博客搬至CSDN
    Openstack
    nginx的优化
    CentOS系统的优化
    zabbix服务端客户端部署
    MySQL优化必须调整的10项配置
    TCP三次握手
  • 原文地址:https://www.cnblogs.com/tgycoder/p/5251155.html
Copyright © 2011-2022 走看看