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) 개발자