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