본문 바로가기

프로그래밍/서버

소켓 프로그래밍 2

논블록 소켓의 데이터를 다루는 순서

 

1. 소켓이 I/O 가능인 것이 있을 때까지 기다린다

 

2. 소켓에 대해 논블록 액세스를 한다

 

3. would block이 발생했으면 두고, 그렇지 않으면 실행 결과 리턴 값을 처리한다

 

Overlapped I/O의 데이터를 다루는 순서

 

1. 소켓에 대해 Overlapped 액세스를 건다

 

2. Overlapped 액세스가 성공했는지 확인한 후 성공했으면 결과값을 얻어와서 나머지를 처리한다

 

Overlapped I/O 함수는 즉시 리턴되지만, OS로 해당 I/O 실행이 별도로 동시간대에 진행되는 상태이다

 

호출한 Overlapped I/O 전용 함수가 비동기로 하는 일이 완료될 때까지 소켓 API에 인자로 넘긴 데이터 블록을 제거하거나 내용을 변경해서는 안된다

 

Overlapped status 구조체 또한 OS에서 백그라운드로 액세스 중이다 따라서 중간에 없애거나 내용을 변경해서도 안된다

 

Overlapped I/O 전용 송수신 함수를 호출하면 OS는 송신할 데이터가 저장되어 있는 메모리 블록 자체를 송신 버퍼로 사용한다

 

일반 버전 함수            Overlapped I/O 전용 함수

    send                                WSASend

    sendto                            WSASendTo

    recv                                WSARecv

    recvfrom                        WSARecvFrom

    connect                            ConnectEx

    accept                            AcceptEx

 

Overlapped I/O의 장점

 

1. 소켓 I/O 함수 호출 후 would block 값인 경우 재시도 호출 낭비가 없다

 

2. 소켓 I/O 함수를 호출할 때 입력하는 데이터 블록에 대한 복사 연산을 없앨 수 있다

 

3. send, receive, connect, accept 함수를 한번 호출하면 이에 대한 완료 신호는 딱 한번만 온다. 결과물이 깔끔하다

 

단점

 

1.. 완료되기 전까지 Overlapped status 객체가 데이터 블록을 중간에 훼손하지 말아야 한다

 

2.. 윈도 플랫폼에서만 제공하는 기능이다

 

3.. accept, connect 함수 계열의 초기화가 복잡하다

 

논블록 소켓에서 I/O operation 상태

 

송신 버퍼에 1바이트라도 여유 공간이 있으면 송신 가능, send available이라 한다

수신 버퍼에 1바이트라도 여유 공간이 있으면 수신 가능, receive available이라 한다

이를 I/O 가능이라 한다

 

Overlapped I/O 에서 I/O operation 상태

 

Overlapped 송신이 진행 중이고 완료가 아직 안되었으면 'Overlapped 송신이 아직 완료 대기중(pending)'이라 한다

Overlapped 수신이 진행 중이고 완료가 아직 안되었으면 'Overlapped 수신이 완료 대기 중'이라 한다

 

이를 'I/O 완료 대기 중' 또는 'I/O 실행 중'이라 한다

 

논블록 소켓에서는 상태 확인 후 뭔가를 한다 그래서 논블록 소켓을 '뒤늦게'라는 의미의 리액터 패턴(reactor pattern)이라 한다

Overlapped I/O는 '미리'라는 의미의 프로액터 패턴(proactor pattern)이라 한다

 

리액터                                        

논블록 소켓                               

1. I/O를 시도한다(성공or 실패)    

2. 실패할 때 I/O 가능을 기다린 후 I/O를 재시도한다

3. 성공할 때상황을 종료한다

 

프로액터

Overlapped I/O

1. I/O를 시행한다(무조건 성공)

2. I/O 완료를 기다린다

3. 상황을 종료한다

 

 

'프로그래밍 > 서버' 카테고리의 다른 글

게임 서버와 클라이언트  (0) 2019.09.30
소켓 프로그래밍 3  (0) 2019.09.27
소켓 프로그래밍 1  (0) 2019.09.23
컴퓨터 네트워크 2  (0) 2019.09.20
컴퓨터 네트워크 1  (0) 2019.09.19