묻고 답해요
137만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨외워서 끝내는 네트워크 핵심이론 - 기초
L2 스위치(L2 Access와 L2 Distribution)
안녕하세요? 항상 좋은 강의 감사드립니다. L2 스위치는 L2 Access와 L2 Distribution이 있는데 이들은 같은 네트워크인가요? 즉, IP 주소에서 network id는 같은건가요?네트워크가 처음이고 많은 개념이 들어오니 막 헷갈리네요ㅠ
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 분산 처리 에 대해서는 혹시 다룰 예정이 없으신가요?
게임서버만 제작하셨는데 DB 서버나 채널 등등 scale-up 관련으로 혹시 다룰 생각 없으신가요? 그리고 다른 질문에서 "나머지 MMO 컨텐츠는 추후 실전 부트캠프 강의에서나 다룰 생각입니다."이렇게 대답해주신거를 들었는데 부트캠프 강의 일정은 혹시 언제쯤 가능할지 알수 있을까요?끝으로 좋은강의 너무 감사합니다 다른 강의도 너무 잘듣고 있습니다.,
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
10강 내용에 대해서 질문드립니다.
안녕하세요 이득우님.이전에 다른분이 남겨주신 내용과 위치가 같은데요,380번째줄, void AABCharacterPlayer::ServerRPCAttack_Implementation(float AttackStartTime) 함수에 대한 질문이 있습니다. 수업을 위해서 401번째줄에 if(!PlayerController->IsLocalController()) 조건문을 넣어주신것 같아보이긴 하는데, 사실 엄밀하게는, 이 조건문은 아예 없어도 전혀 문제되지 않는 로직이라고 생각되는데 제가 잘못 생각한걸까요? 좀 찝찝하기도 해서, 혹시 제가 놓친게 있나 싶어서 질문 남깁니다. 위 조건문이 없어도 되는 이유는, 해당 로직이 있는 곳은 클라이언트에서는 절대 동작할 수 없는 Server RPC 함수 내부 코드이며, 그렇기 때문에 서버에서만 동작하는 상태가 보장되고, 추가로 서버에 있는 모든 PlayerController는 서버 클라이언트 서버 모델에서 항상 IsLocalController가 false가 되기 때문이라고 생각하였습니다.다른분의 질문에서 올려주신 IsLocalController 함수는 AController의 함수로 올려주셨는데, 저희가 사용하는 Controller는 현재 형변환에 의해 PlayerController이고, 언리얼에서 함수 호출을 살펴보면, PlayerController의 IsLocalController이 호출되는것 같습니다. 그래서 위의 로직에서if (NetMode == NM_DedicatedServer)return false;에 의해 false가 항상 반환될거 같은데, 혹시 제가 놓친 부분이 있을까요?=> 혼자 고민을 이것저것 해보고 테스트 해보면서, 아마도 이렇게 해주신 이유는 Listen 서버이기 때문에 그런것 같네요. 리슨서버에서는 리슨서버의 PlayerController가 bIsLocalPlayerController가 true가 나오더군요. 그럼에도 불구하고, 일반적으로 데디케이티드 서버 환경에서는 리슨서버를 생각하지 않기 때문에 위 조건문은 필요없을것으로 생각됩니다. 게임 환경을 Client로 바꿔서 사용하였을때를 생각해보았습니다. 그리고 추가로 질문이 하나 더 있습니다.강의에서 Multicast 방식을 각각의 Controller에 대해 Client RPC를 사용해주면서 네트워크 최적화를 설명하신것에 대해서, 저는 이 부분을 멀티캐스트 하나를 사용하는것과 월드 내에 모든 클라이언트에 해당하는 Controller에게 직접 Client RPC를 직접 각각 호출해주는게 좀더 네트워크 성능상 좋다, 라고 이해했는데, 이 부분은 제가 올바르게 이해한게 맞을까요? 언제나 좋은 강의 해주시고, 질문도 꼼꼼하게 달아주셔서 감사드립니다(_ _)
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
무상태 프로토콜 을 제대로 이해한건지 모르겠습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]Stateless 의 대표적인 예 는 쿠키 이며 Stateful 의 대표적인 예는 세션 이라고 이해를 했습니다. 그렇다고 한다면 여기서 궁금증이 생깁니다. HTTP 는 기본적으로 stateless 이며 HTTP 요청은 이전 요청과 상관없이 독립적으로 처리되는데 HTTP 는 통신 프로토콜 중 하나가 아닌가요?세션 또한 서버와 통신을 해야 데이터를 받아 오고 HTTP 통신을 통해 데이터를 받아올 텐데 세션의 정의가 뭔가 모호해진거 같습니다.
-
해결됨인프라공방 - 그럴듯한 서비스 만들기
brainbackdoor-management
brainbackdoor-management는 라우팅 테이블을 public-rt에 연결해야하나요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라의 패킷 조작 방어(범위 내일 때)
루키스님 안녕하세요?본 강의 17:00분대에this.playerId = BitConverter.ToInt64(new ReadOnlySpan<byte>(s.Array, s.Offset + count, s.Count - count));로 범위를 초과하는 패킷에 대해서 클라의 패킷 조작을 방어하는 예시를 들어주셨습니다. 저는 여기서 궁금한게, 클라의 패킷 조작 중 범위를 벗어나지 않는 패킷 공격은 어떤 아이디어로 방어를 할지 궁금합니다. 예를 들어 보스의 체력을 10000 -> 1로 조작한 패킷 같은 경우 아이디어가 궁금합니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
Cache-Control: no-cache 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.강의를 듣다가 Cache-Control: no-cache 관련한 질문이 있어서 질문 드립니다.만약에 데이터를 요청할 때 캐시 유효시간이 남았다면 서버와의 네트워크 통신이나 요청메시지, 응답메시지 없이 브라우저 캐시 저장소에서 데이터를 가져오는 게 맞나요?1번이 맞다면 Cache-Control: no-cache 를 하면 캐시 유효시간이 남아 서버와의 통신이 필요 없는데도 불구하고 원 서버와의 통신을 통해 검증한다고 이해하면 될까요??클라이언트가 원 서버에 검증하고 사용하기 위해서 Cache-Control: no-cache를 요청 메시지에서 사용하는 건가요? 아니면 클라이언트에게 원 서버와의 검증을 강제(?)하기 위해서 서버의 응답 메시지에서 사용하는 건가요??
-
미해결[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
온라인 환경에서 Arrow, 제거와 발사 시 동기화 문제
안녕하세요 Rookis님.강의를 모두 완강하고 포트폴리오를 개선하고 있는 중입니다.강의 중에 화살을 온라인에 추가할 것이라면 Creature와 GameObject 내용을 수정해야 한다고 하셔서 코드 이사는 완료한 상태입니다.지금 Arrow는 MyPlayer에서 입력을 받고 State와 WeaponType을 체크하면 Player에서 Scene에 Arrow를 스폰해주는 방식으로 알고 있습니다.이걸 서버에서는 몬스터나 플레이어를 만드는 GameObject::Create 함수를 파줘서 Arrow를 make_shared로 만들어서 발사 처리를 하게 만들었는데요서버에서 몬스터가 제거되면 클라이언트에서도 정상적으로 몬스터가 제거되는걸 확인은 했습니다.그러나 문제가 몇 가지 있습니다.Arrow 스마트 포인터가 해제되지 않는 현상Arrow 동기화가 종종 씹히는 현상입니다. 먼저 1번입니다.make_shared로 생성된 Arrow가 해제되지 않음void Player::UpdateSkill() { if (room == nullptr) return; if (info.weapontype() == Protocol::WEAPON_TYPE_SWORD) { // 내 앞에 있는 좌표 CreatureRef creature = room->GetCreatureAt(GetFrontCellPos()); if (creature) { if (creature->GetType() == Protocol::OBJECT_TYPE_PLAYER) { SetState(IDLE); return; } // 몬스터가 플레이어에게 피격 creature->OnDamaged(shared_from_this()); } } else if (info.weapontype() == Protocol::WEAPON_TYPE_BOW) { ArrowRef arrow = CreateArrow(); arrow->SetDir(GetLookAtDir(GetFrontCellPos())); arrow->SetOwner(shared_from_this()); arrow->room = room; arrow->info.set_posx(info.posx()); arrow->info.set_posy(info.posy()); arrow->SetState(IDLE, true); room->AddObject(arrow); } SetState(IDLE); }서버쪽의 UpdateSkill 함수인데 여기에서 arrow를 CreateArrow로 만들어서 room에 AddObject로 _arrows map을 만들어 관리를 하고 있습니다. (사실 룸에서 발사체를 관리하는 것이 옳은지도 의문이긴 합니다)void GameRoom::Update() { for (auto& item : _players) { item.second->Update(); } for (auto& item : _monsters) { item.second->Update(); } for (auto& item : _arrows) { item.second->Tick(); } }그리고 Update 함수, AddObject, RemoveObject도 _arrows map을 처리하게 만들었습니다.이렇게 처리하다 보니 화살을 제거할 때 몬스터가 피격받는 순간에 해당 화살을 RemoveObject를 실행하니 삭제 이후에 for문을 돌 때 오류가 발생하며 크래시가 발생했습니다.Arrow가 _arrows 맵에서 관리되어서 스마트 포인터가 해제가 안되는 것 같은데, 화살을 어떤 때에서 제거해야 될지 모르겠습니다.지금은 임시적으로 vector에 참조로 받아와서 Update 하단에서 erase하는 방법을 사용하고 있습니다. 화살 동기화 문제 클라이언트에서는 Projectile 클래스에서 _owner에 대한 정보를 들고 있고 Arrow를 Scene에서 소환할 때 GetOwner 함수로 화살의 주인에 대한 포인터를 들고 있도록 했습니다.기존에 발사할 때도 S_Move 패킷을 그대로 이용해서 Arrow의 _owner 포인터를 이용해서 위치를 초기화해주고 있습니다.그런데 두 클라이언트를 접속시켜서 2를 눌러 WeaponType을 Bow로 바꿔서 공격 키로 테스트해보면 종종 반대쪽 플레이어의 화살이 안보이는 경우가 있습니다.여기에 몇 개의 질문이 있는데요1) 화살을 생성하고 클라이언트에서 패킷을 전송하는 것이 맞는지2) 맞다면 어떤 정보를 패킷에 담아야 하는지3) 서버에서는 어떤 처리를 해주어야 하는지잘 모르겠습니다.일단은 Make, Handle 함수를 파서 ObjectInfo를 넣어놓긴 했습니다.하루 종일 코드를 조작해봐도 해결을 못하고 있습니다.. 도와주세요..
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강기간 연장 부탁드립니다.
수강기간 연장 부탁드립니다. 시간이 너무빠르네요..ㅜ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 7:42 에 해당하는 내용에 대해서 질문입니다
안녕하세요. 강의 7:42 부분에 대해서 질문이 있습니다.말씀해주신 내용처럼 _popCount 가 1인지 체크하고 oldHead를 delete 하는 사이에 다른 쓰레드에서 TryPop() 함수를 참조하게 되는 상황이 헷갈리는데요. 만약 1번 쓰레드가 TryDelete 함수 내부에서 oldHead를 delete 했는데, 2번 쓰레드가 compare_exchange_weak 함수를 콜하게 된다면 이미 지워버린 oldHead 에 대해서 참조를 하게되는 상황이 문제가 될 듯 하여 질문드립니다.
-
미해결AWS Certified Solutions Architect - Associate 자격증 준비하기
수강 기간 연장 요청드립니다.
회사 업무와 병행 하다 보니 시간이 부족한 것 같습니다..!죄송하지만 기간 연장 부탁 드리겠습니다..!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티 스레드 환경에서의 캐시 효율
멀티 스레드 환경에서 A,B 2개의 쓰레드가 있다고 가정했을때프로세스에서 어떤 전역 Data number를 +1 해달라는 주문이 들어 왔을때 A쓰레드에서 해당 주문을 받고 동시에 B도 해당 주문을 받는다면 문제가 되기때문에 동기화를 해줘야한다고 말씀 주셨는데요 그렇게 되면 A가 주문을 받고 다시 Ram에 동기화 그다음 B가 주문을 받고 Ram에서 수정된 값을 가져와서 다시 Ram에 동기화 이런식이라면 멀티 쓰레드 환경에서는 캐시의 의미가 없는건가요?캐시라는게 결국엔 프로세서와 Ram간의 거리가 멀기 때문에 이걸 완하해주는게 캐시로 알고 있는데 멀티 환경에서 주문이 들어올때마다 Ram에서 최신화 정보 가져오고 다시 동기화 한다면 캐시의 의미가 없어지는게 아닌가 해서 이렇게 질문 남기게 됩니다
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
Http persistent comnection 관련 문의드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 좋은 강의 잘보고 있습니다 다름이아니라 http 지속연결 관련해서 문의드립니다 만약 main 페이지 띄워질때 html js css 를 다응답 받고 화면에 다 뿌려지고 나면 웹 socket라이브러리에서 연결을 close 하나요 아니면 그냥 계속 연결 시켜놓나요 ?? 만약 자동 Close 하면 ajax나 새로운 페이지 호출을 하면 그때또 tcp/ip 3way handshake를 또 하나요 ? 아니면 지속 연결 되있어서 그냥 ajax 및 새 링크 연결되어도 계속 요청 응답만 하나요 ?? 지속 연결 이라고 하셔서 헷갈리네요 ㅠㅠ close 는 하는건지 안하는건지 궁금하네요... 감사합나다
-
해결됨AWS Certified Solutions Architect - Associate 자격증 준비하기
수강 연장 부탁드립니다.
안녕하세요.강의 구매 후 이직 시기가 겹치면서 수강을 많이 못했는데, 수강 연장을 부탁드릴 수 있을까요?
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
영속쿠키: 로그아웃 vs 브라우저 닫기
안녕하세요, 김영한 강사님이해한 내용이 맞는지 확인부탁드립니다 ㅎㅎㅎ 만약에 만료날짜를 대충 1년뒤 2024년 12/22 이라고 정해놓은 영속쿠키를 설정한다면 브라우저를 꺼도 1년동안 자동로그인이 된 상태로 유지되는 원리인가요? 그런데 영속쿠키를 설정해놓았더라도 브라우저를 끄는것이 아닌 로그아웃을 누르게 되면 서버측으로 "로그아웃 요청"을 직접적으로 한것이라 서버측에서는 쿠키 max-age 같은 설정을 0으로 초기화하여 로그인이 풀릴수 있는것이죠? 즉, 영속쿠키는 아무리 만료날짜까지 쿠키가 삭제되지 않는다해도 그 날짜 사이에 로그아웃을 하면 로그인이 풀리는것이죠?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
언리얼엔진과 IOCP 서버 연동시
서버에서 언리얼엔진의 네비메시나 비헤이비어트리 같은건 사용을 할 수 없나요?아니면 언리얼엔진 내부 코드를 분석하고 뜯어와서 C++서버에 이식을 하는건가요?
-
해결됨네트워크, 그림으로 이해하자
TCP 흐름 제어에서 슬라이딩 윈도우 기법 질문
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.슬라이딩 윈도우 기법에 대해 몇 가지 질문 드리고자 합니다.A의 윈도우 크기 250은 B의 윈도우 크기가 250이여서 맞춰져서 그런 건가요? 아니면 그냥 가정으로 250이라고 한 건가요?확인 응답이 ACK 101인 이유는 100 byte 데이터 크기를 보냈기 때문에 이에 +1 값을 보낸 것이라 이해하면 될까요?A에서 보낸 데이터 50 바이트를 B가 버퍼에 저장하고, 어플리케이션 프로세스에서 50바이트를 처리했다고 했는데, 이는 A로부터 마지막으로 받은 데이터를 사용된 게 아닌 그보다 먼저 버퍼에 저장된 데이터를 사용했다고 이해하면 될까요?어플리케이션 프로세스가 사용했다고 말씀하신 후 윈도우 크기가 이동되었는데, 좌측 경계선은 저장되면 왼쪽에서 오른쪽으로 이동되고, 데이터가 사용되어 오른쪽 경계선이 오른쪽으로 갔다고 이해하면 될까요? 그리고, TCP 혼잡 제어 파트에서 오타가 있습니다. 0:36 시간대에 '이를 통하여 혼자 회피를 합니다' 라고 나와있는데 제가 이해한 바로는 '혼잡 회피'인 것 같은데 맞나요?
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
안녕하세요, 혹시 GameAbilitySystem 강의는 시기가 언제쯤 업로드 되는지 여쭤봅니다
제목과 같습니다.
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
Insight를 사용하려고 하는데 오버플로우가 납니다..
- Live중인 것을 더블클릭하면 - 이 창이 뜨고 가만히 멈춥니다.(클릭도 안되고 닫기도 안됩니다) 그러다가 크래쉬가 납니다. 에러 내용입니다.. (스택오버플로우 입니다..)UnrealInsights_Slate!_chkstk()UnrealInsights_Slate!SScrollBar::Construct()UnrealInsights_Slate!STableViewBase::ConstructChildren()UnrealInsights_TraceInsights!SListView<TSharedPtr<SPacketContentView::FAggregationModeItem,1> >::Construct()UnrealInsights_TraceInsights!SComboBox<TSharedPtr<SPacketContentView::FAggregationModeItem,1> >::Construct()UnrealInsights_TraceInsights!TSlateDecl<SComboBox<TSharedPtr<SPacketContentView::FAggregationModeItem,1> >,RequiredArgs::T0RequiredArgs>::operator<<=()UnrealInsights_TraceInsights!SPacketContentView::CreateAggregationModeComboBox()UnrealInsights_TraceInsights!SPacketContentView::Construct()UnrealInsights_TraceInsights!TSlateDecl<SPacketContentView,RequiredArgs::T1RequiredArgs<TSharedRef<SNetworkingProfilerWindow,1> && __ptr64> >::operator<<=()UnrealInsights_TraceInsights!SNetworkingProfilerWindow::SpawnTab_PacketContentView()UnrealInsights_TraceInsights!TBaseRawMethodDelegateInstance<0,SNetworkingProfilerWindow,TSharedRef<SDockTab,1> cdecl(FSpawnTabArgs const & ptr64),FDefaultDelegateUserPolicy>::Execute()UnrealInsights_Slate!FTabManager::SpawnTab()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreArea()UnrealInsights_Slate!FTabManager::RestoreFrom()UnrealInsights_TraceInsights!Insights::SMajorTabWindow::Construct()UnrealInsights_TraceInsights!SNetworkingProfilerWindow::Construct()UnrealInsights_TraceInsights!TSlateDecl<SNetworkingProfilerWindow,RequiredArgs::T2RequiredArgs<TSharedRef<SDockTab,1> const & ptr64,TSharedPtr<SWindow,1> const & ptr64> >::operator<<=()UnrealInsights_TraceInsights!FNetworkingProfilerManager::SpawnTab()UnrealInsights_TraceInsights!TBaseRawMethodDelegateInstance<0,FNetworkingProfilerManager,TSharedRef<SDockTab,1> cdecl(FSpawnTabArgs const & ptr64),FDefaultDelegateUserPolicy>::Execute()UnrealInsights_Slate!FTabManager::SpawnTab()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreArea()UnrealInsights_Slate!FTabManager::RestoreFrom()UnrealInsights_TraceInsights!Insights::SMajorTabWindow::Construct()UnrealInsights_TraceInsights!SNetworkingProfilerWindow::Construct()UnrealInsights_TraceInsights!TSlateDecl<SNetworkingProfilerWindow,RequiredArgs::T2RequiredArgs<TSharedRef<SDockTab,1> const & ptr64,TSharedPtr<SWindow,1> const & ptr64> >::operator<<=()UnrealInsights_TraceInsights!FNetworkingProfilerManager::SpawnTab()UnrealInsights_TraceInsights!TBaseRawMethodDelegateInstance<0,FNetworkingProfilerManager,TSharedRef<SDockTab,1> cdecl(FSpawnTabArgs const & ptr64),FDefaultDelegateUserPolicy>::Execute()UnrealInsights_Slate!FTabManager::SpawnTab()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreArea()UnrealInsights_Slate!FTabManager::RestoreFrom() 실행한 배치파일 인데요.. -NetTrace=1 이부분을 지우면 실행시켜도 에러는 뜨지 않지만 , Networking Insights 창이 안뜹니다... 또, 이것 때문인지는 모르겠지만, Connect버튼을 누르면 Error 메서지가 하나 뜹니다..LogTrace: Error: ReadError While reading remote command. Read returned 0:' 또 신기한 것은 처음에 실행을 했을 때는 Networking Insights가 잘 실행이 됐었습니다.. 2번째부터 실행하려니까 스택오버플로우가 나면서 창이 닫힙니다 .. ㅠㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SocketAsyncEventArgs 가 연속된 패킷을 모으는 역할을 하나요?
[테스트1]아래 처럼 클라이언트에서 Send를 5번 하는데for (int i = 0; i < 5; i++) { byte[] sendBuffer = Encoding.UTF8.GetBytes($"Hello World! {i} "); int sendByte = socket.Send(sendBuffer); } 강의 결과 화면처럼 서버에서는 5번의 Send 패킷을 모았다가 출력하는 모습을 볼 수 있습니다. [테스트2]아래에서도 마찬가지로 Send를 5번 하는데,1초 딜레이를 주고 실행했습니다.for (int i = 0; i < 5; i++) { byte[] sendBuffer = Encoding.UTF8.GetBytes($"{i} "); int sendByte = socket.Send(sendBuffer); Thread.Sleep(1000); } 이때는 서버에서 패킷을 모을 시간이 없었던건지,Send 패킷을 안모으고 출력하는 모습을 볼 수 있습니다. [질문]서버에서 패킷을 모으는 역할을 하는 것이 무엇인가요?SocketAsyncEventArgs 인가요?그리고 패킷을 모으는 기준이 무엇인지 궁금합니다.시간인가요? 아니면 끊임 없이 연속적으로 보내지는 패킷인가요? 아니면 다른 무엇인가요?SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); recvArgs.SetBuffer(new byte[1024], 0, 1024);