iOSsocket连接IPv4 IP v6及设置连接超时

xiaoxiao2021-02-28  108

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;

}

转载请注明原文地址: https://www.6miu.com/read-45585.html

最新回复(0)