'부스러기 > 네트워크' 카테고리의 다른 글

윈도우즈 소켓 프로그래밍  (0) 2012.08.01


mysql-connector-java-5.1.25.zip


http://dev.mysql.com/downloads/connector/


다른 언어의 커넥터들은 여기서 받을 수 있다.



드라이버 로드

try{

Class.forName("com.mysql.jdbc.Driver");

}

catch(Exception e){

}


커넥션

String url = "jdbc:mysql://127.0.0.1:8888:test";
String id = "root";
String pw= "password";
Connection conn = null;
try{
    conn =DriverManaer.getConnection(url,id,pw);
}catch(Exception e){

}


url 예시

oracle : jdbc:oracle:thin:@127.0.0.1:8888:test

 mysql : jdbc:mysql://127.0.0.1:8888/test
 MSsql : jdbc:microsoft:sqlserver://127.0.0.1:8888;database=test


DWORD WINAPI WaitForSingleObject(
  __in  HANDLE hHandle,
  __in  DWORD dwMilliseconds
);

위 함수는 커널 오브젝트의 상태 정보를 확인하는데 사용 됩니다.
즉, 해당 리소스의 커널 오브젝트가 Signaled인지 Non-Signaled인지 알 수 있습니다.

해당 리소스가 살아있으면 Non-Signaled (FALSE)이고 
해당 리소스가 종료되면 Signaled(TRUE)를 커널 오브젝트안에 가지고 있습니다.

첫번째 인자로는 해당 커널 오브젝트 핸들을 지정해 주고
두번째 인자는 Signaled 상태가 될 때까지 기다릴 수 있는 최대 시간을 밀리초 단위로 지정해 줍니다.
(INFINITE라고 인자를 주시면 해당 리소스가 종료 될 때까지 기다리고 있습니다. 
 즉, Signaled가 될 때까지 기다린다는 뜻입니다.)




간단한 예제 소스로 결과를 확인해 봅시다.

===========================
예제 소스
===========================
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>

int _tmain(int argc,TCHAR* args[])
{
STARTUPINFO start_info={0,};
PROCESS_INFORMATION process_info;

SetCurrentDirectory(_T("C:\\WINDOWS\\system32"));
TCHAR Command[] = _T("notepad.exe");

        /*메모장을 생성*/
CreateProcess(NULL,Command,NULL,NULL,TRUE,0,NULL,NULL,&start_info,&process_info);
       
       /*메모장이 종료 될때까지 멈춰있음*/
WaitForSingleObject(process_info.hProcess,INFINITE);

_tprintf(_T("Exit notepad. \n"));

return 0;
}

아마 실행해 보시면 메모장이 띄워지고 WaitForSingleObject 함수에서 멈춰 있는 것을 알 수 있습니다.
그리고 메모장을 끄시면 "Exit notepad."라는 문장이 출력되면서 예제소스 프로그램이 종료되는 것을 보실 수 있습니다.

======================================
쓰레드 동기화 시 사용되는 경우
======================================
쓰레드 동기화 시키는 방법에는 유저모드와 커널모드로 나눠지지만 WaitForSingleObject함수를 사용하는 경우는 
커널모드 쓰레드 동기화일 때만 사용합니다. 그에대한 2가지 방법으로  뮤텍스, 세마포어가 있습니다.

뮤텍스와 세마포어는 커널모드 쓰레드 동기화 방법 이므로 생성하면 커널 오브젝트 상태를 지닙니다.

1. 뮤텍스
임계영역에 들어가기 위해서는 무작정 들어가는 것이 아니라 키를 가지고 있어야만 들어갈 수 있는 것 입니다.
그럴 때 키는 얻는 함수로 사용되는 것이 WaitForSingleObject가 될 수 있습니다.
임계영역을 빠져나오면 키를 반환해야 하므로 그때 사용하는 함수는 ReleaseMutex가 되겠습니다.
간단하게 뮤텍스를 이용해 쓰레드들이 임계영역에 동시접근 하는 것을 막아보겠습니다.

상황을 간단하게 말하면
하나의 ATM기계가 있는데 10명의 사람들이 일을 보고 나오려고 하는 상황입니다.
각 사람들이 일보는 시간은 10~20초 사이입니다. ( 잘 안보이시면 클릭 )

위에 Working이라는 함수에서 WaitForSingleObject라는 함수를 사용하고 있는데 들어갈 수 있는 권한을 얻는 것입니다.
뮤텍스 커널 오브젝트도 마찬가지로 Non-Signed상태와 Signed상태가 있는데 해당 뮤텍스 커널 오브젝트가 Signed상태가 될때까지 기다리는 것입니다. Signed상태가 되면 기다리는 것들 중지하고 해당 쓰레드가 임계영역으로 들어가는 것입니다.

실행 결과 입니다.

동기화 방법 중에 뮤텍스 말고도 세마포어라는 것이 있는데 세마포어는 뮤텍스에 없는 카운트 기능이 있습니다.
즉, 임계영역에 동시에 들어 갈 수 있는 쓰레드의 개수를 정할 수 있는 기능이 있습니다.
하지만 WaitForSingleObject를 사용하는 방법은 같으므로 생략하도록 하겠습니다.


[윈도우즈 Socket함수]

- Winsock API는 개발자를 위한 헤더와 라이브러리 파일과 애플리케이션에서 사용하는 DLL파일로 구성됨.

- Winsock환경의 핵심은 소켓임....

 

[WSAStartup()]

- Winsock프로그램을 시작하기 위해서는 WSAStartup()함수를 호출해야함.

- 프로그램이 사용할 Winsock버전 정보를 운영체제에 전달하는 역할을 수행.

- int WSAStartup(WORD wVersion, LPWSDATA lpWSAData)

(1번째 파라미터: Winsock버전, 2번째 파라미터: Winsock라이브러리정보를 포함하는 구조체를 참조함.)

 

[WSACleanup()]

- Winsock라이브러리를 사용후 반드시 풀어주어야함.

- 프로그램에서 Winsock함수 사용을 종료한다는 신호만 전달함.

 

[Winsock함수]

           서버                                              클라이언트

    WSAStartup()                                   WSAStartup()

     WSASocket()                                    WSASocket()

          bind()

         listen()

     WSAAccept()    <------------------      WSAConnect()

       WSARecv()     <------------------         WSASend()

      WSASend()      ------------------>        WSARecv()

         close()          <---------------->            close()

    WSACleanup()                                  WSACleanup()

 

[Winsock 넌블로킹 소켓함수]

- 원하지 않는 블로킹 현상을 예방하는 아주 간단하고 원칙적인 솔루션은 입출력 함수가 호출 되었을때 블록하지 않도록 설계된 소켓을 사용하는 목적

- 넌블로킹 소켓을 사용함으로써, 데이터를 수집하거나 전송할 소켓을 찾는데 사용할수도 있슴.

ioctlsocket(SOCKET s, long cmd, u_long FAR* argp)

(s는 설정해야하는 소켓을, cmd는 소켓에서 수행할 동작을, argp는 커맨드 파라미터임.)

 

[WSAAsyncSelect()]

- 이벤트기반의 네트워크 소켓.

- 모니터링할 소켓과 소켓 이벤트가 발생할 때 해당창으로 전송할 원도우즈 메시지 값을 포함함.

- int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)

(s는 모니터링할 소켓을, hWnd는 이벤트 메시지를 수집할 부모창을 정의하며, wMsg는 전송할 실제 이벤트를 정의, lEvent는 소켓에서 모니터링할 이벤트를 정의함.)

 

* WSAAsyncSelect() 이벤트타입

   이벤트                                                                    설명

FD_ACCEPT                                     소켓에 새로운 연결이 확립됨.

FD_ADDRESS_LIST_CHANGE           소켓의 프로토콜 유형에 대한 로컬 주소 리스트가 수정됨.

FD_CLOSE                                       기존의 연결이 종료됨.

FD_CONNECT                                  소켓이 원격 호스트와 연결을 확립함.

FD_GROUP_QOS                             소켓 유형의 QoS값이 수정됨.

FD_OOB                                          소켓에서 대역 외(out-of-band) 데이터를 수집함.

FD_QOS                                          소켓의 QoS값이 수정됨.

FD_READ                                         소켓에 있는 데이터를 읽어들일 준비가 됨.

FD_ROUTING_INTERFACE_CHANGE 소켓의 라우팅 인터페이스가 특정목적에 대해서 수정됨.

FD_WRITE                                       소켓이 데이털르 출력할 준비가 됨.

 

[WSAEventSelect()]

- 윈도우즈 메시지를 통해서 소켓 통지를 처리하지 않고 대신 이벤트객체핸들을 통해 처리함.

- 여러 소켓이벤트를 처리하는데 각각에 대해서 별개의 윈도우즈 메서드를 생성하고 싶을때 사용..

- 먼저 WSACreateEvent()함수를 사용하여 고유의 이벤트를 정의해야함.

- WSASelect(SOCKET s, WSAEVENT hEvent, long lNetworkEvents)

(s는 모니터링할 소켓을, hEvent는 소켓 이벤트가 발생할 때 생성될 이벤트를 정의하며, lNetworkEvent는 모니터링할 모든 소켓이벤트의 비트와이즈 조합임.)

- 소켓 이벤트가 발생하면, WSACreateEvent()에서 지정한 이벤트 메서드가 실행됨.

 

[입출력오버랩(I/O)]

- 프로그램으로 하여금 독특한 데이터 구조(WSAOVERLAPPED)를 이용하여 한번에 한개 이상의 비동기 입출력 요청을 발생시킬 수 있도록 함.

- 소켓이 이벤트를 수집하면서 동시에 여러 개의 이벤트를 호출할 수 있기 때문에 이 이벤트들은 오버랩되는 것으로 간주됨.

- 이기법을 사용하기 위해서는 우선 오버랩이 가능하도록 설정된 플래그를 사용하여 WSASocket()함수로 소켓을 생성해야함.

-  64개의 이벤트로 한정하여 정의할 수 밖에 없기 때문에 대규모 네트워크 애플리케이션에는 적합하지 않음.

- 단일 스레드에서 처리됨...

 

[완료포트]

- 이벤트를 복수의 스레드로 나누어서 처리하기 위해 사용됨.....

- 각 프로세서에 대해서 별개의 스레드를 생성하므로써, 각 프로세서에서 복수의 소켓을 동시에 모니터링하는 것이 가능함.


출처:http://byung2love.blog.me/140020497881

+ Recent posts