소개
게시글
질문&답변
Name이 한번 오면 초기화되는 이유
답변 감사합니다. 사실 바로 질문드리는건 아니고 보통 몇시간동안 삽질하다가 질문드리는것이었는데 부족했었던 것 같습니다. 더 열심히하겠습니다!!(사진)그리고 해당 원인을 찾은것같습니다. read에서는 offset을 ReadOnlySpan s = new ReadOnlySpan(segment.Array,segment.Offset,segment.Count); 이렇게 offset을 반영하여 segment로 끌어왔는데 정작 write에서는 ArrayCopy할 때에 Offset을 더해주지않고 count만 넘겨주어 계속 첫 22바이트영역의 name부분에만 넣고 있었던겁니다. (강의에서도 offset을 더하지 않은채로 진행했지만, 강사님께서는 5번 보내지않고 한번만 보내어 잘 동작된것처럼 보였던 것 같습니다.)제일 이해안되었던게 다른건 다 잘나오는데 name만 이상하게 나오는 이유였는데, 해당 name을 copy해주는 array.copy에서 저렇게 해주어 첫 ABCD만 나오고 그 이후엔 애초에 name byte가 들어있지않으니 나오지 않았던것입니다. 실제로 이런 실수 문제를 줄이기 위해서는 다른 리팩토링 과정이 필요할 것 같은데 어떻게할지는 전혀 지식이 없어서 필요하겠구나..만 생각이 드네요. 저는 다른 일을하고있어서 해당 강의를 병행할 시간이 별로 없어서그런지 빨리 해당 기술을 배워 일에 적용시켜야하는 급한 마음에 몇시간동안 계속 삽질해보다 질문을 드렸었는데, 강사님의"어차피 현업에 가더라도 지금과 마찬가지로 알 수 없는 문제들이 막 터지는데그 때는 누군가 옆에서 도와주고 답을 알려주는 사람이 있지 않습니다."가 굉장히 마음에 와 닿았습니다. 마음에 새기며 더 열심히 해보겠습니다. 좋은강의, 답변 감사드립니다!
- 2
- 4
- 442
질문&답변
Name이 한번 오면 초기화되는 이유
저도 디버깅을 하고싶지만, 디버깅을 하면 client또는 server둘중 하나만 디버깅이 가능해서 값을 주고받는것에 대한 테스트가 안됩니다. 그래서 강사님은 어떻게 두 프로그램을 동시에 디버깅하시는지에 대해 질문을 올린적이 있습니다..ㅜ 그래서 현재 자세하게 디버깅을 할 수가없어 console writeline으로 확인해보며 값을 체크를 하였지만 찾지 못하여 질문드렸습니다. write()메서드를 이후의 방법으로 바꿔보았을 때 잘 되는것으로 보아, write()의 string serializable부분코드가 잘못된 것 같아보여서 해당 코드 첨부드립니다.. public override ArraySegment Write() { //이만큼의 버퍼를 일단 가져옴 ArraySegment segment = SendBufferHelper.Open(4096); ushort count = 0; bool success = true; //처음에만 span으로 찝어주고 이후에 slice Span s = new Span(segment.Array, segment.Offset, segment.Count); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count,s.Length-count), this.packetId); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count,s.Length-count), this.playerId); count += sizeof(long); //string serialize ushort nameLen = (ushort)Encoding.Unicode.GetByteCount(this.name); success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), nameLen); count += sizeof(ushort); // TryWriteBytes()에서 string, byte[]을 인자로 받는 메서드가 없어서 이렇게 구현 Array.Copy(Encoding.Unicode.GetBytes(this.name), 0, segment.Array, count, nameLen); count += nameLen; success &= BitConverter.TryWriteBytes(s, count); if (success == false) { return null; } //실제로 사용한 데이터 범위 가져옴 return SendBufferHelper.Close(count); }
- 2
- 4
- 442
질문&답변
RegisterRecv()에서 args초기화 구문 사라진 이유
아.. AcceptSocket은 listener에서만 사용되고 listener에서 session을 start시켜주니까 session.Start(args.AcceptSocket);여기서 소켓 넘겨주고 session은 해당 소켓을 받으면 되는것이니 AcceptSocket은 안쓰이는군요. 감사합니다.!!
- 0
- 3
- 379
질문&답변
segmeng 범위 지정시에 질문
감사합니다. 근데 지금 현재까지(SendBuffer 강의)는 offset이 전부 0인경우로 라고 생각이드는데, 나중에 offset이 달라지는 경우가 나오는것인가요?
- 0
- 3
- 440
질문&답변
segmeng 범위 지정시에 질문
저는 그 offset의 역할을 _readPos가 이미 해주고있다고 느껴지는데, 어떻게 구분해야 이해를 할 수 있는것인가요?
- 0
- 3
- 440
질문&답변
RegisterRecv()에서 args초기화 구문 사라진 이유
감사합니다. 그런데, 이전 강의에서 args.AcceptSocket = null; 를 해야 전에 쓰인 소켓정보들을 정리해주어 에러가 나지 않는다고 하셨는데, Accept이랑 무관한 Recv라서 필요없어졌다는게 무슨 의미인지요??
- 0
- 3
- 379
질문&답변
listener, connector static 차이 이유
답변 감사합니다. static void main에서쓰기 위해서 static listener로 만드셨다는 의미는, static 메서드에서는 static 인스턴스만 사용가능한건가요????
- 0
- 2
- 377
질문&답변
Session #2 내용중 왜 스레드가 동시다발적으로 접근 불가능한지 질문
아래 코드처럼 Session session = new Session(); 이후에 그 한 세션의 session.Start를 여러 스레드가 수행하는 경우는 어떻게 되는건가요?
- 0
- 4
- 537
질문&답변
listener, session 간의 차이
감사합니다. 그런데, listener는 accept를 실패했더라도 다른 client들을 계속 기다려야 하니까 if, else절 상관없이 받는 것이라고 이해했긴 했는데, (맞는진 모르겠습니다)session은 recv를 한번의 stream들만 받는거니까 계속해서 args.BytesTransferred > 0 인 경우에만 계속해서 RegisterRecv(args); 로 낚싯대를 놓는걸로 이해했는데 맞을까요?
- 0
- 3
- 542
질문&답변
Session #2 내용중 왜 스레드가 동시다발적으로 접근 불가능한지 질문
감사합니다. 그런데 만약 이렇게 동일한 session을 start하게된다면 같은 OnRecvCompleted()메서드에 진입하게되는 것 아닌가요?
- 0
- 4
- 537