int socket_open_connect_ip(const u8 *ip,const u32 port)
{
int len = 0;
//int port= 6908;
int ret;
struct sockaddr_in addr;
if(ip!=NULL);
else
return -100;//no ip
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
inet_pton(AF_INET, ip, &addr.sin_addr);
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
close(sockfd);
return -1;
}
fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL,0)|O_NONBLOCK);//设置为非阻塞模式
ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));
if (ret != 0 )
{
if(errno != EINPROGRESS)
eTRACE("connect error :%s\n",strerror(errno));
else
{
struct timeval tm = {10, 0};
fd_set wset,rset;
FD_ZERO(&wset);
FD_ZERO(&rset);
FD_SET(sockfd,&wset);
FD_SET(sockfd,&rset);
long t1 = time(NULL);
int res = select(sockfd+1,&rset,&wset,NULL,&tm);
long t2 = time(NULL);
eTRACE("interval time: %ld\n", t2 - t1);
if(res < 0)
{
}
else if(res == 0)
{
}
else if (1 == res)
{
if(FD_ISSET(sockfd,&wset))
{
fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL,0) & ~O_NONBLOCK);
ret = 0;
return ret;
}
else
{
}
}
}
}
if(ret<0)
close(sockfd);
return ret;
}