티스토리 뷰

190711-2 - SELECT 모델
 

SELECT 모델
쓰레드 하나로 다중처리를 할 수 있다.
 
// 소켓 정보 저장을 위한 구조체
struct SOCKETINFO
{
    SOCKET sock;     //소켓번호
    char buf[BUFSIZE+1];    //버퍼
    int recvbytes;    //받은바이트
    int sendbytes;    //보낸바이트
};
소켓 마다 독립적으로 관리하기 위해서 구조체 정의.
 
SOCKETINFO *SocketInfoArray[FD_SETSIZE]; // 소켓정보포인터를 저장하는 배열 (FD_SETSIZE : 현재 64개)
 
// 넌블로킹 소켓으로 전환
u_long on = TRUE;
retval = ioctlsocket(listen_sock, FIONBIO, &on);
if(retval == SOCKET_ERROR) err_display("ioctlsocket()");
 
select 함수로 보고를 받는다. 소켓이 접속했는지
 

 
select 대기
-> 1번 클라이언트 데이터 보냄
-> 받아야 하므로 rest의 count++, 1번 클라이언트 소켓 들어옴
-> recv로 데이터를 받음
-> 받은 데이터를 아직 안보냈으므로 (받은 데이터 > 보낸데이터)
-> 1번 클라이언트 소켓은 다시 에코해야하므로
-> 1번 클라이언트 소켓은 wset에 넣는다.
-> 1번으로 부터 받은 데이터를 send(에코)한다.
-> 모두 전송했다면 1번소켓도 이제 rset에 넣는다.
-> 데이터를 받지 않은 소켓은 계속 rset에 초기화되며 -> 데이터가 들어온 것만 count 되어 독립적으로 이벤트를 처리한다.
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함