#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <errno.h>
#define TIMEOUT 5
#define SERV_PORT 53
int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Usage: client xxx.xxx.xxx.xxx\nExample: client 192.168.0.1\n");
exit(1);
}
int sockfd, flags, res;
struct sockaddr_in servaddr;
fd_set fdr, fdw;
struct timeval timeout;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0) {
perror("Netwrok test...\n");
return -1;
}
/* set socket fd noblock */
if((flags = fcntl(sockfd, F_GETFL, 0)) < 0) {
perror("Netwrok test...\n");
close(sockfd);
return -1;
}
if(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0) {
perror("Network test...\n");
close(sockfd);
return -1;
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
if(errno != EINPROGRESS) { // EINPROGRESS
perror("Network test...\n");
close(sockfd);
return -1;
}
}
else {
printf("Connected\n");
return 0;
}
FD_ZERO(&fdr);
FD_ZERO(&fdw);
FD_SET(sockfd, &fdr);
FD_SET(sockfd, &fdw);
timeout.tv_sec = TIMEOUT;
timeout.tv_usec = 0;
res = select(sockfd + 1, &fdr, &fdw, NULL, &timeout);
if(res < 0) {
perror("Network test...\n");
close(sockfd);
return -1;
}
if(res == 0) {
printf("Connect server timeout")
close(sockfd);
return -1;
}
if(res == 1) {
if(FD_ISSET(sockfd, &fdw))
{
printf("Connected\n");
close(sockfd);
return 0;
}
}
/* Not necessary */
if(res == 2) {
printf("Connect server timeout");
close(sockfd);
return -1;
}
printf("Connect server timeout");
close(sockfd);
return -1;
}
|