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

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

这里主要介绍的是在TCP连接中的应用

connect()函数简介

1. 功能: 用于客户端建立tcp连接,发起三次握手过程。
2. 原型:

#include<sys/socket.h>
#include<sys/types.h>
int connect(int sockfd, const struct sockaddr* server_addr, socklen_t addrlen)
返回值:0──成功, -1──失败。

3. 参数:

sockfd:标识一个套接字。
serv_addr:套接字s想要连接的主机地址和端口号。
addrlen:serv_addr缓冲区的长度。

4. 错误代码:

EBADF 参数sockfd 非合法socket处理代码
EFAULT 参数serv_addr指针指向无法存取的内存空间
ENOTSOCK 参数sockfd为一文件描述词,非socket。
EISCONN 参数sockfd的socket已是连线状态
ECONNREFUSED 连线要求被server端拒绝。
ETIMEDOUT 企图连线的操作超过限定时间仍未有响应。
ENETUNREACH 无法传送数据包至指定的主机。
EAFNOSUPPORT sockaddr结构的sa_family不正确。
EALREADY socket为不可阻塞且先前的连线操作还未完成。

connect()的包裹函数

代码实现

#include<sys/socket.h>
#include<sys/types.h>
#include<stdlib.h>

#define MAXSLEEP 128

int my_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;
}

介绍

这是一个connect超时重连的函数,如果连接成功,则这个函数返回0。如果连接失败,则每次等待1、2、4、8。。。秒后继续尝试重新连接,直到MAXSLEEP为止,则说明连接失败,返回-1。

总结

也许你会觉得这样实现会有些麻烦,但这样确实可以使你的程序更加健壮,如果因为一些时间差或者阻塞的原因,使得你的第一次connect失败,利用这个包裹函数就不至于使整个客户端程序错误,而进行重连,消除这些客观因素的影响。

注意:具体的代码可以参见:https://github.com/AnSwErYWJ/DogFood/blob/master/client.c

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值