콘텐츠로 이동

2.15. 네트워크

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 타입의 데이터가 전달된다

#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;

프로토타입

M_Int32 MH_netConnect (void)

설명

인터넷 접근을 시도한다. 반환 값이 M_E_WOULDBLOCK일 경우에는 논블로킹 (NonBlocking)으로 인터넷 접근이 가능하게 되었다는 것을 의미한다. 인터넷 접근이 가능하게 되었을 경우는 MH_NETEV_NETWORK_OPEN 이벤트를 플랫폼에 전달해야 한다.어떠한 이유로든 인터넷 접근이 불가능하게 되면 MH_NETEV_NETWORK_CLOSE 이벤트를 플랫폼으로 전달 해야 한다.

매개 변수

없음

반환 값

성공

실패

  • M_E_WOULDBLOCK - 인터넷 접근이 가능하게 될 때까지 기다릴 필요가 있을 경우
  • M_E_INPROGRESS - 인터넷 접근 시도 중인 경우
  • M_E_ISCONN - 이미 인터넷 접근이 가능하게 되어 있는 경우
  • M_E_ERROR - 인터넷 접근 종료 중이거나 기타 이유로 실패 할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netClose (void)

설명

인터넷 접근을 종료 한다. 이 함수는 블로킹(blocking)함수이다. 인터넷 접근이 허용되 지 않은 상태에서도 이 함수는 성공을 리턴한다. 운영체제는 플랫폼이 MH_netClose() 를 호출한 이후에는 어떠한 소켓 API 를 통해서도 인터넷을 통한 데이터 통신이 불 가능하도록 해야 한다. 플랫폼은 MH_netClose() 가 불릴 때 네트워크를 사용하는 소 켓이 모두 종료되어 있는 것을 권고한다.

매개 변수

없음

반환 값

성공

실패

  • M_E_INPROGRESS - 인터넷 접근 종료 중인 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocket (M_Int32 domain, M_Int32 type)

설명

소켓을 얻어 온다. 이 함수가 리턴하는 소켓 식별자는 음수가 될 수 없다.

매개 변수

  • domain - [in] 인터넷 도메인일 경우 MH_AF_INET
  • type - [in] MH_SOCKET_STREAM(TCP 소켓), MH_SOCKET_DGRAM(UDP 소켓);

반환 값

성공

소켓 식별자 실패

  • M_E_NOTSUP - domain 혹은 type 을 지원하지 않는 경우
  • M_E_NOTCONN - 인터넷 접근이 불가능한 경우
  • M_E_NOSPACE - 소켓의 최대 할당 개수를 초과하여 더 이상 할당할 수 없는 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketConnect (M_Int32 fd, M_Int32 addr, M_Uint16 port)

설명

TCP 소켓을 서버에 연결 한다. 반환 값이 M_E_WOULDBLOCK일 경우에는 논블로킹 (NonBlocking)으로 소켓이 연결된다는 것을 의미하며, 소켓이 연결되었을 경우, MH_NETEV_SOCKET_CONNECT 이벤트를 플랫폼에 전달해야 한다

매개 변수

  • fd - [in] 소켓 식별자
  • addr - [in] 상대방 IP 주소. 네트워크 바이트 순서
  • port - [in] 상대방 포트 번호. 네트워크 바이트 순서

반환 값

성공

실패

  • M_E_INVALID - 주소가 0 인 경우
  • M_E_WODULDBLOCK - 소켓 연결이 설정될 때까지 기다려야 될 경우
  • M_E_NOTCONN - 인터넷 접근이 불가능해 진 경우
  • M_E_ISCONN - 이미 CONNECT되어 있는 경우
  • M_E_INPROGRESS - 서버와 연결시도 중인 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketRead (M_Int32 fd, M_Byte *buf, M_Int32 len)

설명

TCP를 통해 데이터를 읽는다. 반환 값이 0 이라면 EOF(End Of File)를 의미 한다. 반 환 값이 M_E_WOULDBLOCK일 경우에는 읽어 들일 데이터가 없다는 것을 의미한 다. 이 경우 데이터를 읽을 수 있는 시점에서 MH_NETEV_SOCKET_READ 이벤트가 플랫폼에 전달되어야 한다.

매개 변수

  • fd - [in] 소켓 식별자
  • buf - [out] 데이터의 버퍼 포인터
  • len - [in] 읽고자 하는 버퍼 크기

반환 값

성공

읽혀진 데이터 길이 실패

  • M_E_WOULDBLOCK - 읽어 들일 데이터가 없는 경우
  • M_E_NOTCONN - 소켓이 연결되지 않았거나 인터넷 접근이 불가능한 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketWrite (M_Int32 fd, M_Byte *buf, M_Int32 len)

설명

TCP 소켓을 통해 데이터를 보낸다. 반환 값이 M_E_WOULDBLOCK일 경우에는 시스 템 내부요인으로 지금 당장 데이터를 전송할 수 없다는 것을 의미한다. 이 경우 데이 터를 전송할 수 있는 시점에서 MH_NETEV_SOCKET_WRITE 이벤트가 플랫폼에 전 달되어야 한다.

매개 변수

  • fd - [in] 소켓 식별자
  • buf - [in] 데이터의 버퍼 포인터
  • len - [in] 데이터의 size

반환 값

성공

전송한 길이 실패

  • M_E_WODULDBLOCK - 시스템 내부 요인으로 지금 당장 데이터를 전송할 수 없는 경우
  • M_E_NOTCONN - 소켓이 연결되지 않은 경우나 인터넷 접근이 불가능해진 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketBind (M_Int32 fd, M_Uint32 addr, M_Uint16 port)

설명

소켓에 local port를 지정한다.

매개 변수

  • fd - [in] 소켓 식별자
  • addr - [in] 상대방 IP 주소. 네트워크 바이트 순서
  • port - [in] 로컬 포트번호로 네트워크 바이트 순서이다

반환 값

성공

실패

  • M_E_INVALID - 주소나 포트가 잘 못된 경우
  • M_E_ISCONN - 이미 포트가 지정되어 있는 경우
  • M_E_NOTCONN - 인터넷 연결이 불가능해진 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketSendTo (M_Int32 fd,M_Byte *buf,M_Int32 len,
M_Int32 addr,M_Uint16 port,)

설명

UDP소켓을 통해 data를 전송한다. 반환 값이 M_E_WOULDBLOCK일 경우에는 시스 템 내부 요인으로 지금 당장 전송할 수 없다는 것을 의미한다. 이 경우 데이터를 전 송할 수 있는 시점에서 MH_NETEV_SOCKET_WRITE 이벤트가 플랫폼에 전달되어야 한다.

매개 변수

  • fd - [in] 소켓 식별자 값
  • buf - [in] 데이터의 버퍼 포인터
  • len - [in] 데이터의 size
  • addr - [in] 상대방 IP 주소. 네트워크 바이트 순서
  • port - [in] 상대방 포트번호. 네트워크 바이트 순서

반환 값

성공

전송한 데이터 길이 실패

  • M_E_WOULDBLOCK - 전송할 수 있을 때까지 기다려야 하는 경우
  • M_E_NOTCONN - 인터넷 접근이 불가능한 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketRcvFrom (M_Int32 fd, M_Byte *buf, M_Int32 len,
M_Int32 *addr,M_Uint16 *port)

설명

UDP소켓을 통해 데이터를 수신한다.반환 값이 M_E_WOULDBLOCK일 경우에는 읽 어 들일 데이터가 없다는 것을 의미한다. 이 경우 데이터를 읽을 수 있는 시점에서 MH_NETEV_SOCKET_READ 이벤트가 플랫폼에 전달되어야 한다.

매개 변수

  • fd - [in] 소켓 식별자 값
  • buf - [out] 데이터의 버퍼 포인터
  • len - [in] 데이터의 size
  • addr - [out] 상대방 IP 주소. 네트워크 바이트 순서
  • port - [out] 상대방 포트번호. 네트워크 바이트 순서

반환 값

성공

수신된 데이터 길이 실패

  • M_E_WOULDBLOCK - 읽어 들일 데이터가 없는 경우
  • M_E_NOTCONN - 인터넷 접근이 불가능한 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketClose (M_Int32 fd)

설명

소켓을 종료한다. 이 함수는 블로킹 함수이다.

매개 변수

  • fd - [in] 소켓 식별자 값

반환 값

성공

실패

  • M_E_INPROGRESS - 이미 종료 중인 경우
  • M_E_NOTCONN - 인터넷 접근이 불가능한 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netGetMaxPacketLength (void)

설명

송수신할 수 있는 UDP 패킷의 최대 길이를 얻어 온다.

매개 변수

없음

반환 값

패킷길이

부작용

없음

참고 항목

없음

프로토타입

M_Int32 MH_netSocketAccept (M_Int32 fd)

설명

TCP 서버 소켓이 클라이언트와 연결된 소켓을 리턴한다. 이 함수가 불리기 전에 MH_netSocketBind() 로 로컬 포트를 지정해야 한다. 이 함수가 M_E_WOULDBLOCK 을 리턴하면 나중에 클라이언트와 연결된 소켓이 생길 경우 운영체제는 플랫폼에 MH_NETEV_SOCKET_CONNECT 이벤트를 전달해야 한다. 이 함수 지원은 플랫폼 구현의 선택사항이다.

매개 변수

  • fd - – TCP 서버소켓 식별자

반환 값

성공

클라이언트와 연결된 소켓 식별자 실패

  • M_E_WOULDBLOCK - 클라이언트와 연결될 때까지 기다려야 할 경우
  • M_E_NOTSUP - 플랫폼이 이 함수를 지원하지 않거나 이 함수를 지원하지 않는 소켓일 경우
  • M_E_NOTCONN - 인터넷 접근이 불가능한 경우
  • M_E_ERROR - 기타 이유로 실패할 경우

부작용

없음

참고 항목

없음