C语言函数的封装(未完待续)

坚持 成长 每日一篇

readLine读取一行数据

返回-1表示读取失败,注意返回的数据是带\n。

ssize_t readLine(int fildes, void *buf, size_t nbyte)
{
    int     offset = 0;
    ssize_t ret = -1;

    while ((nbyte-offset) > 0)
    {
        ret = read(fildes, buf + offset, 1);
        if (ret == 1)
        {
            offset++;
            char ch = *((char *)(buf + offset - 1));
            if (ch == '\n')
            {
                return offset;
            }
        }
        else if (ret == 0)
        {
            return offset;
        }
        else
        {
            return -1;
        }
    }

    return offset;
}

readN读取固定字节

读取固定字节,都到结尾返回已读子节数,-1表示读取失败

ssize_t readN(int fildes, void *buf, size_t nbyte)
{
    int     offset = 0;
    ssize_t ret = -1;

    while ((nbyte-offset) > 0)
    {
        ret = read(fildes, buf + offset, nbyte-offset);
        if (ret > 0)
        {
            offset += ret;
        }
        else if (ret == 0)
        {
            return offset;
        }
        else
        {
            return -1;
        }
    }

    return offset;
}

openSocket根据iP地址和端口号连接套接字

成功返回连接成功后的套接字,失败返回-1。

int openSocket(const char *ip, uint16_t port)
{
    int socketfd = -1;
    ssize_t ret = -1;

    struct sockaddr_in serverAddr;

    serverAddr.sin_family = PF_INET;
    serverAddr.sin_port = htons(port) ;
    inet_pton(PF_INET, ip, &(serverAddr.sin_addr.s_addr));

    socketfd = socket(PF_INET, SOCK_STREAM, 0);
    if (socketfd < 0)
    {
        perror("socket err");
        return -1;
    }
    printf("socketfd = %d\n", socketfd);

    ret = connect(socketfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
    if (ret < 0)
    {
        perror("connect err");
        close(socketfd);
        return -1;
    }

    return socketfd;
}

openListenSocket以本地地址起监听套接字

成功返回监听的套接字,失败返回-1;

int openListenSocket(uint16_t port)
{
    int listenSocketfd = -1;
    ssize_t ret = -1;

    struct sockaddr_in serverAddr;

    serverAddr.sin_family = PF_INET;
    serverAddr.sin_port = htons(port);
    serverAddr.sin_addr.s_addr = INADDR_ANY;


    listenSocketfd = socket(PF_INET, SOCK_STREAM, 0);
    if (listenSocketfd < 0)
    {
        perror("socket err");
        return -1;
    }

    ret = bind(listenSocketfd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
    if (ret < 0)
    {
        perror("bind err");
        close(listenSocketfd);
        return -1;
    }


    ret = listen(listenSocketfd, 5);
    if (ret < 0)
    {
        perror("listen err");
        close(listenSocketfd);
        return -1;
    }

    return listenSocketfd;
}

readN_timeout读取字节超时

参数sec表示超过多少时间就认为读取超时,该函数一般适用于网络请求

ssize_t readN_timeout(int fildes, void *buf, size_t nbyte, long sec)
{
    fd_set readFdSet;

    int     offset = 0;
    ssize_t ret = -1;

    struct timeval timeout;

    time_t time1 = time(NULL);
    time_t time2 = time1;
    time_t sumTime = 0;

    while ((nbyte-offset) > 0)
    {
        FD_ZERO(&readFdSet);
        FD_SET(fildes, &readFdSet);

        if (sec - sumTime <= 0)
        {
            break;
        }

        timeout.tv_sec = sec - sumTime;
        timeout.tv_usec = 0;
        //计算等待可读数据,select的返回值1表示有数据可读
        time1 = time(NULL);
        ret = select(fildes+1, &readFdSet, NULL, NULL, &timeout);
        time2 = time(NULL);

        sumTime += (time2 - time1);

        if (ret == 1)
        {
            ret = read(fildes, buf + offset, nbyte-offset);
            if (ret > 0)
            {
                offset += ret;
            }
            else if (ret == 0)
            {
                break;
            }
            else
            {
                return -1;
            }
        }
        else
        {
            return -1;
        }
    }

    return offset;
}

writeN_timeout写入字节超时

同上

ssize_t writeN_timeout(int fildes, const void *buf, size_t nbyte, long sec)
{
    fd_set writeFdSet;

    int     offset = 0;
    ssize_t ret = -1;

    struct timeval timeout;

    time_t time1 = time(NULL);
    time_t time2 = time1;
    time_t sumTime = 0;

    while ((nbyte-offset) > 0)
    {
        FD_ZERO(&writeFdSet);
        FD_SET(fildes, &writeFdSet);

        if (sec - sumTime <= 0)
        {
            break;
        }

        timeout.tv_sec = sec - sumTime;
        timeout.tv_usec = 0;

        time1 = time(NULL);
        ret = select(fildes+1, NULL, &writeFdSet, NULL, &timeout);
        time2 = time(NULL);

        sumTime += (time2 - time1);

        if (ret == 1)
        {
            ret = write(fildes, buf + offset, nbyte - offset);
            if (ret < 0)
            {
                return -1;
            }
            offset += ret;
        }
        else
        {
            return -1;
        }
    }

    return offset;
}

contentsWithPath查看目下的文件夹返回OC数组

/*OC的NSFileManager下有一个面向对象的方法-(NSArray *)contentsOfDirectoryAtPath:error:相同的功能
 *封装一个oc语法的获取目录下子目录 
 *path为文件夹路径时候返回数组,否则返回nil。出错返回数组为nil 输出error 否则error为空
 *目录下没有可见文件返回数组包含0个对象
 */
NSArray* contentsWithPath(NSString *path,NSError **error)
{
    DIR *dp;
    struct dirent *dirp;
    const char *c_path = [path cStringUsingEncoding:NSUTF8StringEncoding];
    if ((dp = opendir(c_path)) == NULL) {
        if (error == nil) {
            return nil;
        }
        *error = [[NSError alloc] initWithDomain:@"can open Dir" code:505 userInfo:nil];
        return nil;
    }
    NSMutableArray *array = [[NSMutableArray alloc] init];
    while ((dirp = readdir(dp)) != NULL) {
        //printf("文件名:%s    类型:%d\n",dirp->d_name,dirp->d_type); 类型为4:文件夹 8:普通文件
        NSString *fileName = [NSString stringWithUTF8String:dirp->d_name];
        //去除隐藏的文件,Mac下以.开头命名的文件会变成隐藏文件
        if ([fileName hasPrefix:@"."]) {

        }else
        {
            [array addObject:fileName];
        }

    }
    return array;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值