소켓프로그래밍은 연결 프로토콜만 같으면 OS, 단말기 상관없이 연결이 가능하다고 배웠습니다.
책에서 각 챕터 소스코드를 리눅스 버클리 소켓환경과 윈속으로 나누어 설명하고있는데 두 OS끼리 연동해 보려고 공부하던 중 꼭 알아야할
중요한 IP설정 사항이 있길래 작성해봤습니다.
<한 컴퓨터로 가상 머신 속 OS와 윈도우 환경의 소켓(자바, 윈속, 파이썬 등) 연동 시 IP주소 확인하는 법>
버클리 소켓을 이용하는 경우라면 아마도 윈도우 환경에서 가상 머신을 이용해 우분투, 리눅스 등을 깔아서 사용하는 경우일 겁니다.
만약 서버와 클라이언트를 각각 다른 소켓 환경을 이용해 연동하는 작업을 할 때 IP주소를 어떻게 사용할까요?
간단한 서버-클라이언트 프로그램 코드에서 클라이언트에서 루프백주소(127.0.0.1)과 포트번호를 입력하면 서버와 클라이언트가 연결되지 않습니다.
왜 일까요? 127.0.0.1은 루프백 주소, 즉 사용중인 컴퓨터의 IP주소를 의미하는데, 가상 머신도 컴퓨터와 별개로 IP주소가 존재합니다.
가상 머신속 IP와 실제 컴퓨터 호스트의 IP주소는 다릅니다. 즉, 가상 머신을 하나의 새로운 컴퓨터로 보시는게 좋습니다.
그렇기 때문에 이렇게 다른 OS를 이용하는 소켓 인터페이스의 연동 시 IP주소를 직접 입력해야합니다.
가상 머신(리눅스, 유닉스, 우분투 를 사용한다는 가정)에서는 쉘 명령어로 IP주소를 확인 할 수 있습니다.
1. hostname -i(소문자) : 루프백 주소( 가상 머신 속 OS의 로컬 ip주소)=> 127.0.1.1
2. hostname -I(대문자) : 가상머신의 로컬 IP주소
로컬 주소는 실제 컴퓨터 IP와 다르기 때문에 서로다른 OS의 소켓인터페이스 연동 시 2번 주소를 이용해야합니다.
윈도우 환경에서 IP주소 확인은 cmd에서 ipconfig명령어로 쉽게 확인 할 수 있고 네이버로 치면 알 수 있습니다.
하지만, 실제 소켓 통신 때 사용할 윈도우 IP는 ipconfig를 입력해서 나온 IP중 아래 두 가지 만 사용가능합니다.
1. "이더넷 어뎁터 vmnet8"의 주소
2. 무선 lan어뎁터 와이파이 주소
그 외의 ip나 네이버의 내 ip주소 확인 검색 등의 결과로 나온 ip주소를 사용할 수 없습니다.
이더넷 어뎁터 vmnet8의 주소는 가상 머신속 환경과 연결 할 수 있는 IP이고, 무선 lan 어뎁터 와이파이 주소는 가상머신과 사용자 컴퓨터가 같은 와이파이에 연결되어있을 경우 사용가능합니다.
따라서, 서버-클라이언트 프로그램의 코드 작성 시 경우에 따라 IP주소를 아래와 같이 사용해야 합니다.
예)가상머신의 OS로 우분투를 사용한다는 가정
1. 서버: 버클리소켓, 클라이언트: 윈속 일 때
코드의 입력 IP: 가상 머신 속 ip주소
2. 서버: 윈속, 클라이언트: 버클리소켓 일 때
코드의 입력 IP: 사용자 컴퓨터 IP주소