- 论坛徽章:
- 0
|
#include "unp.h"
void signal_handler(void);
void sig_alrm(int signo);
int create_udp_socket(struct sockaddr_in *dstaddr, char *argv[]);
void check_udp_socket(int sockfd, char *argv[]);
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in dstaddr;
if (argc != 3) {
fprintf(stderr, "usage: ./a.out \r\n");
return 1;
}
signal_handler();
sockfd = create_udp_socket(&dstaddr, argv);
check_udp_socket(sockfd, argv);
return 0;
}
int create_udp_socket(struct sockaddr_in *dstaddr, char *argv[])
{
int sockfd;
if ((sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
err_sys("socket");
bzero(dstaddr, sizeof(*dstaddr));
dstaddr->sin_family = AF_INET;
dstaddr->sin_port = htons(atoi(argv[2]));
if (inet_pton(AF_INET, argv[1], &dstaddr->sin_addr) = 0)
err_sys("inet_pton");
if (connect(sockfd, (SA *)dstaddr, sizeof(*dstaddr)) == -1)
err_sys("connect");
return sockfd;
}
void check_udp_socket(int sockfd, char *argv[])
{
char data[] = "test", buf[100];
ssize_t n;
int rawfd;
struct ip *ip;
struct icmp *icmp;
/* create ICMP raw socket */
if ((rawfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1)
err_sys("socket");
if (write(sockfd, data, strlen(data)) != strlen(data))
err_sys("write");
/* read reply from destination host */
bzero(buf, sizeof(buf));
while (1) {
alarm(1); /* set timeout to 1 second */
if ((n = read(rawfd, buf, 100)) == -1)
if (errno != EINTR)
err_sys("read");
alarm(0);
ip = (struct ip *)buf;
if (ip->ip_p == IPPROTO_ICMP) {
icmp
= (struct icmp *)(buf + sizeof(struct ip));
if (icmp->icmp_type == ICMP_UNREACH) {
if (icmp->icmp_code == ICMP_UNREACH_PORT)
printf("%d port is not open.\r\n", atoi(argv[2]));
}
} else
printf("%d port is open.\r\n", atoi(argv[2]));
break;
}
}
void signal_handler(void)
{
struct sigaction act;
act.sa_handler = sig_alrm;
act.sa_flags = 0;
if (sigemptyset(&act.sa_mask) == -1)
err_sys("sigemptyset");
else if (sigaction(SIGALRM, &act, NULL) == -1)
err_sys("sigaction");
}
void sig_alrm(int signo)
{
return;
}
void err_sys(const char *errmsg)
{
perror(errmsg);
exit(1);
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39758/showart_353309.html |
|