소켓 프로그래밍 공부 중에 서버컴퓨터의 ip 문제가 발생했습니다.도와주세요.
글쓴이: mmx822 / 작성시간: 수, 2013/09/11 - 2:50오전
저는 일단 TCP/IP 소켓 통신 프로그래밍을 공부중에 있으며,
서버는 C언어로 짰고, 클라이언트의 경우는 안드로이드에서 돌아가도록 했습니다.
제가 처음에 집에있는 유선인터넷으로 실험해봤을 때는 아주 통신이 잘되었습니다.
헌데, 서버의 아이피를 wifi나 집안의 ip tv 무선공유기를 통해서 받은 아이피를 썼더니 통신이 전혀되질 않는겁니다.
제가 그래서 이게 왜 이런가 하고 많은 검색을 해본 결과, 서버 pc의 경우 공인 ip 가 아니면 서버의 역할이 불가능 하다고 하더군요.
제가 지금 공부중인 것을 학교의 교수님께 보여줘야하는데, 학교에는 U+ 나 학교 AP 무선통신 밖에 이용할 수가 없고, 학교의 실습실 유선아이피 또한 죄다 사설아이피라서 통신이 불가능합니다...
그래서 지금 KLDP 프로그래머님들의 도움이 필요합니다.
과연 이런 와이파이 환경에서도 서버가 제 구실을 할 수 있도록 하는 방법이 없을까요??
Forums:
안될것은 없습니다.
서버와 클라이언트가 같은 네트워크 안에 있으면 됩니다. 즉 서버도 사설IP, 그리고 클라이언트도 같은 네트워크 안의 사설 IP면 통신이 가능합니다. 학교 데모 정도면 충분히 가능한 얘기죠.
즉 안드로이드가 클라이언트라면 휴대폰망을 쓰시면 안되고 서버와 같은 네트워크에 묶이도록 설정해줘야 한다는 거지요. 학교에 무선 AP가 있을테고.. 혹시라도 유선망과 무선망이 분리되어있어 서로 통신이 불가능하다면 그냥 서버도 와이파이로 물리면 됩니다.
--
집에서 테스트를 할 때도 같은 와이파이를 사용했더니 되질 않는데요 ㅜ
서버는 C로 코딩, 클라이언트는 자바 안드로이드로 코딩 되어있는데요.
서버도 같은 wifi, 클라이언트인 스마트폰도 같은 wifi를 사용했지만 통신이 되질 않네요... accept에서 넘어가질 않네요.
학교도 도서관의 ap에서만 되고, 학교의 저희 컴퓨터과 ap나 U+존의 WIFI를 똑같이 사용했을 때는 또 되질 않구요..
혹시나해서 서버와 클라이어언트 둘다 C로 작성했더니 이때는 또 잘 됩니다.
또 하나 덧붙이자면, 클라이언트를 AVD(안드로이드 가상 머신) 으로 돌릴 때는 또 잘됩니다. 어떤 IP에서든요...
하지만, 스마트폰으로 직접했더니 통신이 되질 않는겁니다. 어디에서 문제가 있는걸까요? ㅜ
그렇다면 안드로이드로 작성에 있어서 잘못 된 것 같은데요. 클라이언트의 코딩을 조금 올려드려볼까요?
공유기 설정 문제일지도..
자세한 설정을 봐야 알수있겠습니다만 집에서도 안 된다면 공유기 설정에 문제가 있는 것 같네요.
학교에서는 안된다 해도 이상할 것은 없는데 (특정 포트를 막는다든지, 단말기 종류별로 다른 정책을 적용하는 등의 작업이 가능함) 집에서도 안된다면 이상합니다.
셀룰러 네트워크는 아예 끈 상태에서 와이파이만 연결한뒤 폰에서 인터넷이 잘 되는지 확인해보세요. 또한 서버와 단말기가 동일한 서브넷하의 IP를 받아왔는지도 확인해보시고요.
일단 집에서만 잘 되면 그 공유기를 그냥 들고 가서 연결하면 되기 때문에 데모용으로 손색이 없겠습니다.
아, 작성하신 모바일 프로그램의 통신부분이 제대로 동작하는지 확인해보시려면.. 그냥 아무 웹 서버에나 접속해서 데이터를 받아오게 해보시면 됩니다. 80번 포트로 접속한뒤 GET을 날려보시면 되지요.
--
답변 감사합니다.
일단 저희 집의 공유기의 경우, iptv에 연결된 sk브로드밴드 무선공유기에 것을 따서 쓰고 있습니다.
아마 제 생각에는 sk브로드밴드의 iptv에서 따온 ip 라서 뭔가 막아 놓은거 같기도합니다.
아참 그리고 이 부분은 어떻게 생각하십니까? 위에서 언급한 AVD(android virtual machine)를 통한 통신은 어디서 하던 잘되는데 이 부분은 어떻게 설명이 가능할까요??
그리고 서버와 단말기가 동일한 서브넷하의 ip를 받아온 것은 틀림이 없구요.
그리고 마지막에 말씀하신 부분은 어떻게 해야하는지 잘 모르겠는데 좀 더 자세한 설명 부탁 드려도 될까요??
일단 같은 공유기 안에 물려있는 것이면
같은 서브넷 안에서 이루어지는 동작이기 때문에 SK브로드밴드하고는 아무런 관련이 없습니다. 즉, 공유기의 WAN단자를 떼어버려도 상관이 없다는 얘기죠.
그리고 AVD는 버추얼 머신이라서 그 바깥의 통신은 PC를 통해서 이루어집니다. 따라서 스마트폰을 감지해서 뭔가 포트를 막도록 설정돼있다 해도 저 버추얼 머신에는 영향을 미치기 어렵죠.
마찬가지 이유로, 스마트폰 자체 설정이 잘못되었든지 해도 일어날 수 있는 일이겠네요. AVD와 사용하시는 스마트폰이 완전히 동일한 배경으로 동작할수는 없으니까요.
마지막 얘기는 별것은 아니고 서버 클라이언트를 모두 직접 작성한걸로 테스트하지 말고 어느 한 쪽은 검증된 것을 사용해보시란 뜻이었습니다. 외부에 공개된 웹서버는 동작이 보장된 것이니 테스트 서버로 사용하기에 손색이 없지요.. http통신은 TCP 80번 포트를 사용하며 연결 후 GET(엔터)을 날리면 홈페이지의 내용을 클라이언트쪽으로 뿌려주고 서버쪽에서 접속을 끊게 됩니다. 따라서 이게 그대로 받아진다면 사용한 TCP 연결부에 문제가 없다는 뜻이죠. 뭔가 동작이 확실히 보장된 (본인이 만든게 아닌) 서버를 가지고 있다면 그걸로 테스트해보셔도 무방합니다.
--
도서관의 ap에선 또 됩니다
도서관의 ap를 갖고 서버와 클라이언트를 돌렸더니 이건 또 되는데요
이를 봐선 클라이언트의 작성이 잘못되었다고하기엔 힘들어보이는데
정말 다른 이유는 없는걸까요?
설정상의 차이가 있을겁니다.
확신할 순 없지만 동작이 되는 공유기와 그렇지 않은 공유기 사이에 설정상의 차이가 있을겁니다. 가령 할당받는 IP대역이라든지, 인증방법, 무선 채널 등등등..
시간이 좀 있으시면 그런것들을 일일이 비교해서 원인을 찾아볼 수 있겠고
그렇지 않다면 그냥 도서관 AP를 데모에 이용하시면 될것 같네요.
--
몇가지 방법이 있습니다.
서버와 안드로이드가 통신이 가능하기만 하면 됩니다.
통신 방식을 선택하면...
//무선 주파수 직접 통신 : Bluetooth
서버 무선 송수신기 - 안드로이드 무선 송수신기
//무선 주파수 간접 통신 : WiFi (DHCP.VPN.포트포워딩.UPNP 설정)
서버 유선 송수신기 - 유무선 공유기(AP) - 안드로이드 무선 송수신기
//유무선 주파수 통신 : WiFi
서버 유선 송수신기 - 유무선 공유기(AP) - 안드로이드 무선 송수신기
//적외선 직접 통신 : 리모콘
서버 적외선 송수신기 - 안드로이드 적외선 송수신기
//케이블 직접 통신
서버 케이블 (시리얼 포트. 패러럴 포트) - 안드로이드 케이블 컨버터.
//윈도우 가상 통신
서버를 실행 합니다. - 안드로이드 에뮬레이터로 통신합니다.
//리눅스 가상 통신
서버에 가상화 프로그램(VM Ware. VirtualBox. Virtual PC)을 설치 합니다.
서버 송수신 - 가상화 프로그램 송수신
틀린 내용도 있을 수 있으니. 참고만 해보세요.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변감사드립니다.
헌데. 올려주신 내용이 잘 이해가 되질 않네요 ㅜ
좀 더 자세한 설명 가능할까요??
정리하자면 서버-유선-공유기-무선-클라이언트
정리하자면
서버-유선-공유기-무선-클라이언트
이렇게 연결된 경우는 되는데
서버-무선-공유기-무선-클라이언트
이게 안된다는건가요?
일단 서버가 유선으로 쓸 때의 공유기에 진짜로 연결된건지 확인해 보세요
서버-무선-공유기1
공유기2-무선-클라이언트
이런식으로 되어 있으면 당연히 안됩니다.
서버-인터넷망 유선
인터넷망 무선(인터넷 되는 wifi, 3G, LTE 등)-클라이언트
만약 잘 된다던 경우가 이 경우라면, 클라이언트에서 외부망을 거쳐서 서버로 들어가므로 잘 됩니다
서버-공유기-인터넷망
인터넷-클라이언트
이런식이라면 공유기에서 외부 접속을 기본적으로 차단하므로 안될 수 있습니다. 공유기에서 포트포워딩 기능을 사용하세요.
C로 했을때 되는데 자바로 하니까 안된다면, 둘 사이에 뭔가 코드가 다른 것일수도 있고요
클라이언트를 AVD로 쓸 때 된다면, AVD가 설치된 컴퓨터와 서버 컴퓨터를 학교와 집에 두고 실험해본다거나 해서 연결을 시험해 볼 수 있겠죠.
피할 수 있을때 즐겨라! http://melotopia.net/b
제가 쓰는 공유기는 sk 브로드밴드 공유기입니다
그래서 인터넷검색을통해 sk브로드밴드 포트포워딩방법을 찾아해봤으나 실패하였습니다
너무나 답답한 심정입니다ㅠ
자바의경우 소켓 클래스의 생성만으로도 아이피와 포트만 맞다면 접속이 되야되는데 이게 안되니까요ㅠ
그래도모르니 코드의 일부를 공개해볼까요?
인터넷 회사에서 안되게 막아놨으면 회사를 바꾸셔야죠.
인터넷 회사에서 안되게 막아놨으면 회사를 바꾸셔야죠.
피할 수 있을때 즐겨라! http://melotopia.net/b
도서관 ap에선 또 잘 됩니다
도서관 ap로 서버와 클라이언트를 돌렸더니 잘 됩니다
이소리는 코드엔 별 문제가 없다는게되는게 아닐까요?
어떻게 해결해야할까요?
어느 한 환경에서 잘 된다고 코드에 문제가 없다고 단정할 순 없습니다.
그냥 그 환경에선 동작이 된다. 까지만 보증이 된 것이죠. 소스에 문제가 없다고 단정할수는 없습니다. 물론 일반적인 경우 코드가 아닌 환경 설정 문제일 확률이 높긴 하지만 단정은 무리.
--
댓글 달기