16. INetMgr, ISocket API

Post on 02-Feb-2016

43 views 0 download

description

16. INetMgr, ISocket API. INetMgr 인터페이스 INetMgr 인터페이스 함수는 장치의 네트워크 하위 시스템과 관련된 매개 변수를 가져오고 설정하는 메커니즘을 제공한다 . 이 함수를 사용하면 네트워크를 통해 데이터를 보내고 받는데 TCP 또는 UDP 를 사용하는 여러 개의 ISocket 인터페이스를 만들 수 있다 . ISocket 인터페이스 - PowerPoint PPT Presentation

Transcript of 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 1

16. INetMgr, ISocket API

INetMgr 인터페이스 INetMgr 인터페이스 함수는 장치의 네트워크 하위 시스템과 관련된 매개

변수를 가져오고 설정하는 메커니즘을 제공한다 .

이 함수를 사용하면 네트워크를 통해 데이터를 보내고 받는데 TCP 또는 UDP를 사용하는 여러 개의 ISocket 인터페이스를 만들 수 있다 .

ISocket 인터페이스 ISocket 인터페이스는 INETMGR_OpenSocket() 을 사용하여 열린 TCP 및 UDP

소켓을 연결하고 , 소켓을 통해 데이터를 전송하고 받으며 , 닫는 방법을 제공한다 .

이 인터페이스에서 함수를 호출하려면 응용 프로그램에 Network 또는 All 의 권한 수준이 있어야 한다 .

16.1 INetMgr, ISocket 인터페이스를 이용하여 서버에 접속하기

임베디드 모바일 프로그래밍 2

16. INetMgr, ISocket API

INETMGR_OpenSocket 함수

• 소켓을 만들고 ISocket 인터페이스에 대한 포인터를 반환합니다 .

함수 형식ISocket * INETMGR_OpenSocket(INetMgr *pINetMgr, NetSocket Type)

기 능 소켓 생성을 위해 사용한다 .

매개변수pINetMgr 소켓을 만드는 데 사용되는 INetMgr 인터페이스 개체에 대한 포인터

Type소켓 종류를 지정한다 . TCP 용 AEE_SOCK_STREAM, UDP 용 AEE_SOCK_DGRAM 각각 스트림이나 데이터그램 소켓에 해당한다 .

반환값포인터 성공하면 ISocket 인터페이스에 대한 유효한 포인터를 반환한다 .

NULL실패하면 NULL 을 반환한다 . 이 경우 특정 오류 코드는 INETMGR_GetLastError() 를 호출하여 검색할 수 있다 .

임베디드 모바일 프로그래밍 3

16. INetMgr, ISocket API

ISOCKET_Connect 함수

• 유형이 AEE_SOCK_STREAM 소켓인 경우 , 이 함수는 지정된 주소와 포트에 대한 TCP 연결을 초기화를 시도한다 .

• 인터넷 연결을 설정한 후에 호출된 콜백 함수에는 연결 작업이 완료된 방식을 설명하는 오류 코드가 전달된다 .

함수 형식int ISOCKET_Connect(ISocket * pISocket, INAddr a, INPort wPort, PFNCONNECTCB pfn, void * pUser)

기 능 특정 서버 IP 와 포트에 네트워크 연결을 설정

매개변수

pISocket ISocket 인터페이스 개체에 대한 포인터

a IP 주소wPort 포트

pfn 연결 작업이 성공하거나 실패한 경우 AEE 에서 호출하는 콜백 함수의 주소

pUser 호출될 때 콜백 함수로 전달되는 사용자 정의 데이터

반환값AEE_NET_SUCCESS 성공AEE_NET_ERROR 실행 실패

임베디드 모바일 프로그래밍 4

16. INetMgr, ISocket API ISOCKET_Write 함수

• 단일 버퍼에서 연결된 소켓에 데이터를 기록한다 .

• 이 함수는 항상 기록한 바이트 수를 즉시 반환한다 .

• 기록한 바이트가 없고 연결은 계속 활성화되어 있으면 ISOCKET_Write() 함수는 AEE_NET_WOULDBLOCK 을 반환한다 .

• 다시 호출할 시기에 대한 알림을 받으려면 호출자는 ISOCKET_Writeable() 을 호출해야 한다 .

ISOCKET_Read 함수• 매개 변수로 지정된 단일 버퍼로 소켓에서 데이터를 읽어 온다 .

• 이 함수는 항상 결과를 즉시 반환한다 .

• 사용할 수 있는 데이터가 없고 연결이 계속 활성화되어 있으면 ISOCKET_Read() 는 AEE_NET_WOULDBLOCK 을 반환한다 .

• ISOCKET_Read() 를 다시 호출할 시기에 대한 알림을 받으려면 호출자는 ISOCKET_Readable() 을 호출해야 한다 .

임베디드 모바일 프로그래밍 5

16. INetMgr, ISocket API

함수 형식int32 ISOCKET_Write(ISocket * pISocket, byte * pBuffer, uint32 wBytes)

기 능 연결된 소켓에 데이터를 쓴다 .

매개변수pISocket ISocket 인터페이스 개체에 대한 포인터

pBuffer 데이터가 전송될 버퍼에 대한 포인터wBytes 버퍼의 크기를 바이트 수

반환값

바이트 수 성공한 경우 , 소켓에 쓴 바이트 수AEE_NET_WOULDBLOC

K현재 쓸 바이트가 없는 경우

AEE_NET_ERROR 바이트를 작성하는 데 실패한 경우

ISocket_Writable()

• 소켓에서 비블록킹 쓰기 작업을 처리해야 할 때 AEE 에서 호출된 콜백 함수를 등록하는 함수

• 콜백 후 쓰기 함수가 반드시 처리되는 것은 아니므로 쓰기 함수에서 AEE_NET_WOULDBLOK 를 반환할 경우 호출자는 항상 ISocket_Writable() 을 다시 호출할 준비를 해야 한다 .

임베디드 모바일 프로그래밍 6

16. INetMgr, ISocket API

함수 형식int32 ISOCKET_Read(ISocket * pISocket, byte * pbDest, uint32 wSize)

기 능 연결된 소켓으로부터 데이터를 읽어 버퍼에 저장한다 .

매개변수

pISocket ISocket 인터페이스 개체에 대한 포인터

pbDest 받을 데이터를 넣을 버퍼에 대한 포인터

wSize 읽을 바이트 수

반환값

바이트 수 소켓에서 읽어들인 바이트 수

0 더 이상 받을 데이터가 없고 상대방이 연결을 끊은 경우

AEE_NET_WOULDBLOCK

현재 사용할 수 있는 데이터가 없는 경우

AEE_NET_ERROR 소켓이 데이터를 읽을 수 있는 상태가 아닌 경우

임베디드 모바일 프로그래밍 7

16. INetMgr, ISocket API ISOCKET_Readable 함수

• 응용 프로그램은 지정된 소켓에서 비블록킹 (non-blocking) 읽기 작업 (Accept, Read, ReadV 또는 RecvFrom) 을 처리해야 할 때 , 이 함수를 사용하여 AEE 에서 호출된 콜백 함수를 등록할 수 있다 .

함수 형식void ISOCKET_Readable(ISocket * pISocket, PFNNOTIFY pfn, void * pUser)

기 능 소켓에서 비블록킹 읽기 작업을 처리해야 하는 경우 AEE 에서 호출한 콜백 함수를 등록하는 함수

매개변수

pISocket ISocket 인터페이스 개체에 대한 포인터

pfn

콜백 함수의 주소 . 이 함수는 소켓을 읽을 준비가 되거나 닫을 준비가 되면 AEE 에서 호출한다 . 이 값이 NULL 이면 이전의 ISOCKET_Readable 호출에 의해 등록된 콜백 함수가 있을 경우 이 함수를 취소한다 . pfn 이 NULL 로 전달되면 항상 AEE_NET_SUCCESS 를 반환합니다 .

pUser 호출될 때 콜백 함수로 전달되는 사용자 정의 데이터

반환값 없 음

임베디드 모바일 프로그래밍 8

16. INetMgr, ISocket API

16.2 INetMgr, ISocket API 예제 프로그램 클라이언트 (NetworkSample)

/*===============================================================================INCLUDES AND VARIABLE DEFINITIONS=============================================================================== */#include "AEEModGen.h" // Module interface definitions#include "AEEAppGen.h" // Applet interface definitions#include "AEEShell.h" // Shell interface definitions#include "AEEFile.h" // File interface definitions#include "AEENet.h" // Socket interface definitions

#include "AEEStdLib.h"#include "AEEMenu.h"#include "AEEDisp.h"

#include "NetworkSample.bid"

#define MENU_EVT_CONNECT 401

typedef enum{ NET_NONE, NET_GETHOST, NET_CONNECT} NetProcess;

임베디드 모바일 프로그래밍 9

16. INetMgr, ISocket API

typedef struct _CINetworkSample{

AEEApplet a; // Mandatory first AEEApplet data memberIMenuCtl* m_pIMenu;ISocket * m_pISocket;INetMgr * m_pINetMgr;

AEECallback cbkLookup;INAddr addrsLookup[8];

int m_nLineHeight;AEEDeviceInfo m_dInfo;INPort wPort;INAddr dwAddr;NetProcess status;

// uint16 APIFnType; // Storage for API function type selected // by user.} CINetworkSample;

#define USAGE_HOST "203.250.33.57" #define USAGE_PORT 4444 // Server echo port

// A few utility macros; #define ISDIGIT(c) ( (unsigned) ((c) - '0') < 10)#define ISALPHA(c) ( (unsigned) ( ((c)|32) - 'a') < 26 )#define ISALNUM(c) ( ISDIGIT(c) || ISALPHA(c) )#define min(a,b) ((a) < (b) ? (a) : (b))#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))

IP 소켓 또는 종점의 IP 주소에 대한 네트워크

바이트 값을 나타낸다 . typedef uint32 INAddr;

임베디드 모바일 프로그래밍 10

16. INetMgr, ISocket API/*-------------------------------------------------------------------Function Prototypes-------------------------------------------------------------------*/static boolean NetworkSample_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam);

static void DisplayMenu(CINetworkSample *pMe);static boolean NetworkSample_InitAppData(IApplet* pi);static void NetworkSample_FreeAppData(IApplet* pi);static void DisplayOutput(IApplet * pMe, int nline, char *pszStr, RGBVAL clrColor);void CommonConnectCB(void * pUser, int iError);void CommonReadCBFn (void *pUser);void CommonWriteCBFn(void *pUser);void DisconnectSocket(CINetworkSample * pMe);

INAddr ConvertToINAddr(char *psz);void ConvertToIPAddr(INAddr inaddr, char *psz);

int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj){ *ppObj = NULL;

if(ClsId == AEECLSID_NETWORKSAMPLE){ if(AEEApplet_New(sizeof(CINetworkSample), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)NetworkSample_HandleEvent,(PFNFREEAPPDATA)NetworkSample_FreeAppData) == TRUE) {

// Add your code here ..... if (NetworkSample_InitAppData((IApplet*)*ppObj) == TRUE)

return (AEE_SUCCESS); } }

return (EFAILED);}

임베디드 모바일 프로그래밍 11

16. INetMgr, ISocket APIstatic boolean NetworkSample_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam){

CINetworkSample * pMe = (CINetworkSample *)pi;

switch (eCode) {

case EVT_APP_START: {

DisplayMenu(pMe); return(TRUE);

} case EVT_KEY:

if (pMe->m_pIMenu){

if ((IMENUCTL_IsActive(pMe->m_pIMenu) == FALSE) && (wParam == AVK_RIGHT))

{DisconnectSocket(pMe);IMENUCTL_SetActive(pMe->m_pIMenu, TRUE);IMENUCTL_Redraw(pMe->m_pIMenu);

} return IMENUCTL_HandleEvent(pMe->m_pIMenu, EVT_KEY, wParam, 0);}else

return FALSE; case EVT_APP_STOP:

// Add your code here .....

return TRUE;

임베디드 모바일 프로그래밍 12

16. INetMgr, ISocket API case EVT_COMMAND:

{ switch(wParam) {

case MENU_EVT_CONNECT:{

INetMgr * pINetMgr = NULL;ISocket * pISocket = NULL;int iRetVal;

INAddr nodeINAddr;uint16 nPort;

IDISPLAY_ClearScreen (pMe->a.m_pIDisplay);

IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW);

IMENUCTL_SetActive(pMe->m_pIMenu, FALSE);

DisplayOutput((IApplet *)pMe, 1, "INetMgr, ISocket 이용하기 ", MAKE_RGB(0,0,0));

ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_NET, (void **)&pINetMgr);

pISocket = INETMGR_OpenSocket (pINetMgr, AEE_SOCK_STREAM);

pMe->m_pINetMgr = pINetMgr;pMe->m_pISocket = pISocket;

nodeINAddr = ConvertToINAddr(USAGE_HOST);

nPort = HTONS(USAGE_PORT);

호스트 바이트 순서와 네트워크 바이트 순서 간의 변환을 수행한다 .

임베디드 모바일 프로그래밍 13

16. INetMgr, ISocket APIif((iRetVal = ISOCKET_Connect (pISocket, n

odeINAddr, nPort, CommonConnectCB, (void *)pMe)) != AEE_NET_SUCCESS){

DisplayOutput((IApplet *)pMe, 7, "Network Error", MAKE_RGB(0xff, 0, 0));

}pMe->status = NET_CONNECT;return TRUE;

} default:

return TRUE; }

} default: break; } return FALSE;}

static void DisplayMenu(CINetworkSample *pMe){

AEERect rc;AECHAR szBuf[50];AEEMenuColors mclr;

if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MENUCTL, (void **)&pMe->m_pIMenu) != SUCCESS)return;

// Set display rectangleSETAEERECT (&rc, 0, 0, pMe->m_dInfo.cxScreen, pMe->m_dInfo.cyScreen);

임베디드 모바일 프로그래밍 14

16. INetMgr, ISocket API// 선택된 메뉴의 색상을 설정한다 . mclr.wMask = (MC_BACK | MC_TEXT | MC_SEL_BACK | MC_SEL_TEXT | MC_FRAME);

mclr.cBack = RGB_WHITE;mclr.cText = RGB_BLACK;mclr.cSelBack = MAKE_RGB (146, 109, 255);mclr.cSelText = RGB_BLACK;mclr.cFrame = RGB_WHITE;

IMENUCTL_SetColors (pMe->m_pIMenu, &mclr);

// 메뉴 컨트롤의 타이틀을 생성한다STREXPAND((byte *)"INegMgr, ISocket", STRLEN("INegMgr, ISocket"), szBuf, sizeof(szBuf));IMENUCTL_SetTitle(pMe->m_pIMenu, NULL, 0, szBuf);IMENUCTL_SetRect(pMe->m_pIMenu, &rc);

STREXPAND((byte *)"1. 서버에 연결하기 ", STRLEN("1. 서버에 연결하기 "), szBuf, sizeof(szBuf));IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVT_CONNECT, szBuf, 0);

IMENUCTL_SetActive(pMe->m_pIMenu,TRUE);}

static boolean NetworkSample_InitAppData(IApplet* pi){

CINetworkSample* pMe = (CINetworkSample*)pi;int pnAscent = 0;int pnDescent = 0;// Initialize the MenuCtl pointer to NULLpMe->m_pIMenu = NULL;pMe->m_pINetMgr = NULL;pMe->m_pISocket = NULL;pMe->status = NET_NONE;

임베디드 모바일 프로그래밍 15

16. INetMgr, ISocket APIpMe->m_nLineHeight = IDISPLAY_GetFontMetrics (pMe->a.m_pIDisplay, AEE_FONT_NORMAL,

&pnAscent, &pnDescent);ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->m_dInfo);return TRUE;

}

static void NetworkSample_FreeAppData(IApplet* pi){

CINetworkSample* pMe = (CINetworkSample*)pi;// 메뉴 컨트롤이 해지가 되지 않았다면 해지한다 .if (pMe->m_pIMenu != NULL){

// 메뉴 컨트롤 해지하는 함수IMENUCTL_Release (pMe->m_pIMenu);pMe->m_pIMenu = NULL;

}

if(pMe->status == NET_GETHOST)CALLBACK_Cancel(&pMe->cbkLookup);

if (pMe->m_pISocket != NULL) { ISOCKET_Release (pMe->m_pISocket); pMe->m_pISocket = NULL; } if (pMe->m_pINetMgr != NULL) { INETMGR_SetLinger(pMe->m_pINetMgr,0);

INETMGR_Release (pMe->m_pINetMgr); pMe->m_pINetMgr = NULL; }}

임베디드 모바일 프로그래밍 16

16. INetMgr, ISocket APIstatic void DisplayOutput(IApplet * pi, int nline, char *pszStr, RGBVAL clrColor){ AEEDeviceInfo di; // Device Info AECHAR szBuf[200] = {0}; // a buffer that supports 200 char string AECHAR * psz = NULL; int pixelWidth; AEEFont font = AEE_FONT_NORMAL; int pnFits = 0, dy; int totalCh = 0; int charHeight = 0; // Stores the char height in pixels for given font int pnAscent = 0; // Stores the ascent in number of pixels int pnDescent = 0; // Stores the descent in number of pixels

AEERect rc;

AEEApplet * pMe = (AEEApplet*)pi;

if (pMe == NULL) return;

// Get device information ISHELL_GetDeviceInfo(pMe->m_pIShell,&di);

// Get the font metrics info charHeight = IDISPLAY_GetFontMetrics (pMe->m_pIDisplay, AEE_FONT_NORMAL, &pnAscent, &pnDescent);

STREXPAND((byte *)pszStr, STRLEN(pszStr), szBuf, sizeof(szBuf)); if (nline < 0) { dy = di.cyScreen*2/5; } else{ dy = nline * charHeight; }

임베디드 모바일 프로그래밍 17

16. INetMgr, ISocket API psz = szBuf; totalCh = STRLEN ((char *)pszStr);

while ((totalCh > 0) && (*psz != NULL)) { pixelWidth = IDISPLAY_MeasureTextEx(pMe->m_pIDisplay, font, (AECHAR *) psz, // Start of the buffer to display, -1, di.cxScreen - 5, // maxWidth &pnFits); // Number of chars that will fit a line

if (pnFits == 0) return;

SETAEERECT(&rc, 0, dy, di.cxScreen, charHeight); IDISPLAY_EraseRect(pMe->m_pIDisplay, &rc); IDISPLAY_SetColor(pMe->m_pIDisplay,CLR_USER_TEXT,clrColor); IDISPLAY_DrawText(pMe->m_pIDisplay, AEE_FONT_NORMAL, psz, pnFits, 5 /*start dx*/, dy, 0 /* use default rectangle coordinates */, 0);

psz += pnFits; // move pointer to the next segment to be displayed totalCh -= pnFits; // reduce the total number of characters to still display dy += charHeight; // Place next line charHeight pixels below the // previous line. IDISPLAY_Update(pMe->m_pIDisplay); if (totalCh < pnFits) pnFits = totalCh; // if total number is less than pnFits, adjust pnFits } return; }

임베디드 모바일 프로그래밍 18

16. INetMgr, ISocket APIINAddr ConvertToINAddr(char *psz){ INAddr ul = 0; int nByte = 0; char c;

if(!psz) return 0;

while (ISDIGIT(*psz)) { int n = 0; while ( ISDIGIT(c=*psz)) { n = n*10 + (c - '0'); ++psz; } ((char*)&ul)[nByte++] = n; if (nByte == 4 || *psz != '.') break; ++psz; } if (nByte < 4 || ISALNUM(*psz)) ul = 0xFFFFFFFF; // Invalid address

return ul;}

임베디드 모바일 프로그래밍 19

16. INetMgr, ISocket APIvoid CommonConnectCB(void * pUser, int iError){

CINetworkSample * pMe = (CINetworkSample*)pUser;int32 iRetValue;char pszData[20] = "Brew 수업 중 ...";char szBuf[20] = {0};

char *psz = NULL;int cbWrite;

psz = pszData;cbWrite = STRLEN (pszData);DisplayOutput((IApplet *)pMe, 3, " 소켓에 쓸 데이타 ", MAKE_RGB(0xff, 0, 0));

iRetValue = ISOCKET_Write(pMe->m_pISocket, (byte *)psz, (uint16)cbWrite);if(iRetValue == AEE_NET_WOULDBLOCK){

ISOCKET_Writeable(pMe->m_pISocket, CommonWriteCBFn, (void *)pMe);}else if(iRetValue == AEE_NET_ERROR){

DisplayOutput((IApplet *)pMe, 4, "AEE_NET_ERROR", MAKE_RGB(0xff, 0, 0));DisconnectSocket(pMe);return;

}else if(iRetValue > 0){

DisplayOutput((IApplet *)pMe, 4, (byte *)psz, MAKE_RGB(0xff, 0, 0));}

DisplayOutput((IApplet *)pMe, 6, " 소켓에 읽은 데이타 ", MAKE_RGB(0xff, 0, 0));

iRetValue = ISOCKET_Read(pMe->m_pISocket, (byte *)szBuf, sizeof(szBuf)) ;

임베디드 모바일 프로그래밍 20

16. INetMgr, ISocket APIif(iRetValue == AEE_NET_WOULDBLOCK){

DisplayOutput((IApplet *)pMe, 7, "AEE_NET_WOULDBLOCK", MAKE_RGB(0xff, 0, 0));ISOCKET_Readable(pMe->m_pISocket, CommonReadCBFn, (void*)pMe);

}else if(iRetValue == AEE_NET_ERROR){

DisplayOutput((IApplet *)pMe, 7, "AEE_NET_ERROR", MAKE_RGB(0xff, 0, 0));DisconnectSocket(pMe);

}else if(iRetValue > 0){

DisplayOutput((IApplet *)pMe, 7, (byte *)szBuf, MAKE_RGB(0xff, 0, 0));DisconnectSocket(pMe);

}else if(iRetValue == 0){

DisplayOutput((IApplet *)pMe, 7, " 읽은 데이터 값이 없다 ", MAKE_RGB(0xff, 0, 0));DisconnectSocket(pMe);

}}

void CommonWriteCBFn(void *pUser){

CINetworkSample * pMe = (CINetworkSample*)pUser;int32 iRetValue;char pszData[20] = “Brew 수업 중… ";char *psz = NULL;int cbWrite;

ISocket *pISocket = pMe->m_pISocket;

psz = pszData;cbWrite = STRLEN (pszData);

임베디드 모바일 프로그래밍 21

16. INetMgr, ISocket APIiRetValue = ISOCKET_Write(pISocket, (byte *)psz, (uint16)cbWrite);

if(iRetValue == AEE_NET_WOULDBLOCK){

ISOCKET_Writeable(pMe->m_pISocket, CommonWriteCBFn, (void *)pMe);}else if(iRetValue == AEE_NET_ERROR){

DisplayOutput((IApplet *)pMe, 4, "AEE_NET_ERROR", MAKE_RGB(0xff, 0, 0));DisconnectSocket(pMe);

}else if(iRetValue > 0){

DisplayOutput((IApplet *)pMe, 4, (byte *)psz, MAKE_RGB(0xff, 0, 0));}

}

void CommonReadCBFn (void *pUser){

CINetworkSample * pMe = (CINetworkSample*)pUser;int32 iRetValue;char szBuf[100] = {0};

ISocket *piSock = pMe->m_pISocket; iRetValue = ISOCKET_Read(piSock, (byte *)szBuf, sizeof(szBuf));

if (iRetValue == AEE_NET_WOULDBLOCK) {

ISOCKET_Readable(piSock, CommonReadCBFn, (void*)pMe); return;

}

임베디드 모바일 프로그래밍 22

16. INetMgr, ISocket API else if (iRetValue == AEE_NET_ERROR) { DisplayOutput ((IApplet *)pMe, 9, "Read Error!",MAKE_RGB(0, 0, 0xff)); DisconnectSocket (pMe); } else if (iRetValue > 0) // data has been read {

// The data has been read from the socket. Display Data read. DisplayOutput ((IApplet *)pMe, 9, (byte *)szBuf, MAKE_RGB(0, 0, 0xff)); DisconnectSocket (pMe); } else // rv == 0 { DisplayOutput ((IApplet *)pMe, 9, " 읽을 데이터가 없다 .", MAKE_RGB(0, 0, 0xff));

DisconnectSocket (pMe); }}

void DisconnectSocket(CINetworkSample * pMe){ if(pMe->status == NET_GETHOST)

CALLBACK_Cancel(&pMe->cbkLookup);

if (pMe->m_pISocket != NULL){

ISOCKET_Release (pMe->m_pISocket);pMe->m_pISocket = NULL;

}if (pMe->m_pINetMgr != NULL){

INETMGR_SetLinger(pMe->m_pINetMgr,0);INETMGR_Release (pMe->m_pINetMgr);pMe->m_pINetMgr = NULL;

}}

임베디드 모바일 프로그래밍 23

16. INetMgr, ISocket API

서버 프로그램 (ExampleServer.java)

임베디드 모바일 프로그래밍 24

16. INetMgr, ISocket API

16.3 실행 결과

클라이언트 결과

임베디드 모바일 프로그래밍 25

16. INetMgr, ISocket API

서버 결과