ifconfig명령어 입력시 나오는
rx packet 과 tx packet은 송수신 된 패킷의 양을 나타낸다고합니다.
이를 구현할때 패킷의 양을 담는 변수의 크기가 일정할텐데
송수신 된 패킷의 양이 선언된 변수의 크기(int or long 등등..)를 넘어갈 경우
해당 변수엔 쓰레기값이 들어가는거로 알고 있습니다.
이를 처리하려면 어떻게 해야할까요...?
질문의 의도가 "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
모두들 행복하세요~
답변 감사합니다 약간의 의문이 해소는 되었네요.
우선 /proc/net/dev에서 패킷 정보를 읽어오고는 있습니다만.. 상관없을까요.... 64bit 변수를 사용 한다 해도 rexos33님 말씀처럼 언젠간 overflow가 발생할텐데... kernel에서는 그럴경우 어떤식으로 처리를 할까요..? p.s)현재 구현하는 프로그램은 24시간 구동되는 장비에 테스트를 해보려합니다.
2^64 = 18446744073709551616 Bytes = 16777216 TB 이니, overflow가 나려면 굉장히 오래 걸릴 것입니다. overflow가 나고, unsigned 형이므로 0 부터 다시 시작합니다. 그러니 무시해도 될 것 같습니다.
제가 하고자 하는게 보안장비 내에 작성된 코드를 넣고 돌릴거라 저부분에 대해서도 생각 할 수 밖에 없었네요 ㅎ 좀 더 고민해봐야겠습니다.
흠...
질문의 의도가 "ifconfig 명령의 결과로 rx/tx 패킷 사이즈가 굉장히 커져서 즉, overflow 나서 잘못된 수치값을 갖게될 경우 어떻게 처리하느냐?"인 듯합니다....
일단 64 bit 변수를 선언하면 언젠가는 overflow가 나긴 하지만... 어차피 kernel에서도 64 bit 카운트 변수를 갖고 있으므로 문제될 것이 없을 것 같습니다.
그럼 64 bit 변수 선언은 아래 처럼 정의하고...
그럼 uint64 packets; 로 선언해서 사용하면 됩니다.
참고로 ifconfig 명령의 정보와 동일하게 "/proc/net/dev"에서도 얻을 수 있습니다. 그러므로 텍스트 파일을 parsing하여 필요한 정보만을 획득할 수도 있습니다.
/proc/net/dev 파일:
모두들 행복하세요~
감사합니다
답변 감사합니다 약간의 의문이 해소는 되었네요.
우선 /proc/net/dev에서 패킷 정보를 읽어오고는 있습니다만..
상관없을까요.... 64bit 변수를 사용 한다 해도 rexos33님 말씀처럼
언젠간 overflow가 발생할텐데... kernel에서는 그럴경우 어떤식으로 처리를 할까요..?
p.s)현재 구현하는 프로그램은 24시간 구동되는 장비에 테스트를 해보려합니다.
64비트 최대 사이즈가...
2^64 = 18446744073709551616 Bytes = 16777216 TB 이니, overflow가 나려면 굉장히 오래 걸릴 것입니다.
overflow가 나고, unsigned 형이므로 0 부터 다시 시작합니다. 그러니 무시해도 될 것 같습니다.
모두들 행복하세요~
감사합니다~
제가 하고자 하는게 보안장비 내에 작성된 코드를 넣고 돌릴거라
저부분에 대해서도 생각 할 수 밖에 없었네요 ㅎ
좀 더 고민해봐야겠습니다.