ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. ¼³¸í
¸ñÀû ¼¹ö¿¡ ´ëÇÑ ICMP¿¡ ´ëÇÑ ÀÀ´ä½Ã°£À» üũÇÑ´Ù. »ç¿ë¹æ¹ý001 int main(int argc, char **argv) 002 { 003 int sockfd; 004 int ip; 005 struct timeval atime; 006 struct sockaddr_in addr; 007 sockfd = IcmpInit(); 008 ip = CheckIcmp(sockfd, argv[1], &atime, &addr); 009 printf("%s ---> %d sec %d msec\n", inet_ntoa(addr.sin_addr), 010 atime.tv_sec, atime.tv_usec); 011 IcmpClear(sockfd); 012 } 013
À§ÀÇ Äڵ带 ÄÄÆÄÀÏÇÑ ÈÄ ½ÇÇà½ÃŲ °á°ú´Ù. # ./icmp_check www.joinc.co.kr 218.234.19.87 ---> 0 sec 8 msec int IcmpInit();
int CheckIcmp(int sockfd,
char *dstaddr,
struct timeval *atime,
struct sockaddr_in *ipaddr)
int IcmpClear();
ÄÚµå001 #include <stdlib.h> 002 #include <netdb.h> 003 #include <string.h> 004 #include <netinet/ip_icmp.h> 005 #include <arpa/inet.h> 006 #include <errno.h> 007 #include <sys/socket.h> 008 #include <stdio.h> 009 #include <unistd.h> 010 #include <time.h> 011 #include <sys/types.h> 012 013 // IP CheckSum »ý¼º 014 int in_cksum(u_short *p, int n) 015 { 016 register u_short answer; 017 register long sum = 0; 018 u_short odd_byte = 0; 019 020 while(n > 1) 021 { 022 sum += *p++; 023 n -= 2; 024 } 025 026 if (n == 1) 027 { 028 *(u_char *)(&odd_byte) = *(u_char *)p; 029 sum += odd_byte; 030 } 031 032 sum = (sum >> 16) + (sum & 0xffff); 033 sum += (sum >> 16); 034 answer = ~sum; 035 036 return (answer); 037 } 038 039 // ICMP ÇÁ·ÎÅäÄÝÀ» Áö¿øÇÏ´Â RAW¼ÒÄÏ »ý¼º 040 int IcmpInit() 041 { 042 int icmp_socket; 043 icmp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 044 return icmp_socket; 045 } 046 047 int CheckIcmp(int sockfd, 048 char *dstaddr, 049 struct timeval *atime, 050 struct sockaddr_in *ipaddr) 051 { 052 struct icmp *p, *rp; 053 char buffer[1024]; 054 int sl, ret, hlen; 055 int diff; 056 struct sockaddr_in addr, sin, from; 057 struct ip *ip; 058 struct timeval ltime; 059 struct hostent *hentry; 060 061 // È£½ºÆ® À̸§À¸·Î ºÎÅÍ ÁÖ¼Ò°©À» ¾ò¾î¿Â´Ù. 062 if ((hentry = gethostbyname(dstaddr)) == NULL) 063 { 064 return -1; 065 } 066 067 gettimeofday(<ime, NULL); 068 memset(buffer, 0x00, 1024); 069 p = (struct icmp *)buffer; 070 p->icmp_type = ICMP_ECHO; 071 p->icmp_code = 0; 072 p->icmp_cksum = 0; 073 p->icmp_seq = 15; 074 p->icmp_id = getpid(); 075 p->icmp_dun.id_ts.its_otime = ((ltime.tv_sec%100)*10000)+(ltime.tv_usec / 100); 076 p->icmp_cksum = in_cksum((u_short *)p, 1000); 077 memcpy(buffer+sizeof(*p), (void *)&time, 4); 078 079 memset(&addr, 0, sizeof(0)); 080 memcpy(&addr.sin_addr, hentry->h_addr, hentry->h_length); 081 addr.sin_family = AF_INET; 082 083 ret = sendto(sockfd, p, sizeof(*p), MSG_DONTWAIT, 084 (struct sockaddr *)&addr, sizeof(addr)); 085 if (ret < 0) 086 { 087 exit(0); 088 return -1; 089 } 090 sl = sizeof(from); 091 ret = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&from, &sl); 092 093 if (ret < 0) 094 return -1; 095 ip = (struct ip *)buffer; 096 hlen = ip->ip_hl*4; 097 rp = (struct icmp *)(buffer+hlen); 098 gettimeofday(<ime, NULL); 099 diff = (((ltime.tv_sec%100)*10000)+ltime.tv_usec/100) - rp->icmp_dun.id_ts.its_otime; 100 atime->tv_sec = diff/1000; 101 atime->tv_usec = diff/10; 102 *ipaddr = addr; 103 return sin.sin_addr.s_addr; 104 } 105 106 int IcmpClear(int sockfd) 107 { 108 close(sockfd); 109 return 1; 110 } 111 ÇØ¾ßµÉ °Í
¼¹ö°¡ ÀÏÁ¤½Ã°£ ÀÀ´äÇÏÁö ¾ÊÀ»°æ¿ì ¿¡·¯¸¦ ¹ß»ýÇÏ°í ¸®ÅÏÇϵµ·Ï Äڵ带 ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¼ÒÄÏ ÁöÁ¤ÀÚ¿¡ ´ëÇØ select()¸¦ ÀÌ¿ëÇÏ¸é µÉ°ÍÀÌ´Ù. ÀԷ¿¡ ´ëÇÑ select()°ü·Ã ÄÚµå´Â read_wait¸¦ Âü°íÇϱ⠹ٶõ´Ù. º¯°æ»çÇ×2004/02/02
![]() |
|
||
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|