127.0.0.0/8 에 소켓을 bind 시키는 방법이 있나요?
글쓴이: hansolo / 작성시간: 월, 2009/01/12 - 2:31오후
리눅스에서 C 로 소켓프로그래밍을 하고 있습니다.
127.0.0.0/8 에다가 소켓을 bind 시키는 방법이 있는지 궁금합니다.
즉, loopback 으로 들어오는 접속만 다 받겠다는 건데요..
inet_aton("127.0.0.0/8", &struct);
bind(..., struct, ...);
이런식으로 하면, bind 시킬때
Cannot assign requested address
라면서 안되네요.
혹은 저런방법이 아니더라도 loopback 으로 들어오는 접속을 IP를 가리지않고 (127.0.0.1 ~ 127.255.255.255 까지) 받아줄 수 있는 방법이 있을까요??
INADDR_ANY 로 bind 하는건 또다른 제약조건 때문에 불가능한 상황입니다.
도움을 부탁드립니다. (_ _)
Forums:
그냥 127.0.0.1로
그냥 127.0.0.1로 bind하면 되지 않을까 싶은데요.
제가
IP를 가리지 않는다는게 listener의 IP를 가리지 않는다는 뜻이었는데, 제가 좀 헷갈리게 질문을 썼나봅니다.
즉,
127.0.0.1 뿐만 아니라
127.0.0.2
127.0.0.3
...
127.100.100.100
...
뭐 이런식으로 127.x.x.x 로 들어오는 모든 연결을 하나의 프로세스가 받아주게 만들고 싶은 거거든요.
예를 들면 127.2.2.2 ->
예를 들면 127.2.2.2 -> 127.0.0.1, 127.2.2.2 -> 127.1.1.1 이런 식으로 연결하는 것을
모두 하나의 프로세스에서 받겠다는 것인가요?
이 문제는 단순히 bind 함수의 문제는 아닌 것으로 보입니다.
lo라는 인터페이스가 127.0.0.1로 세팅되어있기 때문에
127.1.1.1으로 오는 연결을 받을 수 있을지 의문입니다.
두 세개 정도는 lo:0, lo:1 등을 만들어서 가능하겠지만
lo:0, lo:1, lo:2, ... lo:10000 이렇게 인터페이스를 만들 수는 없는 노릇이니까요.
게다가 클라이언트가 127.2.2.2가 되며면 클라이언트용 인터페이스도 만들어야 할거고 =_=
실험을 해
실험을 해 보았습니다.
실험 1
---------------
이런식으로 bind 해서 데몬을 띄우고요, netstat 로 확인해 보면
이런식으로 떠 있습니다.
여기다가 붙여보면,
이렇게 잘 연결이 되거든요..
실험2
--------------
bind 시에 넘겨주는 파라미터의 sockaddr 구조체에 INADDR_ANY 로 세팅해서 bind 시키면,
인터넷IP 와 127.x.x.x 모두 잘 연결이 되거든요..
그래서 각각 내린 결론(?)이
실험1 : 별도의 디바이스가 없어도 127.x.x.x 의 주소와 포트로 소켓을 열고 바인딩 할 수 있으며, 해당 호스트에서 연결이 가능하다.
실험2 : bind 시에 하나의 주소 뿐만 아니라 여러개의 주소를 같이 바인딩 하여, 다양한 destination address 를 가진 연결을 하나의 프로세스가 받아줄 수 있다.
라고 생각했습니다.
이 두개를 바탕으로, 제가 원하던 기능인
127.x.x.x 를 목적지로 하는 연결을 받아주는 데몬도 가능하지 않을까 하는 생각을 했던 겁니다.
(INADDR_ANY 같은 일종의 와일드카드 어드레스 를 생각한 것이지요.. INADDR_127S 같은.. ㅎㅎ;)
여기까지가 제 생각이었고요..
헌데 쓰다보니, 왠지 어려울것 같다는 느낌이 드네요.. INADDR_ANY 로 주면 0.0.0.0 으로 bind 되는데, 이건 low레벨 에서 따로 처리로직이 있는 와일드카드 어드레스니까 가능한거지, 제가 생각하는 것 처럼 마음대로 range 를 잡아서 할 수 있을것 같지는 않다는 생각이 좀 들기도 하네요.. ㅜ_ㅜ)
lo가 127.0.0.1인데
lo가 127.0.0.1인데 127.2.2.2에 bind할 수 있다는 사실은 처음 알았네요 :)
그럼에도 불구하고 원하는 것은 힘들 것 같습니다.
bind에는 INADDR_ANY와 특정 ip 이외에 다른 것은 본 일이 없는 것 같네요
그 range 를 꼭 bind
그 range 를 꼭 bind 에만 적용할 필요는 없지 않을까 합니다.
0.0.0.0 으로 bind 해 놓고 user level 에서 source ip 를 체킹하면 상관이 없지 않을까 합니다만은....
127.x 를 사용하고자 하신다니.. 좀 특이한 걸 하시나보네요 ㅡ.ㅡ;;;
loopback 디바이스를 사용하는 경우는 LVS 에서 arp 문제 외에는 없었던 것 같거든요.
댓글 달기