包裹函数,处理出错

本文详细介绍了Linux下Socket编程中常用的包裹函数,包括Write、Read、Bind、Listen、Accept、Connect、Socket、Setsockopt和Select等函数的具体实现及错误处理方式,并提供了connect超时重连的包裹函数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包裹函数,处理出错

命名要求,大写前面一个字母,如write的包裹函数要Write。

write包裹函数

//————————————————————————————————————————————————————————
//wrap.c
//write 包裹函数
ssize_t Write (int fd, const void *buf, size_t num)  
{  
    ssize_t res;  
    size_t n;  
    const char *ptr;  


    n = num;  
    ptr = buf;  
    while (n > 0) {  
        /* 开始写*/   
        if ((res = write (fd, ptr, n)) <= 0) {  
            if (errno == EINTR)  
                res = 0;  
            else  
                return (-1);  
        }  


        ptr += res;/* 从剩下的地方继续写     */   
        n -= res;  
    }  


    return (num);  
}

read包裹函数

//————————————————————————————————————————————————————————
//read包裹函数
ssize_t Read (int fd, void *buf, size_t num)  
{  
    ssize_t res;  
    size_t n;  
    char *ptr;  


    n = num;  
    ptr = buf;  
    while (n > 0) {  
        if ((res = read (fd, ptr, n)) == -1) {  
            if (errno == EINTR)  
                res = 0;  
            else  
                return (-1);  
        }  
        else if (res == 0)  
            break;  


        ptr += res;  
        n -= res;  
    }  


    return (num - n);  
}

int Bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
{
    return bind(sockfd, addr, addrlen);
}

int Listen(int sockfd, int backlog)
{
    return listen(sockfd, backlog);
}

Accept包裹函数

int Accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
    int connfd = accept(sockfd, addr, addrlen);
    if(connfd == -1)
    {
        perror("accept() failed");
        exit(0);
    }
    return connfd;
}

connect包裹函数

#define MAXSLEEP 128

/*这是一个connect超时重连的函数,
如果连接成功,则这个函数返回0。
如果连接失败,则每次等待1、2、4、8。。。
秒后继续尝试重新连接,直到MAXSLEEP为止,
则说明连接失败,返回-1。*/
int Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen)
{
    int nsec;
    for(nsec = 1;nsec <= MAXSLEEP;nsec <<= 1)
    {
        if(connect(sockfd,servaddr,addrlen) == 0)
            return 0;//connection accepted
        if(nsec <= MAXSLEEP/2)//sleep nesc,then connect retry
            sleep(nsec);
    }
    return -1;
}

Socket包裹函数

int Socket(int domain, int type, int protocol)
{
    int sockfd = socket(domain, type, protocol);
    if(sockfd == -1)
    {
        perror("socket() error");
    }

    return sockfd;
}

Setsockopt包裹函数

int Setsockopt(int sockfd, int level, int optname,
           const void *optval, socklen_t optlen)
{
    int retval = setsockopt(sockfd, level, optname, optval, optlen);
    if(retval == -1)
    {
        perror("setsockopt() error");
    }

    return retval;
}

select包裹函数

int Select(int nfds, fd_set *readfds, fd_set *writefds, 
        fd_set *exceptfds, struct timeval *timeout) 
{ 
    int n = select(nfds, readfds, writefds, exceptfds, timeout); 
    if ( n < 0 ) 
        error_quit("select error"); 
    return n; /* can return 0 on timeout */ 
} 

Linux下Socket编程—-connect()函数的包裹函数介绍

1.4 错误处理:包裹函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值