소켓은 각 함수가 에러가 발생하면 유닉스의 경우는 -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 키르히아이스
,