고라니님 내부IP 테스트관련 질문이 있습니다. 영상기준 서버가 되는 PC의 내부 IP주소가 192.168.0.8 인데, 포트포워딩을 하지않고 같은 네트워크의 내부IP로 테스트한다고 가정했을 때 PC에서는 IP 192.168.0.8, 포트 7777번으로 서버를 열고, 모바일에서 IP주소 192.168.0.8 포트 7777번으로 접속 하면 같은 내부 네트워크이기 때문에 접속이 되야하는게 아닌가요? 위와같이 셋팅 후 테스트중인데 접속이 안됩니다... 내부 IP 테스트에도 포트포워딩이 필요한 것인지, 그렇다면 왜 그런 건지 궁금합니다!! 프로젝트는 고라니님의 프로젝트입니다.
tcp를 쓸때 맨앞에 패킷크기(byte수)를 보내지 않으면 나중에 문제가되는 부분이 생깁니다. tcp의 특성상 보낸크기보다 적게 짤려서오거나 많게 뭉쳐서 오는경우가 있는데, 크기값을 맨앞에 헤더로서 붙여서 쓰지않으면 위의경우 제대로된 패킷을 보기가 어려우니... 그래서 일반적으론 맨앞에 패킷 크기를 위치시키고 그뒤에 해당크기만큼의 데이터를 쓰고 보내고, 받을때는 맨처음 크기를 먼저 파싱해서 얼마만큼 더읽어와야하는지 기록후, 이후부터 그 읽어온 크기만큼만 딱 읽고, 다시 다음 패킷의 크기를 읽고 하는식으로 가야합니다 ㅇㅂㅇ udp의 경우에는 메시지지향 프로토콜이므로 항상 보낸길이만큼 데이터가 오므로 tcp처럼 크기별로 자를필요는 없어집니다
조금 궁금한 점이 있습니다. C# 문서랑 같이 읽으면서 두가지 경우를 생각했는데 어떤게 맞는건지 모르겠습니다. 1. Poll에서 1바이트를 보내고, 그걸 아랫줄의 Receive에서 그 정보를 읽고 bool값 반환 2. 1바이트 핑찍듯 보내서 확인한건 Poll 단에서 확인이 끝났고, 아랫줄의 Receive는 실제로 읽을 수 있는 데이터가 있는지 확인해서 오류상황 검출 둘 중에 옳게 이해한게 있을까요?
진짜 string format이랑 구글링 아무리해봐도 Clinet class의 OnInComingData(string data) 함수에서의 if(data == "%NAME")이랑 Send($"&NAME|{clientName}"); 에서 특수문자 %와 & 에 대한 의미를 잘모르겠습니다. 혹시 무슨의미인지물어봐도될까요? 아니면 관련document 알려주시면 감사드립니다 ㅠㅠㅠ
먼저 좋은 강의 내용 감사드립니다 :) 스크립트와 프로젝트를 보면서 따라해보고 있는데.. 제가 할때는 서버나 클라이언트에 있는 void update를 어디에도 참조하지 않고 있습니다.. 그래서 클라이언트 서버에 접속하는 것은 확인 할 수 있는데, 클라이언트를 종료하면 종료가 되었는지 확인이 되지 않습니다. update 함수를 어디에서 참조해야 할까요?
나날이 발전하시네요 TCP/UDP 통신을 직접 구현하시다니!
얼른 포톤 API를 뛰어넘는 GORANI 네트워크 API를 만들어주세요!
매우 많이 공부해야 할 것 같습니다.
어몽어스 서버 정하셨나요? 궁금합니다 ~
@@고라니TV Mirror로 만드는 중이에요 ㅎㅎ
고라니님 내부IP 테스트관련 질문이 있습니다.
영상기준 서버가 되는 PC의 내부 IP주소가 192.168.0.8 인데, 포트포워딩을 하지않고 같은 네트워크의 내부IP로 테스트한다고 가정했을 때
PC에서는 IP 192.168.0.8, 포트 7777번으로 서버를 열고, 모바일에서 IP주소 192.168.0.8 포트 7777번으로 접속 하면 같은 내부 네트워크이기 때문에 접속이 되야하는게 아닌가요?
위와같이 셋팅 후 테스트중인데 접속이 안됩니다...
내부 IP 테스트에도 포트포워딩이 필요한 것인지, 그렇다면 왜 그런 건지 궁금합니다!!
프로젝트는 고라니님의 프로젝트입니다.
영상기준 pc의 ip주소는 Tiger Fat님의 내부 ip와 다릅니다. cmd창에서 ipconfig 검색하면 IPv4주소가 내부 아이피입니다.
해외유투버 참고하다가 여기서도 통신을 다뤘네요. 덕분에 편하게 공부합니다~
감사합니다
고라니님 질문이 있는데요. 10미터 내의 스마트폰끼리 멀티를 할 수 있도록 하는게 저 TCP인가요? 스마트폰 1대가 방장(서버)이 되고 나머지가 접속하는 형태말입니다.
실시간 동기화받는 멀티라면 UDP를 쓸겁니다. UDP도 연구하고 있습니다 :)
Tcp서버의 클라이언트객체를 여러개를 만들어서 멀티쓰레드로 받아오는방법도있습니다
@@고라니TV 연구하시는거 기다릴게요 +.+
tcp를 쓸때 맨앞에 패킷크기(byte수)를 보내지 않으면 나중에 문제가되는 부분이 생깁니다.
tcp의 특성상 보낸크기보다 적게 짤려서오거나 많게 뭉쳐서 오는경우가 있는데,
크기값을 맨앞에 헤더로서 붙여서 쓰지않으면 위의경우 제대로된 패킷을 보기가 어려우니...
그래서 일반적으론 맨앞에 패킷 크기를 위치시키고 그뒤에 해당크기만큼의 데이터를 쓰고 보내고,
받을때는 맨처음 크기를 먼저 파싱해서 얼마만큼 더읽어와야하는지 기록후, 이후부터 그 읽어온 크기만큼만 딱 읽고,
다시 다음 패킷의 크기를 읽고 하는식으로 가야합니다 ㅇㅂㅇ
udp의 경우에는 메시지지향 프로토콜이므로
항상 보낸길이만큼 데이터가 오므로 tcp처럼 크기별로 자를필요는 없어집니다
와 그렇군요. 더 공부해서 코드에 수정을 가해야겠습니다.
정말 많은 도움이 되었어요! 와!!
아이피 주소를 일부러 가리신 거 같은데 18:11에 아이피가 보여요. 네트워크를 배웠는데 벌써 다 잊어버렸네요... 이래서 꾸준히 복습해 줘야 하는데 ㅠ...
앗.! 유튜브 편집기가 있어 다행히 재업로드 안하고 고칠 수 있군요. 가렸습니다
조금 궁금한 점이 있습니다.
C# 문서랑 같이 읽으면서 두가지 경우를 생각했는데 어떤게 맞는건지 모르겠습니다.
1. Poll에서 1바이트를 보내고, 그걸 아랫줄의 Receive에서 그 정보를 읽고 bool값 반환
2. 1바이트 핑찍듯 보내서 확인한건 Poll 단에서 확인이 끝났고, 아랫줄의 Receive는 실제로 읽을 수 있는 데이터가 있는지 확인해서 오류상황 검출
둘 중에 옳게 이해한게 있을까요?
if (c.Client.Poll(0, SelectMode.SelectRead))
return !(c.Client.Receive(new byte[1], SocketFlags.Peek) == 0); 이렇게 bool로 반환하는 거 같아요
진짜 string format이랑 구글링 아무리해봐도 Clinet class의 OnInComingData(string data) 함수에서의 if(data == "%NAME")이랑 Send($"&NAME|{clientName}"); 에서 특수문자 %와 & 에 대한 의미를 잘모르겠습니다. 혹시 무슨의미인지물어봐도될까요? 아니면 관련document 알려주시면 감사드립니다 ㅠㅠㅠ
저도 이 부분 알고싶어요 ㅠㅠ
구분하는 문자밖에 되지 않습니다. 들어오기전 이름과 나갈 이름을 정해주는 구분하는 기호입니다.
!^&!#^&NAME 이렇게써도 if로 구분만 하면 되니 문제될 건 없어요
정말 감사합니다! 공부하는 데 큰 도움이 됩니다. UDP로도 동일한 기능을 구현하고 싶은데, 참고할 만한 자료가 있을까요?
udp도 준비할게요
안녕하세요.
강의 너무 잘보았습니다.
혹시 안드로이드에서 서버를 열고, 클라이언트 바로 할려고하니,
Connection Refused 오류가 나는데,
이유를 알수있을까요
안드로이드에서 서버를 열고,
PC 에서 접속을 해도
(소켓에러 : 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다.
)
라는 에러가 나네요.. 혹시 원인을 알수있을까요?
포트포워딩 문제 같아요
@@고라니TV 포트포워딩 했는데도 납니다..
@@고라니TV 나름.. 맞는지 모르겠지만, 자답을해보자면, 안드로이드에서 서버를열면 로컬호스트가 아니라, 공유기에 붙는 아이피로 접근을해야 하더군요.
고라니님 저는 유니티(c#)와 자바서버를 이용해서 tcp 로 진행하고 싶은데,
자바 서버로 연결해서 진행하는 예제나 강의 등이 없던데..... 혹시 어떻게 공부를하고 진행해야할지 알려주실 수 있나요?
c# java server 이렇게 구글링을..
안녕하세요 고라니 님 덕분에 공부 하는데 큰 도움 받고 있습니다^^ 궁금한게 하나 있는데 테스트 도중 가끔 포트를 열수 없다고 하는 메시지가 나오는데 원인이 뭘지 궁금합니다^^
이미 포트가 열려있는경우에는 사용할수 없기에 큰 수 10000~60000을 사용해보세요
오 이것도 라이브 하시지...ㅠ 엄청 만들기 고민했었는데
오 프사 어울려요.!
네 그럼 UDP하면서 해볼게요.
코드에 질문있습니다. Server.cs에서 List disconnectList에서 변수 형태를 리스트로 하신 이유가 있나요? 코드 확장성을 위한건지 궁금합니다.
네 여러 클라이언트 대응입니다
@@고라니TV 그렇군요 감사합니당
혹시 왜 아이피는 연관이 없는 건가요 찾아 본 결과 아이피는 살고 있는 지역 아파트 이름 포트는 동 호수 라고 나와 있던데 어째서 IP는 다르고 포트 번호만 같으면 찾아 올 수 있는 건가요?
포트포워딩을 하여 외부 아이피로 접근하면 내부의 열린 포트로 들어오게 되는 원리입니다.!
다음은 UDP다!
먼저 좋은 강의 내용 감사드립니다 :) 스크립트와 프로젝트를 보면서 따라해보고 있는데.. 제가 할때는 서버나 클라이언트에 있는 void update를 어디에도 참조하지 않고 있습니다..
그래서 클라이언트 서버에 접속하는 것은 확인 할 수 있는데, 클라이언트를 종료하면 종료가 되었는지 확인이 되지 않습니다.
update 함수를 어디에서 참조해야 할까요?
Update는 유니티의 기본함수로 유니티가 자동으로 프레임당 호출합니다
굳굳
구웃
같은 LAN내에서 TCP를 사용할 때도 포트포워딩을 해야하나요? 다른 방법이 없을까요?
같은 LAN이라면 내부아이피로도 접근이 될거예요
이거 로컬호스트로만 되나요?
포트포워딩하면 누구든지 할 수 있습니다
mmo 게임 만들려고 하는데 포톤은 유지비가 많이 든다고 하더라구요 그래서 지인에게 여쭤보니 소켓 io를 추천 해주시던데 tcp나 udp랑 연관되어있는건가요?
대부분 편리한 네트워크는 tcp udp에서 살을 붙혀 만든 것입니다