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;
}
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;
}
相关文章推荐
- Socket中如何设置连接超时
- 【c#】设置Socket连接、接收超时(转)
- HttpClient代理IP及设置连接读取超时
- 如何设置socket的连接超时
- Socket中如何设置连接超时
- linux socket 设置连接超时的方法
- Socket中如何设置连接超时-通过测试
- [转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054
- Socket中如何设置连接超时
- Android中的socket编程-关于设置连接的ip问题
- Socket中如何设置连接超时(转):仅仅为了记录
- Linux设置socket客户端的连接超时(转)
- 【c#】设置Socket连接、接收超时
- python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054
- Socket编程 socket连接设置超时的几种方法
- Socket中如何设置连接超时(转)
- golang设置socket的连接超时
- C# Socket连接超时设置
- Socket中如何设置连接超时
- socket连接超时的问题,设置限定时间