iOS socket连接IPv4 IP v6及设置连接超时

本文介绍如何使用C语言实现IPv4和IPv6的TCP连接,并设置了连接超时处理。通过创建socket并配置地址结构,实现了服务器端口与IP地址的绑定。

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

ipv4:

struct sockaddr_in     addrServer;

    

    memset(&addrServer, 0, sizeof(addrServer));

  //  bzero(&addrServer, sizeof(addrServer));


    addrServer.sin_family = AF_INET;

    addrServer.sin_port = htons(ServerPort);

    addrServer.sin_addr.s_addr = inet_addr(pServerIP);

    

    if((Sd = socket(AF_INET,SOCK_STREAM,0)) < 0)

    {

        SetState(NS_SOCKET_ERROR_CREATE);

        return NS_SOCKET_ERROR_CREATE;

    }

    timeval tm;

    

    tm.tv_sec=8;

    tm.tv_usec=0;

    

    int sdddd=ConnectIP(Sd,  (struct sockaddr*)&addrServer, tm);


ipv6 :

   struct sockaddr_in6     addrServer;

    

    memset(&addrServer, 0, sizeof(addrServer));

    addrServer.sin6_family = AF_INET6;

    addrServer.sin6_port = htons(ServerPort);

    inet_pton(AF_INET6, pServerIP, &addrServer.sin6_addr);

    if((Sd = socket(AF_INET6,SOCK_STREAM,0)) < 0)

    {

        SetState(NS_SOCKET_ERROR_CREATE);

        return NS_SOCKET_ERROR_CREATE;

    }

    

    int sdddd=ConnectIP(Sd,  (struct sockaddr*)&addrServer, tm);


超时设置:

int NS_Socket::ConnectIP(int sockfd, sockaddr* pAddr, timeval tm)

{

    fcntl(sockfd, F_SETFL, fcntl(sockfd,F_GETFL,0)|O_NONBLOCK);

    

    int t_connect = connect(sockfd, pAddr, sizeof(sockaddr_in));

    if(t_connect == 0) return 0;

    

    

    if(errno != EINPROGRESS) return -1;

    

    fd_set wset, rset;

    FD_ZERO(&wset);

    FD_ZERO(&rset);

    FD_SET(sockfd,&wset);

    FD_SET(sockfd,&rset);

    

    long time1 = time(NULL);

    int res = select(sockfd+1, &rset, &wset, NULL, &tm);

    long time2 = time(NULL);

    

    long t_inter = time2 - time1;

    NSLog(@"t_inter=%ld",t_inter);

    

    if(res < 0) return -1;

    else if(res == 0)

    {

        //"超时connect");

        return 1;

    

    }

    else if(res == 1)

    {

     //正常

        if(FD_ISSET(sockfd, &wset))

        {

            fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL,0) & ~O_NONBLOCK);

            return 0;

        }

    }

    

    return -1;

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值