WSAEventSelectModel 질문 있습니다.
289
6 asked
안녕하세요, Client Socket과 이벤트를 select 하실때 FD_READ | FD_WRITE | FD_CLOSE 3가지를 동시에 바인딩하시는 이유가 궁금합니다
강의중 언급하신
'TCP 논 블로킹 소켓에서, 데이터를가 분할되서 송신될 수 있다. 하지만 웬만하면 일어나지 않는다.'
의 상황에 대응하기 위하여 send 함수 호출 시 각 인자를 수정하셨는데,
FD_WRITE는, 만약 위와 같은 상황이 발생했을때, 다음 프레임에서 이벤트를 감지하기 위함이신지,
만약, 위와 같은 데이터 분할 송신이 절대 일어나지 않는경우라고 가정하면 FD_READ | FD_CLOSE 2개의 플래그만으로도 목표하신 에코서버 구현이 가능할것인지
이 궁금합니다.
Answer 1
0
구매한 강의가 아니라서 내용을 못보니 그냥 이론적으로만 내용에 첨언을 드리자면 '왠만해서는 일어나지 않는다'가 핵심입니다. 하지만 엄연히 이걸 일어나지 않는다고 가정하면 안됩니다.
인터넷 환경이 충분히 빠르고 작은 데이터면 Send에 넘긴 데이터 사이즈와 Send에서 리턴하는 데이터 사이즈가 동일하지만 어느정도 이상되면(예를 들어 2~3KB 이상의 데이터, 또는 데이터 처리에 지연이 발생하여 일부만 전송되는 등) 한번에 전송하지 못합니다.
따라서 TCP로 전송하는 데이터는 수신측에서 원래 전송된 데이터가 몇바이트인지 구분이 가능해야하고(데이터 헤더에 데이터 사이즈를 명시적으로 보낸다거나 JSON 문서로 통신할 땐 뉴라인 없이 직렬화 하여 문서 끝에 뉴라인을 넣어 구분하는 등) 송신측에서는 전송된 데이터 사이즈를 얻어서 전송할 사이즈 보다 적으면 나머지 데이터 전송을 다시 시도해야하고 수신측에서도 완전히 데이터가 수신되었는지 체크하여 이어서 수신할 수 있도록 해야합니다. (별도의 소켓 라이브러리를 사용할 경우 라이브러리에서 이걸 해주는 경우도 있습니다. asio의 asio::async_read, asio::async_write 등등)
결론은 hello world같은 아주 적은 데이터를 사용할 경우 가능은 하겠지만 무조건이라고 생각하면 안된입니다.
Memory Pool에서 오버플로우 질문입니다.
0
55
2
포토폴리오 및 진로 관련하여 고민입니다.
0
96
1
포토폴리오 관련 고민입니다.
0
50
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
74
2
성능 테스트 결과
0
97
2
게임 서버 Stateful, Stateless 진로 고민
0
114
1
WaitOnAddress와 Sleep의 차이 질문
0
79
1
궁금한거 있습니다.
0
79
2
JobTimer 구동 스레드
0
103
2
TryPop() 동작 관련 질문
0
78
1
로드맵 C#서버 C++서버 방향성 질문
0
142
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
70
1
생명주기를 위한 의도적 복사
0
81
2
락프리의 실무에서 사용 질문
0
137
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
98
2
mutex와 sleep 차이점
0
114
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
149
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
91
1
공부법 관련해서
0
179
2
MakeShared 함수 관련
0
111
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
140
2
운영체제관련 질문입니다
0
127
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
114
2
메모리 풀 질문있습니다.
0
119
1

