안녕하세요, 어제 컨퍼런스 가기전에 스위치 강의를 듣고있었는데 마침 컨퍼런스 내용중에 내가 운영하는 서비스가 선착순 사은품 이벤트 등으로 평소보다 접속량이 100배가 늘어날 때 스위치가 먼저 고장날 수 있다는 내용이 있었습니다. 마침 강의에서 들은 내용이 떠올라서 이유를 고민했는데, 스위치는 맨처음부터 맥주소를 가지고있지 않으므로 Flooding이 발생하는데, 평소보다 훨씬 많이 발생해서 스위치가 버티지 못하고 장애가 발생할것이다 라고 생각했는데 이유가 맞을까요??
제가 수업을 통해 자체제작 iocp서버를 제작한 상황에서 언리얼 클라이언트와 연동하는 상황에서 제가 제 노트북에서 서버를 열고 클라를 접속하는 부분에서는 문제가 발생하지 않으나, 제 노트북에서 서버를 열고 다른 노트북에서 ip와 포트번호를 활용해 접속하니 접속은 되나 중간중간 잘못된 패킷을 보내는 등 접속이 끊기는 상황도 발생하고 있습니다. 혹시 언리얼에서 외부에 접속을 할 시 따로 설정해야하는 것등이 있는 건지 궁금합니다.
클라입장에서 Connect를 통해 연결을하고 연결된 소켓에 Send를 하게되면 서버입장에서 Recv하게되는부분에서 1. public void Start(Socket socket) { _socket = socket; _recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); _recvArgs.SetBuffer(new byte[1024], 0, 1024); _sendArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSendCompleted); RegisterRecv(); } 이부분에서 RegisterRecv를 하나만 써 준 것이 낚싯대에 비유하여 접근을 하고있을시 다른쪽에서 접근을 못한다고 하셨는데. 이게 구조적으로 그렇게 짜여진 것인가요?? + 또 RegisterRecv() 이것을 여러게 써주면 lock을 걸어야 하는건가요 ?? 2. 그리고 OnSendCompleted 에도 lock을 건 이유가 _sendArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSendCompleted); 이 부분에서 중복해서 들어오는 것을 방지하기 위해 거셨다고 하셨습니다. 그럼 Recv의 _recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); 이 부분은 어떻게 다른건가요?? 이 부분은 제 나름대로 이해하려고 예를 든 부분입니다. 제대로 이해했는지 봐주시면 감사합니다! Send와 Recv를 게임의 1:1 채팅에 적용하면 A유저와 B 유저가 1:1 채팅을 하고있는 중에 A유저가 채팅을 보내면 클라에서 Send를 하고 서버에서 Recv를 해 받고 그걸 서버 Send를 통해 B유저 클라에 보내준다 (이 부분에서 서버 Send는 1:1하고있는 B에만 가야하니까 lock을 검 : 또 다른 유저(클라)가 보낸 채팅? 들이 섞이지않게... )
항상 좋은 강의 너무 감사합니다. https://www.inflearn.com/questions/866611 위 질문에 대한 답변에서 '한 가지 중요한 사실은 Kernel 요소에 대한 User mode 접근은 모두 장치 '파일'로 이루어진다는 점 입니다.' 부분에서 추가적인 질문이 있습니다. Kernel 요소에 대한 User mode 접근은 결국 시스템 콜을 통해서 이루어진다고 알고있습니다. 그렇게 되면 시스템 콜이 파일이라는 말씀이실까요? 물론 시스템 콜은 결국 함수이므로 파일에 코드가 작성된 형태이긴 하겠지만, 이것이 파일을 통해 이루어진다는 부분이 잘 와닿지 않습니다. 추가적으로 파일의 타입 중 소켓 타입이 있다는 것도 알게 되었는데, 그렇다면 네트워크 연결 시, 연결된 수 만큼 소켓이 생기고 그곳에 연결된 대상에 대한 정보를 포함한 정보들이 기록되는 형태인 것일까요..? 마지막으로 시스템 프로그래밍 관련해서 널널한 개발자님이 추천하시는 책이 있는지 궁금합니다. 감사합니다.
Listener 클래스에 args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); 부분을 args.Completed += OnAcceptCompleted; 이렇게 바꾸어도 문제가 생기지 않는데 왜 EventHandler<T> 를 사용하는 것인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요! 방금 막 http 강의까지 다 들었습니다! 이 다음에 바로 스프링 부트 야생형코스로 넘어가는 게 실력 향상을 위한 더 나은 길이겠죠? 조언 부탁드립니다 강의 잘 들었습니다!
안녕하세요. Session에서 _recvArgs.SetBuffer() 하는 부분에서 궁금증이 생겼습니다. _recvBuffer.WriteSegment는 다음에 올 패킷 사이즈가 어느 정도인지 모르니 버퍼의 offset + writePos부터 여유공간 끝까지(FreeSize)를 뭉탱이로 가리켜서 주는걸로 이해했습니다. 그리고 _recvArgs는 WriteSegment가 가리키는 공간을 자신의 버퍼로 사용합니다. 만약, 실제로 보내고자 했던 패킷의 사이즈가 10인데, _recvArgs의 FreeSize가 5라면, 소켓은 일단 5만큼만 버퍼에 넣은 다음에 버리고, 나머지 5만큼의 재전송을 요청하는 건가요? 아니면 아예 버리고 재전송을 요청하는건가요? 그것도 아니라면 물밑(하위 레이어)에서 버퍼가 꽉 찼다는 신호를 서로 주고받아서 혼잡(?)이라 판단하고 애초에 보내지 않고 기다리는건가요? (버퍼가 비어지길 기다리다가 지치면 Disconnect 혹은 Loss?) 그리고 RecvBuffer의 Buffer가 TCP 이론을 배울 때 말하는 window size와 직접적으로 연관되는 건가요? 아니면 소켓 별도의 버퍼가 또 따로 있는건가요?
로드 밸런스는 포트를 기반으로 스위칭이 된다고 하셨는데, 가령 접속된 웹서버들의 IP는 다르더라도 웹서버의 포트가 똑같이 80으로 열려 있다고 한다면 어떻게 되는 건가요? 로드 밸런서 안에 웹서버들을 별도로 구분하는 테이블 같은게 있는걸까요? 어떤 방법으로 포트가 지정되어 매핑이 되는건지 궁금합니다.
안녕하세요 강사님 코드비교도 하고 소스코드를 다운 받아서 시도를 해도 해결이 되지 않아 문의 드립니다. 유니티 2022.3.15f 버전을 사용하고 net8.0을 이용하여 서버 및 클라이언트 빌드를 했습니다. 유니티 연동까지 했고, 버퍼크기는 65535로 설정해두었습니다. 유니티 connector.cs에서 클라이언트를 1로 설정했을 때에는 문제가 없으나 2 이상 올릴 경우 1번이 무조건 disconnect 처리가 됩니다. 100이상 올릴 경우 중간에 패킷조립에 실패하여 서버가 종료됩니다. 며칠을 고민하고 코드를 비교하고 강사님의 코드로만 진행을 해도 똑같아 문의남깁니다.
모듈이나 라이브러리를 빌드하고 있으면 /main을 지정할 수 없습니다. 라고 에러가 뜨고 있습니다. vs2022 버전으로 사용하고 있구요. DummyClient랑 Server 모두 참조 프로젝트로 ServerCore를 걸어주었습니다. 위가 ServerCore의 속성이구요. 이게 Server의 속성입니다. DummyClient도 똑같아요. 어디가 문제인걸까요 ?
안녕하세요, 강사님 이번 강좌의 Multicast RPC 코드 부분에서 이해되지 않는 것이 있어 여쭈어보고자 합니다. 설명해주신 대로 구현한 결과, 클라이언트 측 화면에서 클라이언트 플레이어가 공격 시 클라이언트 플레이어의 공격 모션이 수행되고, 동시에 서버 측 화면에서도 클라이언트 플레이어의 공격 모션이 수행되고 있습니다. 하지만 코드를 하나하나 따라가보았을 때, 이런 결과가 나오지 않아야 할텐데 라는 생각이 들었습니다. void AABCharacterPlayer::MulticastRPCAttack_Implementation() { AB_LOG(LogABNetwork, Log, TEXT("%s"), TEXT("Begin")); if (HasAuthority()) { bCanAttack = false; OnRep_CanAttack(); FTimerHandle Handle; GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([&] { bCanAttack = true; OnRep_CanAttack(); } ), AttackTime, false, -1.0f); } UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); AnimInstance->Montage_Play(ComboActionMontage); } 이해되지 않는 부분은 MulticastRPCAttack_Implementation()의 애니메이션 몽타주를 재생하는 코드 부분입니다. Multicast RPC에 의해서 해당 함수는 서버와 클라이언트 모두에서 실행된다고 이해했습니다. 그렇다면 서버에서는 MulticastRPCAttack_Implementation() 함수의 if문과 애니메이션 몽타주를 재생하는 코드가 모두 실행되게 될텐데요, 그러면 서버쪽에서 호출된 MulticastRPCAttack_Implementation() 함수이므로 서버 측 화면에서는 서버 플레이어의 AnimInstance를 얻어 애니메이션 몽타주를 재생해야 하는 것 아닌가? 라고 생각했으나 실제로 실행 결과는 아시다시피 서버 측 화면의 클라이언트 플레이어의 애니메이션이 재생됩니다. 어째서 제가 생각한 대로 애니메이션이 수행되지 않는 것일까요?? 제가 이해되지 않는 이유는 어딘가 잘못 이해하고 있기 때문이라고 생각합니다. 어느 부분을 어떻게 잘못 이해하고 있는 것인지 알고 싶습니다..