您的位置:首页 > 移动开发 > IOS开发

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

2017-08-31 16:56 405 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: