gethostbyaddr()가 널값을 리턴하는 이유??

porcokang의 이미지

정말 검색할만큼 다 해봤습니다.
하지만 도저히 해결이 안됩니다.
계속해서 질문 올리지만 답변이 없습니다.
눈물납니다.

저는 현재 kppp와 같은 모뎁접속 프로그램을 만들고 있습니다.

프로그램은 어느정도 잘 돌아가서 ppp0는 띄었습니다.

다음은 프로그램 실행후의 로그내용입니다.

-------------------------------------------
pppd 2.4.3 started by root, uid 0
Aug 2 14:00:35 localhost pppd[2664]: Using interface ppp0
Aug 2 14:00:35 localhost pppd[2664]: Connect: ppp0 /dev/ttyACM0
Aug 2 14:00:36 localhost pppd[2664]: CHAP authentication succeeded
Aug 2 14:00:40 localhost pppd[2664]: Could not determine remote IP address: defaulting to 10.64.64.64
Aug 2 14:00:40 localhost pppd[2664]: local IP address 10.160.112.187
Aug 2 14:00:40 localhost pppd[2664]: remote IP address 10.64.64.64
Aug 2 14:00:40 localhost pppd[2664]: primary DNS address 211.234.229.23
Aug 2 14:00:40 localhost pppd[2664]: secondary DNS address 203.236.43.5
-------------------------------------------------------------------------

하지만, resolv.conf파일에 dns주소를 써야 인터넷브라우저에서 도메인으로 웹에 접속할수있는데
dns주소를 알오는게 쉽지가 않습니다.

다음은 kppp의 dns주소를 찾는 함수입니다.

-------------------------------------------------------------
void auto_hostname() {
struct in_addr local_ip;
struct hostent *hostname_entry;
QString new_hostname;
int dot;
char tmp_str[100]; // buffer overflow safe

gethostname(tmp_str, sizeof(tmp_str));
tmp_str[sizeof(tmp_str)-1]=0; // panic
old_hostname=tmp_str; // copy to QString

if (!p_kdial->stats->local_ip_address.isEmpty() && gpppdata.autoname()) {
local_ip.s_addr=inet_addr(p_kdial->stats->local_ip_address.ascii());
hostname_entry=gethostbyaddr((const char *)&local_ip,sizeof(in_addr),AF_INET);

if (hostname_entry != 0L) {
new_hostname=hostname_entry->h_name;
dot=new_hostname.find('.');
new_hostname=new_hostname.remove(dot,new_hostname.length()-dot);
Requester::rq->setHostname(new_hostname);
modified_hostname = TRUE;

new_hostname=hostname_entry->h_name;
new_hostname.remove(0,dot+1);

add_domain(new_hostname);
}
}
}
-----------------------------------------------------------------------------------

문제는 gethostbyaddr()함수가 제대로 작동을 하지 못하고 있습니다.
그래서 hostname_entry는 널값을 갇게되어 다음작업을 수행할수가 없는데요..

gethostbyaddr()함수를 쓰기 위한 사전 준비작업이 따로 있는건지, 도움말에는 특별한것이 없어 보입니다만, 왠지모르게 함수가 정상적인 값을 리턴하지 못하고 있습니다.

리눅스 네트워크프로그램에 경험이 있으신분은 도움주셨으면 합니다.

감사합니다.

porcokang의 이미지

작은 관심이 큰도움이 될거 같습니다.

짧은 조언이라도 부탁드립니다.

porcokang의 이미지

/*------------------------------------------------------------------------------------
gethostbyname()?????
shamlock 씀 (수, 2006/04/05 - 4:37pm) 프로그래밍 QnA | 질문
안녕하세요. 홈페이지 정신없네요 ㅎㅎ
질문 올리는 게시판을 한참 찾았어요
예전게 더 편한것 같은데..(아직 익숙하지 않아서 그런가..) ^^

답변좀 부탁드립니다.
아시다시피 gethostbyname()함수는 도메인 명을 IP어드레스로 변환하기 위해
dns 쿼리를 dns 서버에 날려주는 함수인데요( 맞죠? )

dns 서버는 resolve.conf에서 설정합니다

질문1----------------------
그러면 결국 gethostbyname()이 resolve.conf 파일을 참조하는 것 같은데요
resolve.conf 경로 및 파일명을 바꿀수 없을까요?
다른 경로에 저장한 후 그 파일을 참조하고 싶은데요..
(물론 시스템의 모든 프로세스가 참조할수 있어야 겠네요)
또는 공유메모리 같은 어떤 메모리 상에 띄워놓고 사용할 수 없을까요?

질문2----------------------
gethostbyname() 함수를 직접 만들어서 사용하면 젤 편할것 같은데..
방법을 잘 모르겟고..
라이브러리 함수를 변경할 수 있는 방법이나 문서에 대한 도움을 주시면 감사드리겠습니다.
---------------------------------------------------------------------------------------------*/

위에 말이 사실이라면 resolve.conf파일에 dns주소가 등록되어 있지않다면,
gethostbyname()나 gethostbyaddr() 함수가 제대로 동작하지 않는 다는 말인데요..

하지만 전 지금까지 resolve.conf파일에 dns주소를 쓰기위해 gethostbyaddr()를 사용하는 것으로 알고있었습니다.
도대체 어떻게 되는건지..

그렇다면 전화접속으로 동적으로 받아온 ip주소를 가지고 ISP의 네임서버주소를 어떻게 알 수 있나요??

철이^^v의 이미지

dns 서버정보, ip address 이런건 모두다 ppp server 에서 전달해 주는걸 사용하지 않나요?
ip 주소에서 dns 주소를 얻는다는건 좀 이상한데요? ^^;

sephiron의 이미지

프로그램 실행 로그에 나와 있는

Quote:
Aug 2 14:00:40 localhost pppd[2664]: primary DNS address 211.234.229.23
Aug 2 14:00:40 localhost pppd[2664]: secondary DNS address 203.236.43.5

내용을 resolv.conf 에 써 넣으시면 안 되나요?
----
Forensic Computing On Linux

아직 멀었어

porcokang의 이미지

하지만 저 파일이
/var/log/messages에 있는 내용인데.. DNS주소 부분만 읽어오기도 힘든거 같네요

그리고 보통 호스트네임으로 ip주소를 얻어내고 그 자신의 ip 주소로 DNS주소를 알아내는것 같습니다.
근데 잘 안되네요..ㅜㅜ

sephiron의 이미지

제 지식이 짧아서인지 자신의 ip로 DNS주소를 알아내는 방법은 들어본적이 없군요.
----
Forensic Computing On Linux

아직 멀었어

dude7853의 이미지

porcokang wrote:

위에 말이 사실이라면 resolve.conf파일에 dns주소가 등록되어 있지않다면,
gethostbyname()나 gethostbyaddr() 함수가 제대로 동작하지 않는 다는 말인데요..

하지만 전 지금까지 resolve.conf파일에 dns주소를 쓰기위해 gethostbyaddr()를 사용하는 것으로 알고있었습니다.
도대체 어떻게 되는건지..

그렇다면 전화접속으로 동적으로 받아온 ip주소를 가지고 ISP의 네임서버주소를 어떻게 알 수 있나요??

네 resolv.conf에 dns가 등록되어있지 않아서, gethostbyaddr이 제대로 작동하지 않는게 맞습니다.

그리고 gethostbyaddr로 dns주소를 알아내는 방식은 resolv.conf에 접근할수없거나(싫거나^^) 한 경우에 사용하는 방식으로 알고 있습니다.

결론적으로 resolv.conf에 쓸 dns주소는 gethostbyaddr로 알수없습니다.

porcokang wrote:

하지만 저 파일이
/var/log/messages에 있는 내용인데.. DNS주소 부분만 읽어오기도 힘든거 같네요

그리고 보통 호스트네임으로 ip주소를 얻어내고 그 자신의 ip 주소로 DNS주소를 알아내는것 같습니다.
근데 잘 안되네요..ㅜㅜ

pppoe연결을 어떤 것으로 하는시는지 모르겠지만,
pppd가 가져온 dns 주소를 resolv.conf에 쓰는 방식을 모두 사용하며, 그것을 하는 방식에는 여러가지가 있습니다.

그리고, /var/log/messages의 있는 내용을 가져오는게 아니라, 각 연결방식마다 제공하는 방식이 있습니다.

pppd를 pppoe 플러그인을 포함해서 사용하는 경우에는 /etc/ppp/resolv.conf라는 파일에 ppp연결을 통해서 받아온 dns주소가 들어가더군요. 연결된뒤에 이 파일을 /etc/resolv.conf로 복사해서 쓰곤 했습니다.

사용하시는 pppoe또는 pppd에 연결하는 방식을 알려주시면, 좀더 자세한 도움을 드릴수 있을 것으로 생각됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.