안녕하세요 선생님 코드 몇줄에 대해서 질문드립니다.
268
작성한 질문수 18
질문
SocketAsyncEventArgs _sendArgs = new SocketAsyncEventArgs();
SocketAsyncEventArgs _recvArgs = new SocketAsyncEventArgs();
의 정확한 개념에 대해서 질문합니다.
세션 클래스 내부에서
SocketAsyncEventArgs _sendArgs = new SocketAsyncEventArgs();
SocketAsyncEventArgs _recvArgs = new SocketAsyncEventArgs();
public void Start(Socket socket)
{
_socket = socket;
_recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted);
_sendArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnSendCompleted);
RegisterRecv();
}
void RegisterRecv()
{
_recvBuffer.Clean();
ArraySegment<byte> segment = _recvBuffer.WriteSegment;
_recvArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);
bool pending = _socket.ReceiveAsync(_recvArgs);
if (pending == false)
OnRecvCompleted(null, _recvArgs);
}
비동기의 개념을 가지고 해석을 해봤는데,
서버 의 메인 함수 쓰레드가 메인 함수를 실행을 하면서
리슨을 던져놓고 클라이언트의 커낵트 신호가 올때
쓰레드 풀에서 대기하고 있던 A쓰레드가 투입이됩니다.
이때 메인 쓰레드는 while()문을 계속해서 타고 있기에
프로그램이 종료가 되지 않고 있는 상황.
A 쓰레드가 클라이언트를 Accept를 등록해주고 Accept를
완료 시킴으로써 클라와 서버 내부의 클라세션의
연결이 완료가 되고 SEND와 RECEIVE를 하면서
서로 통신을 하게 되는데
세션 클래스 내부에서
SocketAsyncEventArgs _sendArgs = new SocketAsyncEventArgs();
SocketAsyncEventArgs _recvArgs = new SocketAsyncEventArgs();
-->
이것이 클라이언트 세션 내부에서 SEND를 전담하는
쓰레드 A와 RECEIVE를 전담하는 쓰레드 B를
쓰레드 풀에서 가져와서 서버 클라이언트 세션에는
쓰레드 2개가 활동을 하는것이고 이 쓰레드는 비동기로
활동을 하는 건지
아니면 쓰레드 하나가 A라는 클라이언트를 전담하는
서버 컴퓨터의 A라는 클라이언트 세션에는
하나의 쓰레드가 있고
이 쓰레드를 비동기로 만들어주어
Receive와 send 신호오면 투입할 수 있게 콜백 걸어놓고
receive 신호 오면 receive 처리 처리중에 send 신호오면
기억해 두었다가 send 처리 이런식인가요
그리고 쓰레드는 만약 c++ 이라면 해당 cpp 파일 당
쓰레드를 하나씩 분배를 하나요? 함수 단위로 쓰레드를
분배를 하고 쓰레드 풀로 수거가 되나요?
답변 1
1
위의 RecvAsync / SendAsync를 호출하면
쓰레드 풀에 있던 쓰레드 하나가 처리해주는 것이고
Task와 비슷하게 그냥 일할 애가 있으면 그 애가 처리해주는 개념이지
딱히 전담 마크맨을 붙여주는 것은 아닙니다.
따라서 세션당 2개 쓰레드가 있는 것은 아닙니다.
그리고 쓰레드는 만약 c++ 이라면 해당 cpp 파일 당
쓰레드를 하나씩 분배를 하나요? 함수 단위로 쓰레드를
분배를 하고 쓰레드 풀로 수거가 되나요?
-> 둘다 아닙니다.
전체 로직 자체를 병렬로 처리할 수 있게 유도하는 것이지
딱히 함수나 cpp와 같은 단위의 제약이 있는 것이 아닙니다.
쓰레드 분배는 매우 어려운 개념이기 때문에
Part7에서 간단한 클라/서버 동기화를 해봐야
답을 알 수 있고 지금 설명하기엔 너무 복잡합니다.
TLS 질문드립니다.
0
37
2
SpinLock과 컨텍스트스위칭에 대해 질문 남겨요.
0
44
2
Unity Span
0
69
2
XML, Dll 차이점
0
101
2
Session 질문입니다
0
78
1
Write Read 커서 키워드
0
72
1
더미 클라이언트 수에 따른 OnDisconnect 발생
0
68
2
네트워크 Send 전담 스레드 배치
0
97
2
UnhandledException 으로 서버 터지는 경우
0
84
2
컨텐츠 단, 엔진 단
0
103
1
질문 있습니다
0
76
2
C# 게임서버 3D MMORPG
0
143
2
유니티6 버전
0
96
2
receive하는 부분과 send하는 부분의 차이
0
131
2
커서의 위치의 중요성
0
102
2
C++ 전혀 모르는데 C# 서버
0
168
2
강의에 질문이 있습니다
0
85
2
멀티스레드 이해도 질문
0
94
1
500 vs 500
0
125
3
OnAcceptHandler 액션 함수
0
60
1
이 정도 서버의 객관적인 수준이 궁금합니다.
0
187
2
36. Serialization #3 에서 string (name) 코드 수정 질문
0
81
2
외부 컴퓨터와의 통신 방법이 궁금합니다
0
104
1
스핀락 질문.
0
107
2





