4.6. 네트워크
TCP/IP 인터넷 통신을 지원하는 함수들을 정의한 것이다.
플랫폼은 TCP/IP 인터넷 통신을 위해 단일한 네트웍 인터페이스를 지원한다. 플 랫폼은 MH_netConnect() 함수를 호출하여 인터넷 사용이 가능해 진 후부터 소켓 관련 API 를 통해 인터넷으로 데이터 통신이 가능하게 해야 한다. 플랫폼이 MH_netClose() 를 호출한 이후에는 어떠한 소켓 API 를 통해서도 인터넷을 통한 데이터 통신이 불가능하도록 해야 한다. 플랫폼은 MH_netClose() 가 불릴 때 네트웍을 사용하는 소켓이 모두 종료되어 있어야 함을 권고한다.
네트웍의 특성상 네트워크 API 를 호출한 후 상당시간 블로킹(blocking)할 경우에 그 시간 동안 플랫폼이 정지하는 현상이 발생 할 수 있으므로, 네트워크 API 는 MH_netClose() 와 MH_netSocketClose() 를 제외하고 모두 논블로킹 (NonBlocking) 함수로 구현 되어야 한다. MH_netClose() 와 MH_netSocketClose()가 블로킹 이라 함은 이 함수를 호출한 후에 이 함수호출에 관련한 이벤트가 플랫폼에 전달되지 않는다는 것을 의미한다.
네트웍 API 를 호출하고 I/O 이벤트가 발생하면 이 이벤트 관련 정보가 플랫폼에 전달되어야 하는데 이때 호출하는 함수는 MH_pltEvent() 이며 매개변수로 MH_NETWORK_EVENT 와 MH_NetEvent 타입의 데이터가 전달된다
관련 자료형
섹션 제목: “관련 자료형”// 인터넷 도메인임을 가르키는 상수. 값은 2#define MH_AF_INET 2
// TCP/UDP 소켓을 구분하는 상수
typedef enum MH_SOCKET_TYPE{ MH_SOCKET_STREAM =1, // TCP SOCKET MH_SOCKET_DGRAM // UDP SOCKET} MH_SOCKET_TYPE;
//네트웍 이벤트typedef enum MH_SUB_NETWORK_EVENT { MH_NETEV_NETWORK_OPEN = 0x01, // 네트웍 연결 이벤트 MH_NETEV_NETWORK_CLOSE = 0x02, // 네트웍 종료 이벤트 MH_NETEV_SOCKET_CONNECT = 0x04, // SOCKET 연결이벤트 MH_NETEV_SOCKET_CLOSE = 0x08, // SOCKET 종료 이벤트 MH_NETEV_SOCKET_READ = 0x10, // SOCKET READ 이벤트 MH_NETEV_SOCKET_WRITE = 0x20, // SOCKET WRITE 이벤트} MH_SUB_NETWORK_EVENT;
//네트웍 이벤트를 전달하는 구조체typedef struct MH_NetEvent{ M_Int32 fd; // 소켓 식별자 M_Int32 event; //발생된 event, MH_SUB_NETWORK_EVENT 값} MH_NetEvent;MH_netConnect
섹션 제목: “MH_netConnect”설명
인터넷 접근을 시도한다. 반환 값이 M_E_WOULDBLOCK 일 경우에는 논블로킹 (NonBlocking)으로 인터넷 접근이 가능하게 되었다는 것을 의미한다. 인터넷 접근 이 가능하게 되었을 경우는 MH_NETEV_NETWORK_OPEN 이벤트를 플랫폼에 전달해야 한다.어떠한 이유로든 인터넷 접근이 불가능하게 되면 MH_NETEV_NETWORK_CLOSE 이벤트를 플랫폼으로 전달 해야 한다.
프로토타입
M_Int32 MH_netConnect (void)매개 변수
없음
반환 값
성공
- 0
실패
M_E_WOULDBLOCK–인터넷 접근이 가능하게 될 때까지 기다릴 필요가 있을 경우M_E_INPROGRESS–인터넷 접근 시도 중인 경우M_E_ISCONN– 이미 인터넷 접근이 가능하게 되어 있는 경우M_E_ERROR- 인터넷 접근 종료 중이거나 기타 이유로 실패할 경우
부작용
없음.
참고 항목
없음
MH_netClose
섹션 제목: “MH_netClose”설명
인터넷 접근을 종료 한다. 이 함수는 블로킹(blocking)함수이다. 인터넷 접근이 허용되지 않은 상태에서도 이 함수는 성공을 리턴한다. 운영체제는 플랫폼이 MH_netClose() 를 호출한 이후에는 어떠한 소켓 API 를 통해서도 인터넷을 통한 데이터 통신이 불가능하도록 해야 한다. 플랫폼은 MH_netClose() 가 불릴 때 네트웍을 사용하는 소켓이 모두 종료되어 있는 것을 권고한다.
프로토타입
M_Int32 MH_netClose (void)매개 변수
없음
반환 값
성공
- 0
실패
M_E_INPROGRESS- 인터넷 접근 종료 중인 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음.
참고 항목
없음
MH_netSocket
섹션 제목: “MH_netSocket”설명
소켓을 얻어 온다. 이 함수가 리턴하는 소켓 식별자는 음수가 될 수 없다.
프로토타입
M_Int32 MH_netSocket (M_Int32 domain, M_Int32 type)매개 변수
domain- [in] 인터넷 도메인일 경우MH_AF_INETtype- [in]MH_SOCKET_STREAM(TCP 소켓), `MH_SOCKET_DGRAM(UDP 소켓);
반환 값
성공
- 소켓 식별자
실패
M_E_NOTSUP– domain 혹은 type 을 지원하지 않는 경우M_E_NOTCONN– 인터넷 접근이 불가능한 경우.M_E_NOSPACE– 소켓의 최대 할당 개수를 초과하여 더 이상 할당할 수 없는 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketConnect
섹션 제목: “MH_netSocketConnect”설명
TCP 소켓을 서버에 연결 한다. 반환 값이 M_E_WOULDBLOCK 일 경우에는 논블로킹 (NonBlocking)으로 소켓이 연결된다는 것을 의미하며, 소켓이 연결되었을 경우, MH_NETEV_SOCKET_CONNECT 이벤트를 플랫폼에 전달해야 한다
프로토타입
M_Int32 MH_netSocketConnect (M_Int32 fd, M_Int32 addr, M_int16 port)매개 변수
fd- [in] 소켓 식별자addr- [in] 상대방 IP 주소로 네트웍 바이트 순서(network byte ordering)이 다.port- [in] 상대방 포트 번호로 네트웍 바이트 순서(network byte ordering) 이다
반환 값
성공
- 0
실패
M_E_INVALID– 주소가 0 인 경우M_E_WODULDBLOCK– 소켓 연결이 설정될 때까지 기다려야 될 경우M_E_NOTCONN- 인터넷 접근이 불가능해 진 경우M_E_ISCONN- 이미 CONNECT 되어 있는 경우M_E_INPROGRESS- 서버와 연결시도 중인 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketRead
섹션 제목: “MH_netSocketRead”설명
TCP 를 통해 데이터를 읽는다. 반환 값이 0 이라면 EOF(End Of File)를 의미 한다. 반환 값이 M_E_WOULDBLOCK 일 경우에는 읽어 들일 데이터가 없다는 것을 의미한 다. 이 경우 데이터를 읽을 수 있는 시점에서 MH_NETEV_SOCKET_READ 이벤트가 플랫폼에 전달되어야 한다.
프로토타입
M_Int32 MH_netSocketRead (M_Int32 fd, M_Byte *buf, M_Int32 len)매개 변수
fd- [in] 소켓 식별자buf- [out] 데이터의 버퍼 포인터len- [in] 읽고자 하는 버퍼 크기
반환 값
성공
- 읽혀진 데이터 길이
실패
M_E_WOULDBLOCK– 읽어 들일 데이터가 없는 경우M_E_NOTCONN– 소켓이 연결되지 않은 경우거나 인터넷 접근이 불가능해진 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketWrite
섹션 제목: “MH_netSocketWrite”설명
TCP 소켓을 통해 데이터를 보낸다. 반환 값이 M_E_WOULDBLOCK 일 경우에는 시스템 내부요인으로 지금 당장 데이터를 전송할 수 없다는 것을 의미한다. 이 경우 데이터를 전송할 수 있는 시점에서 MH_NETEV_SOCKET_WRITE 이벤트가 플랫폼에 전달되 어야 한다.
프로토타입
M_Int32 MH_netSocketWrite (M_Int32 fd, M_Byte *buf, M_Int32 len)매개 변수
fd- [in] 소켓 식별자buf- [in] 데이터의 버퍼 포인터len- [in] 데이터의 size
반환 값
성공
- 전송한 길이
실패
M_E_WODULDBLOCK– 시스템 내부 요인으로 지금 당장 데이터를 전송할 수 없는 경우M_E_NOTCONN- 소켓이 연결되지 않은 경우나 인터넷 접근이 불가능해진 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketBind
섹션 제목: “MH_netSocketBind”설명
소켓에 local port 를 지정한다.
프로토타입
M_Int32 MH_netSocketBind (M_Int32 fd, M_Int16 port)매개 변수
fd- [in] 소켓 식별자port- [in] 로컬 포트번호로 네트웍 바이트 순서(network byte ordering)이다
반환 값
성공
- 0
실패
M_E_INVALID- 주소나 포트가 잘못된 경우M_E_ISCONN- 이미 포트가 지정되어 있는 경우M_E_NOTCONN–인터넷 연결이 불가능해진 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketSendTo
섹션 제목: “MH_netSocketSendTo”설명
UDP 소켓을 통해 data 를 전송한다. 반환 값이 M_E_WOULDBLOCK 일 경우에는 시스템 내부 요인으로 지금 당장 전송할 수 없다는 것을 의미한다. 이 경우 데이터를 전송할 수 있는 시점에서 MH_NETEV_SOCKET_WRITE 이벤트가 플랫폼에 전달되어야 한다.
프로토타입
M_Int32 MH_netSocketSendTo ( M_Int32 fd, M_Byte *buf, M_Int32 len, M_Int32 addr, M_Int16 port)매개 변수
fd- [in] 소켓 식별자 값buf- [in] 데이터의 버퍼 포인터len- [in] 데이터의 sizeaddr- [in] 상대방 IP 주소. 네트웍 바이트 순서(network byte ordering)port- [in] 상대방 포트번호. 네트웍 바이트 순서(network byte ordering)
반환 값
성공
- 전송한 데이터 길이
실패
M_E_WOULDBLOCK– 전송할 수 있을 때 까지 기다려야 하는 경우M_E_NOTCONN– 인터넷 접근이 불가능한 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketRcvFrom
섹션 제목: “MH_netSocketRcvFrom”설명
UDP 소켓을 통해 데이터를 수신한다. 반환 값이 M_E_WOULDBLOCK 일 경우에는 읽어 들일 데이터가 없다는 것을 의미한다. 이 경우 데이터를 읽을 수 있는 시점에서 MH_NETEV_SOCKET_READ 이벤트가 플랫폼에 전달되어야 한다.
프로토타입
M_Int32 MH_netSocketRcvFrom (M_Int32 fd, M_Byte *buf, M_Int32 len, M_Int32 *addr, M_Int16 *port)매개 변수
fd- [in] 소켓 식별자 값buf- [out] 데이터의 버퍼 포인터len- [in] 데이터의 sizeaddr- [out] 상대방 IP 주소. 네트웍 바이트 순서(network byte ordering)port- [out] 상대방 포트번호. 네트웍 바이트 순서(network byte ordering)
반환 값
성공
- 수신된 데이터 길이
실패
M_E_WOULDBLOCK– 읽어 들일 데이터가 없는 경우M_E_NOTCONN–인터넷 접근이 불가능한 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netSocketClose
섹션 제목: “MH_netSocketClose”설명
소켓을 종료한다. 이 함수는 블로킹(blocking)함수이다.
프로토타입
M_Int32 MH_netSocketClose(M_Int32 fd)매개 변수
fd- [in] 소켓 식별자값
반환 값
성공
- 0
실패
M_E_INPROGRESS– 이미 종료 중인 경우M_E_NOTCONN– 인터넷 접근이 불가능한 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음
MH_netGetMaxPacketLength
섹션 제목: “MH_netGetMaxPacketLength”설명
송수신할 수 있는 UDP 패킷의 최대 길이를 얻어 온다.
프로토타입
M_Int32 MH_netGetMaxPacketLength (void)매개 변수
없음
반환 값
패킷길이
부작용
없음
참고 항목
없음
MH_netSocketAccept
섹션 제목: “MH_netSocketAccept”설명
TCP 서버 소켓이 클라이언트와 연결된 소켓을 리턴한다. 이 함수가 불리기 전에 MH_netSocketBind() 로 로컬 포트를 지정해야 한다. 이 함수가 M_E_WOULDBLOCK 을 리턴하면 나중에 클라이언트와 연결된 소켓이 생길 경우 운영체제는 플랫폼에 MH_NETEV_SOCKET_CONNECT 이벤트를 전달해야 한다. 이 함수 지원은 플랫폼 구현의 선택사항이다.
프로토타입
M_Int32 MH_netSocketAccept (M_Int32 fd)매개 변수
fd- TCP 서버소켓 식별자
반환 값
성공
- 클라이언트와 연결된 소켓 식별자
실패
M_E_WOULDBLOCK– 클라이언트와 연결될 때 까지 기다려야 할 경우M_E_NOTSUP– 플랫폼이 이 함수를 지원하지 않거나 이 함수를 지원하지 않는 소켓일 경우M_E_NOTCONN– 인터넷 접근이 불가능한 경우M_E_ERROR- 기타 이유로 실패할 경우
부작용
없음
참고 항목
없음