위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

W5500 ioLibrary 100% 활용하기 (2)

재원 하 2015.06.08 17:50 조회 수 : 24




앞서 살펴 본 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)


 

ioLibrary 100% 활용하기 – 1

ioLibrary 100% 활용하기 – 2

ioLibrary 100% 활용하기 - 3

ioLibrary 100% 활용하기 - 4

출처 : 밤소의 잠못드는 밤 IoT 이야기