2017-11-27 10 views
0

소켓에서 읽기 접근 방식을 사용하고 있습니다. 대부분의 사람들은 이것을 가장 좋은 방법으로 추천했습니다. 문제는 보낸 메시지가 분리되어 있고 그 중 절반 만받는 경우입니다. 나는 루프 전체 서버 응용 프로그램을 차단하고 recv() 메시지의 나머지 부분을 시도해야합니다. 나는 보내는 소켓을 다루기 위해 새로운 스레드를 만드는 것에 대해 생각하고 있었다. 그러나 그것은 선택의 아이디어를 죽이는 것처럼 느껴집니다. 더 많은 클라이언트가 메시지를 보낼 수 없습니다.select를 사용하여 recv() 블록을 처리하는 방법

어떻게해야합니까?

+0

답장을 버퍼링하십시오. 그리고 충분히 보지 않으면 파싱을 시작하지 마십시오. – wildplasser

+0

어떻게 그들을 버퍼링해야합니까? 보낸 메시지를 버퍼링 한 상태로 유지하는 연결과 관련된 구조가 있습니까? –

+1

예. 예. 예. 예. – wildplasser

답변

0

아무 것도 차단하지 않아도됩니다. 지금까지 채널과 관련된 어딘가에서 읽은 것을 저장하고 select()으로 돌아가서 원하는 것을 누적 할 때까지 계속하십시오.

+0

그래서 소켓과 관련된 버퍼가 있다는 뜻입니까? 많은 고객이 미완료 메시지를 보낼 때 추적하기가 더 어렵지 않습니까? –

+0

아니, 왜? 필요한 것은 버퍼와 소켓의 맵입니다. 소켓과 관련된 일종의 Context 또는 Session 객체가있을 수 있으며 버퍼, 자격 증명, 시간 초과 등이 포함됩니다. – EJP