16. INetMgr, ISocket API

25
임임임임 임임임 임임임임임 1 16. INetMgr, ISocket API INetMgr 임임임임임 INetMgr 임임임임임 임임임 임임임 임임임임 임임 임임임임 임임임 임임 임임임 임임임임 임임임임 임임임임임 임임임임 . 임 임임임 임임임임 임임임임임 임임 임임임임 임임임 임임임 TCP 임임 UDP 임 임임임임 임임 임임 ISocket 임임임임임임 임임 임 임임 . ISocket 임임임임임 ISocket 임임임임임임 INETMGR_OpenSocket() 임 임임임임 임임 TCP 임 UDP 임임임 임임임임 , 임임임 임임 임임임임 임임임임 임임임 , 임임 임임임 임임임임 . 임 임임임임임임임 임임임 임임임임임 임임 임임임임임 Network 임임 All 임 임임 임임임 임임임 임임 . 16.1 INetMgr, ISocket 임임임임임임 임임임임 임임임 임임임임

description

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

Transcript of 16. INetMgr, ISocket API

Page 1: 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 인터페이스를 이용하여 서버에 접속하기

Page 2: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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() 를 호출하여 검색할 수 있다 .

Page 3: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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 실행 실패

Page 4: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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() 을 호출해야 한다 .

Page 5: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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() 을 다시 호출할 준비를 해야 한다 .

Page 6: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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 소켓이 데이터를 읽을 수 있는 상태가 아닌 경우

Page 7: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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 호출될 때 콜백 함수로 전달되는 사용자 정의 데이터

반환값 없 음

Page 8: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;

Page 9: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;

Page 10: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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);}

Page 11: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;

Page 12: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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);

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

Page 13: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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);

Page 14: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;

Page 15: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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; }}

Page 16: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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; }

Page 17: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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; }

Page 18: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;}

Page 19: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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)) ;

Page 20: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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);

Page 21: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;

}

Page 22: 16. INetMgr, ISocket API

임베디드 모바일 프로그래밍 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;

}}

Page 23: 16. INetMgr, ISocket API

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

16. INetMgr, ISocket API

서버 프로그램 (ExampleServer.java)

Page 24: 16. INetMgr, ISocket API

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

16. INetMgr, ISocket API

16.3 실행 결과

클라이언트 결과

Page 25: 16. INetMgr, ISocket API

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

16. INetMgr, ISocket API

서버 결과