소켓은 각 함수가 에러가 발생하면 유닉스의 경우는 -1이 리턴되고 윈속은 INVALID_SOCKET 아니면 SOCKET_ERROR을 리턴한다. 소켓 함수가 핸들값을  얻는 함수라면 INVALID_SOCKET으로 에러를 비교를 해야하고 다른 일반적인 소켓 함수는 SOCKET_ERROR 라고 검사를 하면 된다. 여기서 단순히 함수가 성공 이냐 실패냐 만 나온다면 프로그래머 입장에서 에러 잡기가 상당히 힘들어 진다.  

그래서 소켓 함수들은 정확하게 원인이 무엇인지를 가리켜 준다. 그러니까 에러 종류들을 미리 숫자 값으로 정의를 다 해놓고 있다.
에러가 났을 때 그 에러 코드를   리턴 해준다. 유닉스 소켓은 전역변수인 errno 란 변수에 에러코드가 들어가 있고 윈속은 WSAGetLastError( ) 함수를 호출해서 알수가 있다. 다음 코드를 보자

 

     먼저 유닉스 소켓 상에서 얻는 방법은  
         int sock;

           //얻기 실패하면 -1 을 리턴 한다
           sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
           if( socket < 0 )
           {
             printf( "socket() Error..--> Error Code %d\n", errno );
           }

     이고, 윈속은

           SOCKET sock;

           //얻기 실패하면 INVALIDE_SOCKET 을 리턴한다
          sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
           if( socket == INVALID_SOCKET )
           {
             printf( "socket() Error..Error --> Code %d\n", WSAGetLastError() );
           }

 

 

 

윈도우 소켓 에러  값 설명


WSAEINTR 10004

블럭킹 윈속이 WSACancelBlockingCall 함수에서 취소되었습니다


WSAEBADF 10009

잘못된 기술자(소켓 핸들)이다


WSAEACCES 10013

브로드캐스트 어드레스를 위한 데이터그램 소켓의 접속시도가 setsockopt 함수로 SO_BROADCAST가 설정되어있지 않은 상태에서 실패 했습니다.


WSAEFAULT 10014

name 또는 namelen 매개변수가 올바른 형태가 아닙니다.


WSAEINVAL 10022

accept 하기 전에 listen 함수가 불려지지 않았습니다.


WSAEMFILE 10024

새로운 소켓에 할당하기 위한 소켓 기술자가 더 이상 남아있지 않습니다


WSAEWOULDBLOCK 10035

소켓 함수가 비블럭킹 모드로 동작중이다


WSAEINPROGRESS 10036

블록화 함수가 호출 되는 동안 부적절한 소켓 함수가 호출되었다


WSAEALREADY 10037

이미 완료된 비동기 명령에 대한 취소가 시도됨


WSAENOTSOCK 10038

지정한 기술자가 소켓 기술자가 아닙니다


WSAEDESTADDRREQ 10039

해당 함수에 목적지 어드레스가 필요하지만 제공되지 않았음


WSAEMSGSIZE 10040

수신된 메시지가 지정된 버퍼에 저장하기에 너무 커서 손실 되었습니다


WSAEPROTOTYPE 10041

지정된 프로토콜이 잘못되었거나 이 소켓에 대해서 잘못된 형식입니다


WSAENOPROTOOPT 10042

알 수 없는 옵션이거나, 지원지지 않는 옵션을 사용했습니다.


WSAEPROTONOSUPPORT 10043

지정된 프로토콜이 지원되지 않는 형식입니다


WSAESOCKTNOSUPPORT 10044

지정된 소켓 타입이 지정한 어드레스 체계에서 지원되지 않는 형식입니다


WSAEOPNOTSUPP 10045

socket이 연결지향형 서비스(SOCK_STREAM)형태가 아닙니다. ex) listen이 UDP socket에서 호출


WSAEPFNOSUPPORT 10046

지정된 프로토콜 체계가(PF_*) 지원되지 않습니다


WSAEAFNOSUPPORT 10047

지정된 어드레스 체계가(AF_*) 지원되지 않습니다


WSAEADDRINUSE 10048

지정한 어드레스(IP)가 이미 사용중이다


WSAEADDRNOTAVAIL 10049

지정된 어드레스는 로컬 머신에서 사용할 수가 없다


WSAENETDOWN 10050

네트웍 서브 시스템에 에러가 발생했습니다


WSAENETUNREACH 10051

원격 시스템까지 네트웍이 도달할 수 없습니다


WSAENETRESET 10052

연산이 진행되고 있는 도중 접속이 끊겨버렸습니다.


WSAECONNABORTED 10053

연결이 out-of-band나 다른 실패 때문에 끊어져 버렸습니다.


WSAECONNRESET 10054

원격 연결지에서 "hard"나 "abortive" 종료를 수행해서 리셋되었습니다.


WSAENOBUFS 10055

윈도우 소켓 시스템의 버퍼 공간이 모자라거나, 애플리케이션에 의해 API에게 제공된 공간이 너무 작아서 요청된 정보를 저장 할 수가 없음


WSAEISCONN 10056

지정된 소켓이 이미 연결 되어 있음


WSAENOTCONN 10057

지정된 소켓이 이미 연결 되어 있지 않음


WSASHUTDOWN 10058

소켓이 셧다운(shutdown()) 되었습니다.


WSAETOOMANYREFS 10059

지정한 함수에 대한 인자가 너무 많음

 


WSAETIMEDOUT 10060

접속 시도가 시간초과 되었습니다.


WSAECONNREFUSED 10061

접속시도가 강제로 종료되었습니다


WSAELOOP 10062

 

WSAENAMETOOLONG 10063

 

WSAEHOSTDOWN 10064

원격 호스트가 다운 되었음


WSAHOSTUNREACH 10065

네트웍 시스템 장애 등에 의해서 원격호스트까지도 달 할 수 없습니다.


WSASYSNOTREADY 10091

네트워크 서브 시스템이 아직 통신할 준비가 되어 있지 않음(WSAStartup()이 반환)


WSAVERNOTSUPPORTED 10092

요청한 윈도우즈 소켓 버전이 현재 윈도우즈 소켓 시스템에서 지원하지 않습니다.


WSANOTINITIALISED 10093

이 함수를 사용하기 전에 성공적인 WSAStartup 함수의 호출이 없었습니다.


WSAHOST_NOT_FOUND 11001

호스트를 찾아낼 수 없습니다.


WSATRY_AGAIN 11002

요청된 정보가 발견 되지 않음


WSANO_RECOVERY  11003

회복할 수 없는 에러발생


WSANO_DATA 11004

잘못된 이름(name)으로 아무런 데이터가 기록되지 않았습니다.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

출처 : http://javawork.egloos.com/1997714

 

3가지 종류의 오픈소스 Memory pool을 테스트 해 봤습니다. Boost(1.34.0) singleton_pool,Loki(0.1.5) SmallObject, ACE(5.5) Dynamic_Cached_Allocator 입니다. 모두thread safe 옵션을 주지 않았습니다.


첫번째 방식은 (alloc, free)x10만번 입니다. 사이즈는 12, 32, 64, 128, 256 으로 변화를 주었습니다. 20번 수행해서 평균을 내었습니다.


ACE가 가장 빠르고 Boost, Loki 순입니다.

두번째 방식은 (alloc)x10만번 (free)x10만번 입니다.


 

첫번째 테스트와 마찬가지로 ACE가 가장 빠르고 Boost, Loki 순입니다. Loki는 사이즈가 커질수록 성능이급격히 나빠지는데 특히 free하는데 많은 시간이 걸렸습니다.(어느 Chunk에 free해야 하는지 찾는데 시간이 걸리는 것같습니다) 이름 자체도 SmallObject인 것으로 보아 알수 있듯이 작은 크기의 객체에 효과적이고, 또 하나의 요인은Modern C++에도 언급이 되어 있는데, 한꺼번에 대량으로 free하는 모델에 취약합니다.

위 테스트에서는ACE가 보편적으로 성능이 좋은 것으로 나오는데, 사실 테스트에 쓰인 ACE_Dynamic_Cached_Allocator는 고정사이즈만을 지원하고, Boost와 Loki는 가변 사이즈도 지원합니다.ACE에는 가변 사이즈를 지원하는 할당기는 없기 때문에따로 제작해서 사용해야 합니다. Modern C++의 작은 객체 할당기챕터에서 가변 사이즈의 할당을 지원하는 방법이 잘 설명되어있습니다. Loki의 SmallObject는 Chunk 계층,FixedAllocator 계층, SmallObjAllocator계층, SmallObject 계층 처럼 4계층으로 나누어서SmallObjAllocator 계층에서 가변 사이즈에 대한 처리가있습니다. 반면에 ACE의Dynamic_Cached_Allocator는 Chunk 계층과 FixedAllocator 계층만을제공하기 때문에 고정사이즈만을 지원합니다.


사용편의성은 Loki의SmallObject가 가장 편합니다. 그냥 SmallObject<>를 상속받기만 하면 되고 상속에 따른 문제도없습니다. ACE_Dynamic_Cached_Allocator는 고정 사이즈만을 지원하는 불편함도 있고, 최대 사이즈도설정해줘야 합니다. 프로그래밍의 대부분의 문제가 그렇듯이 사용편의성이냐 성능이냐의 Trade-off 문제인것 같습니다.


메모리의 할당 유형에 따른 성능 차이도 있습니다. Modern C++에서는 4가지의 유형으로 나누고 있습니다.

  1. 일괄 할당 및 해제
  2. 할당 순서와 동일한 순서로 발생하는 해제 작업(STL 할당자)
  3. 할당 순서와 역순으로 발생하는 해제 작업
  4. 불규칙한 할당과 해제

위 테스트에서 첫번째 유형이 4번이고(완전히 같지는 않습니다만 --;) 두번째 유형이 1번 입니다. SmallObject는 4번의상황에서 좋은 성능을 내고 1번의 상황에는 좋지 않은 성능을 보여줍니다. 4가지의 상황에서 모두 좋은 성능을 내면 좋겠지만대부분의 Memory pool들이 4번의 상황을 최선으로 고려하고 작성하는 것 같더군요. 위의 테스트에서도 첫번째 테스트보다 두번째 테스트가 평균 5배 정도 시간이 더 걸렸습니다. 현재 작성중인 프로그램의 메모리 사용 형태는 어느 유형에 가까운지 분석을 해보고 공개된 pool을 사용하거나 자신만의 pool을 작성하는 것이 좋을 것 같습니다.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

 

엑셀데이터를 엑셀버전 상관없이 가져오고싶을때.

Microsoft.ACE.OLEDB.12.0 프로바이더를 사용하면 깔끔하게 가져온다.

 

프로바이더 오류가 발생한다면 2007 Office System Driver: Data Connectivity Components 를 설치하면 된다.

 

http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en

 

 

m_strConn.Format(_T("PROVIDER=Microsoft.ACE.OLEDB.12.0;

"DATA SOURCE=%s;EXTENDED PROPERTIES=\"Excel 12.0;HDR=YES;\""), strFile);

 

 

 //=========================================================
 // ODBC 연결
 //=========================================================
 CDatabase dba;

 BOOL bOpen = dba.OpenEx(strODBCConn, CDatabase::noOdbcDialog);

 if(!bOpen)
 {
  MessageBox( _T("Source File이 엑셀 형식의 파일이 아닙니다!!"), _T("Word Learning") );

  return;
 }

 CRecordset rs(&dba);

 CString strQuery = _T("");

 strQuery = "select num, word, desc from [word$]";

 rs.Open(CRecordset::dynaset, strQuery);

 int nCount = 0;
 CString strWord = _T("");
 CString strDesc = _T("");

 while(!rs.IsEOF())
 {
  rs.GetFieldValue(_T("word"), strWord);
  rs.GetFieldValue(_T("desc"), strDesc);

 

  nCount++;

  rs.MoveNext();
 }

 dba.Close();

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

 

GetCurrentThreadId

The GetCurrentThreadId function retrieves the thread identifier of the calling thread.

DWORD GetCurrentThreadId(void);

Parameters

This function has no parameters.

Return Values

The return value is the thread identifier of the calling thread.

Remarks

Until the thread terminates, the thread identifier uniquely identifies the thread throughout the system.

Example Code

For an example, see Using Thread Local Storage.

Requirements

Client: Included in Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT Server.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

See Also

Processes and Threads Overview, Process and Thread Functions, GetCurrentThread, OpenThread

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,