윈속에는 블록킹(blocking) 와 넌블록킹(non-blocking)으로 두가지 소켓 모드가 있다.
윈속에서 제공하는 I/O모델로는 blocking, select, WSAAsyncSelect, WSAEventSelect, overlapped I/O, completion port가 있다.
블록킹 모드에서는 I/O 작업이 끝날 때 까지 윈속 함수의 리턴이 대기 된다.
넌블로킹 모드에서는 윈속 함수는 즉시 리턴 된다.
블록킹 모드로 코딩 할 경우에는 보통 스레드를 사용 한다.
수신스레드와 데이터처리 스레드로 두개의 스레드를 사용 한다.
두개의 스레드 사이에 동기화객체를 사용하여 데이터를 접근 한다.
데이터 수신 쓰레드
void ReadThread(void)
{
while ( !done )
{
nTotal = 0;
nLeft = NUM_BYTES_REQUIRED;
while ( nTotal != NUM_BYTES_REQUIRED )
{
EnterCriticalSection( &data );
nRead = recv( ... );
if ( nRead == -1 )
{
error
}
nTotal += nRead;
nLeft -= nRead;
nBytes += nRead;
LeaveCriticalSection( &data );
}
SetEvent( hEvent );
}
}
데이터 처리 쓰레드
void ProcessThread(void)
{
WaitForsingleObject( &data );
EnterCriticalSection( &data );
// 데이터로 뭔가를 한다..
DoSomeComputationOnData( buff );
// 처리된 만큼 버퍼에서 제거 한다.
nBytes -= NUM_BYTES_REQUIRED;
LeaveCriticalSection( &data );
}
넌블로킹 소켓은 생성한 소켓에 대하여 ioctlsocket를 호출하여 만들 수 있다.
'프로그래밍 > Server' 카테고리의 다른 글
SQL 2000 syntax error (0) | 2013.02.12 |
---|---|
DB 복사 에러 (0) | 2013.01.23 |
input director 설정 ( PC, 노트북 ) (0) | 2012.06.17 |
MTU ( Maximun Transmission Unit ) (0) | 2012.06.15 |
RUDP (1) | 2012.02.13 |