글 수 48
2010.01.04 15:30:08 (*.237.17.188)
59283
도와주세요!!에 인터넷 연결 상태를 어떻게 확인할 수 있는가에 대한 질문이 있었는데, 짜라님께서 아주 명쾌한 답변을 주셨네요. 특정 사이트로 PING을 때리고 그 결과값을 확인하는 것이죠.
저는 이 방법을 popen()으로 처리해 보았습니다. 아래 처럼 말이죠. ^^
#include <stdio.h> #include <string.h> #define BUFF_SIZE 1024 #define TRUE (1 == 1) int is_internet_connected( void) // 인터넷이 연결되어 있는지 여부를 반환 // TRUE : 인터넷과 연결되어 있음 { char buff[BUFF_SIZE]; int is_connected = !TRUE; FILE *fp; // 인터넷 연결 상태는 웹 주소에 PING을 때리는 결과를 확인 // popen() 함수 호출 실패도 인터넷과 연결되지 않음으로 판단 fp = popen( "ping www.falinux.com -c 1 | grep \"1 received\" | wc -l", "r"); if ( NULL != fp) { while( fgets( buff, BUFF_SIZE, fp) ) { if ( NULL != index( buff, '1')) // 결과 값으로 1 이 있는지를 확인 { is_connected = TRUE; // 있으면 TRUE break; } } pclose( fp); } return is_connected; // 검색 결과를 반환 } int main( void) { if ( is_internet_connected()) { printf( "Internet is connected.\n"); } else { printf( "No internet.\n"); } return 0; }
실행해 보면 잘 됩니다.
]$ ./a.out
Internet is connected.
]$
한가지 문제라면 인터넷과 연결되어 있을 때에는 아주 빠르게 결과를 알려 주는데, 연결이 안 되어 있다면, 체크 시간이 너무 오래 걸리내요. PING 타임 아웃이 10초? 정도 걸리는 것 같아요. 그래서 PING 타임아웃을 지정해서 실행했으면 좋겠는데, 잘 안 되네요. 혹 PING에 타임아웃 거는 방법을 아시는 분, 부탁드립니다. 또는 PING 말고 다른 방법을 아시는 분, 아울러 귀한 말씀 부탁드립니다. ^^
2010.01.05 14:52:14 (*.140.194.180)
혹시 popen하는데 걸리는 시간이 오래 걸리진 않을까 해서 10분이상 기다려봤는데도 동작을 하지 않네요..
fgets에서 왜 멈추는지 이런 .. 흑흑
2010.01.05 15:46:50 (*.140.194.180)
이런.. fread로 해도 같은 증상이 일어나네요.. 그자리에서 멈춰버리네요.............. 왜이럴까요..
멀고도 먼 리눅스 세계 ㅡ.ㅜ
2010.01.07 12:58:53 (*.140.194.180)
위소스를 적용시킬려고 했으나, ping을 때려보는 것은 신뢰성이 떨어져서 안된다네요 다른 방법을 찾아봐야할듯.. 그래도 위의 방법도 하나 알게되어서 정말 기쁩니다.. 하하 좋은정보 감사합니다 ^^
정말 감사합니다.
저도 popen으로 여러번 시도를 해봤는데.. 잘 안되더군요..
길석님이 올려주신 소스를 적용하려고하니 fgets () 에서 무한루프 걸린것처럼 잡혀있네요
타이머가 계속 돌아가고, 버튼 이벤트가 찍혀나오는거보면 프로세스가 죽은건 아닌데말이죠....'
fgets 말고 다른방법은 없을까용?? ㅡ.ㅜ