ioLibrary 100% 활용하기 (2)


앞서 살펴 본 ioLibrary의 가장 큰 특징은 다음과 같다.

  • 모든 함수의 Success & Fail 처리 : SOCKET ERROR 시 상황 코드
  • Blocked & Non-Blocked I/O function
  • Datagram Data의 Flexible 처리

각 특징들이 어떻게 활용되는 하나씩 알아보자


SOCKET ERROR 시 상황 코드

SOCKET ERROR는 아래와 같이 정의된다.(socket.h 참조)

#define SOCK_OK 1 ///< Result is OK about socket process. 
#define SOCK_BUSY 0 ///< Socket is busy on processing the operation. Valid only Non-block IO Mode. 
#define SOCK_FATAL -1000 ///< Result is fatal error about socket process. 

#define SOCK_ERROR            0        
#define SOCKERR_SOCKNUM       (SOCK_ERROR - 1)     ///< Invalid socket number
#define SOCKERR_SOCKOPT       (SOCK_ERROR - 2)     ///< Invalid socket option
#define SOCKERR_SOCKINIT      (SOCK_ERROR - 3)     ///< Socket is not initialized or SIPR is Zero IP address when Sn_MR_TCP
#define SOCKERR_SOCKCLOSED    (SOCK_ERROR - 4)     ///< Socket unexpectedly closed.
#define SOCKERR_SOCKMODE      (SOCK_ERROR - 5)     ///< Invalid socket mode for socket operation.
#define SOCKERR_SOCKFLAG      (SOCK_ERROR - 6)     ///< Invalid socket flag
#define SOCKERR_SOCKSTATUS    (SOCK_ERROR - 7)     ///< Invalid socket status for socket operation.
#define SOCKERR_ARG           (SOCK_ERROR - 10)    ///< Invalid argument.
#define SOCKERR_PORTZERO      (SOCK_ERROR - 11)    ///< Port number is zero
#define SOCKERR_IPINVALID     (SOCK_ERROR - 12)    ///< Invalid IP address
#define SOCKERR_TIMEOUT       (SOCK_ERROR - 13)    ///< Timeout occurred
#define SOCKERR_DATALEN       (SOCK_ERROR - 14)    ///< Data length is zero or greater than buffer max size.
#define SOCKERR_BUFFER        (SOCK_ERROR - 15)    ///< Socket buffer is not enough for data communication.

#define SOCKFATAL_PACKLEN     (SOCK_FATAL - 1)     ///< Invalid packet length. Fatal Error.

Socket 함수를 호출하여 사용할 경우 함수 리턴 값을 항상 확인하고 Error 상황이 발생하였을 경우 이에 해당하는 Exception 처리를 습관화하자.

이는 실제 Network application 제품을 개발 할 경우 혹시 모를 필드테스트에서의 상황을 명확히 파악하여 방어적 코드를 구현함에 있어 많은 도움이 된다.

특히 Network application은 상대방과의 통신을 기본 전제로 하고 네트워크 자원 상황에 따라 수많은 Exception등이 발생할 수 있기 때문이다.

소켓 생성 시 발생할 수 있는 Error

 socket(sn, mode, port, flag) 
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
    • W5100 : 0 <= sn < 4
    • W5200, W5300, W5500 : 0 <= sn < 8
  • SOCKERR_SOCKOPT : 잘못된 flag(Socket Option) 사용
  • SOCKERR_SOCKINIT : TCP socket open 실패
    • Source IP address가 0.0.0.0 일 경우
  • SOCKERR_SOCKMODE : 지원하지 않는 Socket Mode를 사용
  • SOCKERR_PORTZERO : Source Port number가 0 일 경우

데이타 전송 시 발생할 수 있는 Error

 send(sn, buf, len)
 sendto(sn, buf, len, ip, port)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP(send)나 UDP(sendto) Mode가 아닌 경우
  • SOCKERR_TIMEOUT : 데이타 전송 타임아웃 발생
  • SOCKERR_DATALEN : 전송 데이타 크기가 0인 경우(send)나, 최대전송 크기를 초과한 경우(sendto)
  • SOCKERR_SOCKSTATUS : 전송 가능한 소켓 상태가 아닌 경우
  • SOCKERR_SOCKCLOSED : 소켓이 비정상적으로 Closed 된 경우
  • SOCKERR_IPINVALID : IP 주소가 비정상적인 경우(sendto)
  • SOCKERR_PORTZERO : 상대방 포트 번호가 0인 경우 (sendto)
  • SOCK_BUSY : 전송 버퍼가 비워지 않았을 경우 (Non-blocked Io mode 시)

데이타 수신 시 발생할 수 있는 Error

recv(sn,buf,len)
recvfrom(sn,buf,len,ip,port)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP(send)나 UDP(sendto) Mode가 아닌 경우
  • SOCKERR_SOCKSTATUS : 수신 가능한 상태가 아닌 경우
  • SOCKERR_SOCKCLOSED : 소켓이 비정상적으로 Closed 된 경우
  • SOCKERR_SOCKBUSY : 수신할 데이타가 없는 경우(Non-blocked IO mode 시)

소켓 연결 시 발생할 수 있는 Error

connect(sn,ip,port)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP가 아닌 경우
  • SOCKERR_IPINVALID : 상대방 IP 주소가 0.0.0.0인 경우
  • SOCKERR_PORTZERO : 상대방 Port number가 0 일 경우
  • SOCKERR_TIMEOUT : 상대방이 응답이 없이 없는 경우
  • SOCKERR_BUSY : 상대방의 응답을 기다리는 경우(Non-blocked IO)

소켓 연결 해제 시 발생할 수 있는 Error

disconnect(sn)
  • SOCKERR_SOCKNUM : 잘못된 Socket Number(sn) 사용 ( 0 <= sn < NUM)
  • SOCKERR_SOCKMODE : TCP가 아닌 경우(disconnect)
  • SOCKERR_TIMEOUT : 상대방이 응답이 없이 없는 경우(disconnect)
  • SOCKERR_BUSY : 상대방의 응답을 기다리는 경우(disconnect, Non-blocked IO)

블로그 이미지

MidnightCow

위즈네트 칩(W5300, W5200, W7100, W7500) 개발자

,