본문 바로가기

Computer/ServerProgramming

소켓 I/O :: 비교 더보기
소켓 I/O :: IOCP 1. IO Completion Port - 내부에 큐를 생성하여 입출력이 완료되면 Completion Packet 생성하여 Completion Queue에 저장 - 스레드는 Completion Queue 에서 패킷을 하나씩 가져와 처리 2. IOCP - 비동기 입출력 모델( 먼저 입출력한 후 나중에 확인 ) - 제한된 스레드를 사용하여 컨텍스트 스위칭 시간 절약 3. IOCP 구현 - Completion Port 오브젝트 생성 (소켓과 오브젝트 연결) HANDLE CreateIoCompletionPort() 서버의 리슨 소켓 / 각 클라이언트의 소켓이 생성될 때 오브젝트 생성 - 보통 CPU 의 2배수로 WorkerThread 생성 루프를 돌면서 Completion Queue 를 계속 호출 - Compl.. 더보기
소켓 I/O :: Overlapped Callback 1. Overlapped 입출력 - 하나의 스레드 내에서 동시에 여러 개의 입출력을 진행 - WSASocket 사용 WSA_FALG_OVERLAPPED 플래그로 Overlapped IO 가능 - 기존 recv/send 의 개선 -> WSASend, WSARecv Accept 및 Recv 이후 초기 Recv 동작 전송과 수신의 과정을 완료하지 않음 데이터를 각각 소켓의 Overlapped 구조 버퍼에 복사 전송과 수신을 백그라운드 동작 2. Callback 방식 - Overlapped 구조체에 CompletionFunction을 지정하여 Callback - WSARecv/WSASend 함수 호출이 완료되었을 때 지정한 Callback 함수 호출 - 해당 Callback 함수에서 Recv/Send 처리 - .. 더보기
소켓 I/O :: WSAEventSelect - 메시지를 전달하는 대신 이벤트 신호를 이용 - 원형 : int WSAAPI WSAEventSelect( SOCKET s, WSAEVENT hEvent, long lEvent ) - 이벤트 메시지 핸들은 Accept시 CreateEvent 함수 호출로 생성한다. - 이벤트 발생 유무의 확인은 WSAWaitForMultipleObject 함수로 처리 - 네트웍 이벤트 종류는 WSAEnumNetworEvents 함수로 처리 더보기
소켓 I/O :: WSAAsyncSelect - 소켓을 비동기화 한다. - 윈도우를 하나 생성하여 메시지 큐를 이용하여 소켓 이벤트 발생 - 싱글 스레드 : 하나의 메시지가 완료될 때까지 다른 메시지 사용불가 - 원형 : int PASCAL WSAAsyncSelect( SOCKET s, HWND hWnd, u_int wMsg, long lEvent ); 더보기
소켓 I/O :: Select 1. 해당 소켓 세트를 검사하여 읽기/쓰기가 필요한 사항을 처리 2. Winsock 1.1 버전에서 정의 - 버클리 소켓과 후위 호환성을 지님 - 유닉스 계열에 바로 이식가능 3. Select 함수 호출 과정 4. Select 함수 원형 int select( int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR* exceptfds, const struct timeval FAR* timeout ) 5. FD(파일디스크립터) - File Handle - 리눅스에서 사용되던 파일 관리 기법 - 파일에 정수를 지정하여 관리하는 방식 - 소켓도 파일로 인식 - 윈도우에서는 handle로 사용 - FD_ZERO, FD_SET, FD_ISSET, FD_CL.. 더보기
다중 접속 서버(I/O 멀티플렉싱) 1. I/O 멀티플렉싱 - 서버-클라이언트 1:N 매칭 - 입력 신호를 대기하여 해당 신호에 대한 처리를 한다. - I/O를 하나로 묶어 처리한다. 2. 윈도우 소켓 I/O 모델 - select - WSAAyncSelect - WSAEvent - Overlapped - Completion Port 더보기
데이터 전송과 수신 1. 전송(send) - int send(SOCKET s, const char FAR* buf, int len, int flags) - 해당 소켓으로 직접 정보 전송 2. 수신(recv) - int recv(SOCKET s, char FAR* buf, int len, int flags) - 해당 소켓에서 버퍼에 수신 받은 데이터 저장 - 전송된 데이터의 길이가 0이면 접속 종료됨. 더보기
클라이언트 연결 과정(TCP) 1. 소켓 생성 (socket) - 소켓 옵션을 주서 소켓 생성 2. 연결 (connect) - 주소 정보 구조체(sock_addr)에 연결 할 주소 정보 저장 - 연결 요청(동기/비동기) 더보기
서버 연결 과정(TCP) 1. 소켓 생성(socket) - 소켓 옵션을 주서 소켓 생성 2. 주소 정보 연결(bind) - 주소 정보 구조체(sock_addr)에 자신의 주소 정보 저장 - 생성된 소켓과 주소정보 구조체를 연결(INADDR_ANY) - IP/PORT 정보 필요 3. 대기(listen) - 연결 요청 대기 상태 4. 응답(accept) - 연결 요청이 이루어 졌다면 클라이언트 소켓 생성하여 서버 소켓과 연결한다. 더보기