rx packet tx packet 값들에 대해서..

dlffos의 이미지

ifconfig명령어 입력시 나오는

rx packet 과 tx packet은 송수신 된 패킷의 양을 나타낸다고합니다.

이를 구현할때 패킷의 양을 담는 변수의 크기가 일정할텐데

송수신 된 패킷의 양이 선언된 변수의 크기(int or long 등등..)를 넘어갈 경우

해당 변수엔 쓰레기값이 들어가는거로 알고 있습니다.

이를 처리하려면 어떻게 해야할까요...?

rexos33의 이미지

질문의 의도가 "ifconfig 명령의 결과로 rx/tx 패킷 사이즈가 굉장히 커져서 즉, overflow 나서 잘못된 수치값을 갖게될 경우 어떻게 처리하느냐?"인 듯합니다....

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:01:02:03:04:05  
          inet addr:123.0.11.123  Bcast:123.0.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:314155882 errors:0 dropped:0 overruns:0 frame:0
          TX packets:742156038 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1602376960 (1.4 GiB)  TX bytes:3715736111 (3.4 GiB)
 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:90665911 errors:0 dropped:0 overruns:0 frame:0
          TX packets:90665911 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:464993203 (443.4 MiB)  TX bytes:464993203 (443.4 MiB)

일단 64 bit 변수를 선언하면 언젠가는 overflow가 나긴 하지만... 어차피 kernel에서도 64 bit 카운트 변수를 갖고 있으므로 문제될 것이 없을 것 같습니다.

그럼 64 bit 변수 선언은 아래 처럼 정의하고...

#if defined(_WIN32)
typedef   signed __int64    int64;
typedef unsigned __int64   uint64;
#elif defined(__linux__) || defined(__APPLE__) || defined(ANDROID)
typedef   signed long long  int64;
typedef unsigned long long uint64;
#endif

그럼 uint64 packets; 로 선언해서 사용하면 됩니다.

참고로 ifconfig 명령의 정보와 동일하게 "/proc/net/dev"에서도 얻을 수 있습니다. 그러므로 텍스트 파일을 parsing하여 필요한 정보만을 획득할 수도 있습니다.

/proc/net/dev 파일:

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  eth0:1700616692 314886092    0    0    0     0          0         0 3715737671 742156062    0    0    0     0       0      0
    lo:464993203 90665911    0    0    0     0          0         0 464993203 90665911    0    0    0     0       0          0
dummy0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

모두들 행복하세요~

dlffos의 이미지

답변 감사합니다 약간의 의문이 해소는 되었네요.

우선 /proc/net/dev에서 패킷 정보를 읽어오고는 있습니다만..
상관없을까요.... 64bit 변수를 사용 한다 해도 rexos33님 말씀처럼
언젠간 overflow가 발생할텐데... kernel에서는 그럴경우 어떤식으로 처리를 할까요..?
p.s)현재 구현하는 프로그램은 24시간 구동되는 장비에 테스트를 해보려합니다.

rexos33의 이미지

2^64 = 18446744073709551616 Bytes = 16777216 TB 이니, overflow가 나려면 굉장히 오래 걸릴 것입니다.
overflow가 나고, unsigned 형이므로 0 부터 다시 시작합니다. 그러니 무시해도 될 것 같습니다.

모두들 행복하세요~

dlffos의 이미지

제가 하고자 하는게 보안장비 내에 작성된 코드를 넣고 돌릴거라
저부분에 대해서도 생각 할 수 밖에 없었네요 ㅎ
좀 더 고민해봐야겠습니다.