netstate Á¤º¸ ¾ò¾î¿À±â
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

netstat ÇÁ·Î±×·¥Àº ³×Æ®¿öÅ© ¿¬°á, ¶ó¿ìÆÃÅ×À̺í, ÀÎÅÍÆäÀ̽º »óÅÂ, ¸ÖƼÄɽºÆ® ¸â¹öµî ´Ù¾çÇÑ Á¤º¸¸¦ º¸¿©ÁØ´Ù. ³×Æ®¿öÅ© ¿¬°á Á¤º¸ÀÇ °æ¿ì¿¡µµ INET TCP ¿¬°á »Ó¸¸ ¾Æ´Ï¶ó Unix Domain ¼ÒÄÏÀÌ »ç¿ëÇÏ´Â ¿¬°áµµ º¸¿©ÁØ´Ù.

¿©±â¿¡¼­´Â ³×Æ®¿öÅ© ¿¬°á Á¤º¸Áß TCP Á¤º¸¸¦ °¡Á®¿À´Â ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. netstat ÇÁ·Î±×·¥À» ÀÌ¿ëÇÒ °æ¿ì -t ¿É¼ÇÀ» ÀÌ¿ëÇϸé tcp ¿¬°áÁ¤º¸¸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Ù.
# netstat -t 
Active Internet connections (w/o servers) 
Proto Recv-Q Send-Q Local Address           Foreign Address         State 
tcp        0      0 joinc:http              222.122.194.224:4936    ESTABLISHED 
tcp        0      0 joinc:http              lj602145.inktomis:60739 TIME_WAIT 
tcp        0      0 joinc:ssh               dhcp-ippool24.onn:52070 ESTABLISHED 
tcp        0      0 joinc:http              202.179.183.71:43503    TIME_WAIT 
tcp        0      0 joinc:http              lj602348.inktomis:50637 TIME_WAIT 
tcp        0      0 joinc:http              222.122.194.31:36932    ESTABLISHED 
tcp        0      0 localhost:56988         localhost:http          TIME_WAIT 
tcp        0      0 localhost:56989         localhost:http          TIME_WAIT 
... 
 

¸®´ª½º ¿î¿µÃ¼Á¦´Â /proc ÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇØ¼­ À¯Àú¿¡°Ô tcpÁ¤º¸¸¦ Á¦°øÇÑ´Ù. tcp ¿¬°áÁ¤º¸´Â /proc/net/tcp ÆÄÀÏ¿¡ ASCII ÇüÅ·ΠÀúÀåµÇ¾î ÀÖ´Ù.
# cat /proc/net/tcp 
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode 
   0: 0100007F:A320 00000000:0000 0A 00000000:00000000 00:00000000 00000000   105        0 10199 1 dd071c00 3000 0 0 2 -1 
   1: 0100007F:B8EF 00000000:0000 0A 00000000:00000000 00:00000000 00000000   105        0 10210 1 dd071800 3000 0 0 2 -1 
   2: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10292 1 de477c00 3000 0 0 2 -1 
   3: 85D5E5CB:B44C 266E2ECF:0747 01 00000000:00000000 00:00000000 00000000  1001        0 61497 1 c978cc00 350 40 22 2 100 
   4: 85D5E5CB:CB66 5713EADA:0016 01 00000000:00000000 02:000886F8 00000000  1001        0 70721 2 cb642800 211 59 26 3 100 
   5: 85D5E5CB:C713 5713EADA:0016 01 00000000:00000000 02:0007A91B 00000000  1001        0 66949 2 cc6d7400 205 40 30 3 100 
   6: 0100007F:A320 0100007F:B812 01 00000000:00000000 00:00000000 00000000   105        0 10202 1 dd071000 201 0 0 2 100 
   7: 0100007F:B812 0100007F:A320 01 00000000:00000000 00:00000000 00000000   105        0 10216 1 dd071400 201 0 0 2 100 
   8: 85D5E5CB:ABE2 521B2ECF:0747 01 00000000:00000000 00:00000000 00000000  1001        0 62217 1 cc6d7800 545 40 8 2 100 
   9: 85D5E5CB:DEC3 F73D75D3:1A0B 01 00000000:00000000 02:0002A4C1 00000000  1001        0 21080 2 de477800 277 40 30 2 100 
 
°¢ Çʵå´Â ´ÙÀ½°ú °°Àº Àǹ̸¦ °¡Áø´Ù.
local_address Ãâ¹ßÁö ÁÖ¼Ò
rem_address ¸ñÀûÁö ÁÖ¼Ò
st »óÅÂ (ESTABLISHED, TIME_WAIT, FIN_WAIT ...)
tx_queue Send Queue
rx_queue Receive Queue
tr:tm->when ¼ÒÄÏ Å¸À̸Ӱ¡ ÀÛµ¿Çϰí ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ´Ù. 0À̶ó¸é ÀÛµ¿Çϰí ÀÖÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù.
uid ¼ÒÄÏÀ» »ý¼ºÇÑ À¯ÀúÀÇ ID
timeout »ç¿ëµÇÁö ¾Ê´Â´Ù.
inode ¸®´ª½º Virtual Filesystem¿¡¼­ÀÇ ¼ÒÄÏ inode

¿¬°á»óÅ´ /usr/include/netinet/tcp.h¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
enum 
{ 
  TCP_ESTABLISHED = 1, 
  TCP_SYN_SENT, 
  TCP_SYN_RECV, 
  TCP_FIN_WAIT1, 
  TCP_FIN_WAIT2, 
  TCP_TIME_WAIT, 
  TCP_CLOSE, 
  TCP_CLOSE_WAIT, 
  TCP_LAST_ACK, 
  TCP_LISTEN, 
  TCP_CLOSING   /* now a valid state */ 
}; 
 

½ÇÇàµÇ´Âµ¥ ¹®Á¦ ¾ø´Â Á¤µµ·Î¸¸ ¸¸µé¾úÀ¸´Ï, ´Ùµë´Â°Ç °¢ÀÚ..
#include <stdio.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <pwd.h> 
 
const char *TCPFILE = "/proc/net/tcp"; 
const char *FORMAT ="%s%s%s%s%s%s%s%s%s%s"; 
static char states[16][20] = { "UNKNOWN" ,"ESTABLISHED", "SYN_SENT", "SYN_RECV", "FIN_WAIT1", "FIN_WAIT2", "TIME_WAIT", "CLOSE",  
"CLOSE_WAIT", "LAST_ACK", "LISTEN", "CLOSING", "MAX_STATES"}; 
 
struct netinfo 
{ 
    FILE *tcpfp; 
    char localaddr[24]; 
    char localport[16]; 
    char remaddr[24]; 
    char remport[16]; 
    char stat[16]; 
    int  txq; 
    int  rxq; 
    int     uid; 
    int  idx; 
    char uname[24]; 
}; 
 
typedef struct netinfo TCPINFO; 
 
TCPINFO *nsopen() 
{ 
    TCPINFO *ltcpinfo; 
    if(access(TCPFILE,F_OK) !=0) 
    { 
        perror("ACCESS Error"); 
        return (TCPINFO *)NULL;  
    } 
    ltcpinfo = (TCPINFO *)malloc(sizeof(*ltcpinfo));  
    memset((void *)ltcpinfo, 0x00, sizeof(*ltcpinfo)); 
 
    ltcpinfo->tcpfp = NULL; 
    ltcpinfo->tcpfp = fopen(TCPFILE, "r"); 
    if (ltcpinfo == NULL) 
    { 
        perror("ACCESS Error"); 
        free(ltcpinfo); 
        return (TCPINFO *)NULL; 
    } 
    ltcpinfo->uid = -1; 
    ltcpinfo->idx = 0; 
 
    return ltcpinfo; 
} 
 
void nsclose(TCPINFO *tf) 
{ 
    if (tf->tcpfp == NULL) 
        fclose(tf->tcpfp); 
    free(tf); 
} 
 
char *getuname(char *uname, int uid, int size) 
{ 
    struct passwd *pass_info = NULL; 
    while((pass_info = getpwent()) != NULL) 
    { 
        if (pass_info->pw_uid == uid) 
        { 
            strncpy(uname, pass_info->pw_name, size); 
            return uname; 
        } 
    } 
    return (char *)NULL; 
} 
 
 
TCPINFO *nsread(TCPINFO *info) 
{ 
    char buf[256]; 
    char *tr; 
    char null[16]; 
    char localaddr[24]; 
    char remaddr[24]; 
    char st[4]; 
    char trxqueue[20]; 
    char uid[8]; 
    char uname[36] = {0x00,}; 
    int  fnum; 
    int  snum; 
    struct in_addr in; 
    char *addr; 
 
    if (info->idx == 0) 
    { 
        if (fgets(buf, 256, info->tcpfp) == NULL) 
        { 
            return (TCPINFO *)NULL; 
        } 
        info->idx=1; 
    } 
    if (fgets(buf, 256, info->tcpfp) == NULL) 
        return (TCPINFO *)NULL; 
    // sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode 
    // 0: 0100007F:A56F 00000000:0000 0A 00000000:00000000 00:00000000 00000000   105        0 10282 1 c34a1c00 3000 0 0 2 -1 
    sscanf(buf,"%s %s %s %s %s %s %s %s %s %s",  
                                    null,      // sl : ¹Ì »ç¿ë  
                                    localaddr, // local_address  
                                    remaddr,     // rem_address 
                                    st,        // status 
                                    trxqueue,  // tx_queue & rx_queue 
                                    null,      // tr & tm->when : ¹Ì »ç¿ë 
                                    null,      // retrnsmt : ¹Ì»ç¿ë 
                                    uid,       // uid 
                                    null,      // timeout : ¹Ì»ç¿ë 
                                    null);     // inde : ¹Ì»ç¿ë 
    // get localaddr 
    sscanf(localaddr, "%x%[:]%x", &fnum, null, &snum); 
    in.s_addr = fnum; 
    addr = inet_ntoa(in); 
    sprintf(info->localaddr, "%s", addr);  
    sprintf(info->localport, "%d", snum);  
 
    // get remaddr 
    sscanf(remaddr, "%x%[:]%x", &fnum, null, &snum); 
    in.s_addr = fnum; 
    addr = inet_ntoa(in); 
    sprintf(info->remaddr, "%s", addr);  
    sprintf(info->remport, "%d", snum);  
 
    // Status 
    sscanf(st, "%x", &fnum); 
    sprintf(info->stat,"%s", states[fnum]); 
 
    // User Infomation 
    if (getuname(uname, atoi(uid), 32) == NULL) 
    { 
        sprintf(info->uname,"%s", ""); 
    } 
    else 
        sprintf(info->uname,"%s", uname); 
    info->uid = atoi(uid); 
    return info;  
 
} 
 
int main(int argc, char **argv) 
{ 
    TCPINFO *tf; 
    tf = nsopen(); 
    while (nsread(tf) != (TCPINFO *)NULL) 
    { 
        printf("%s:%s ---> %s:%s\t%s\t%s\n", tf->localaddr, tf->localport,  
                                        tf->remaddr, tf->remport, tf->stat, tf->uname); 
    } 
    nsclose(tf); 
} 
 
´ÙÀ½Àº ½ÇÇà °á°ú´Ù.
# ./mynetstat 
127.0.0.1:37382 ---> 0.0.0.0:0  CLOSING hplip 
127.0.0.1:34641 ---> 0.0.0.0:0  CLOSING 
127.0.0.1:631 ---> 0.0.0.0:0    CLOSING 
203.229.213.133:39600 ---> 207.46.27.62:1863    SYN_SENT 
203.229.213.133:33609 ---> 203.229.213.91:22    SYN_SENT 
203.229.213.133:44665 ---> 65.54.228.33:1863    SYN_SENT 
203.229.213.133:45402 ---> 211.117.61.247:6667  SYN_SENT 
203.229.213.133:50398 ---> 207.46.26.112:1863   SYN_SENT 
203.229.213.133:37614 ---> 207.46.26.162:1863   SYN_SENT 
203.229.213.133:48312 ---> 207.46.111.89:1863   SYN_SENT 
127.0.0.1:43480 ---> 127.0.0.1:34641    SYN_SENT 
127.0.0.1:34641 ---> 127.0.0.1:43480    SYN_SENT 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.