⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketapp.c

📁 一个用C语言写的sorcket相关的brew应用程序.
💻 C
字号:
/**
***     SocketApp.c
***
***     偙偺僜乕僗僐乕僪偼丄僄儔乕張棟傗僗僩僢僾仌僒僗儁儞僪側偳偺張棟偑敳偗偰偄傑偡丅
***     Copyright (C) 2006 SophiaCradle Incorporated.
***     All rights reserved.
**/

#include "AEEModGen.h"
#include "AEEAppGen.h"
#include "AEEStdLib.h"
#include "AEEShell.h"
#include "Common.h"
#include "SocketApp.bid"
#include "AEENet.h"

#define     ACCESS_URL      ("www.google.com")

// 傾僾儗僢僩峔憿懱
typedef struct SocketApp {
    AEEApplet a; // 傾僾儗僢僩峔憿懱偺愭摢儊儞僶偼昁偢 AEEApplet 宆偵偡傞偙偲丅
    Common common; // 夋柺昤夋梡

    // 捠怣梡
    INetMgr* netmgr;        // INetMgr 僀儞僞乕僼僃乕僗偺僀儞僗僞儞僗曄悢
    ISocket* socket;        // ISocket 僀儞僞乕僼僃乕僗偺僀儞僗僞儞僗曄悢
    uint16 index;           // 憲庴怣僨乕僞検傪奿擺
    AEEDNSResult dnsresult; // 愙懕愭儂僗僩偺 IP 傾僪儗僗傪奿擺
    AEECallback callback;   // 僐乕儖僶僢僋娭悢偲偦偺堷悢傪奿擺
} SocketApp;

static boolean SocketApp_HandleEvent(SocketApp* app, AEEEvent eCode, uint16 wParam, uint32 dwParam);
static boolean OnAppStart(SocketApp* app);
static boolean OnAppStop(SocketApp* app);
static boolean OnKey(SocketApp* app, uint16 key);
static void TCPConnect(SocketApp* pApp);
static void TCPDNSConnect(void* p);
static void TCPConnected(void* p, int nErr);
static void TCPWrite(SocketApp* pApp);
static void TCPRead(SocketApp* pApp);

int AEEClsCreateInstance(AEECLSID ClsId, IShell* pIShell, IModule* po, void** ppObj)
{
    *ppObj = NULL;
    if (ClsId == AEECLSID_SOCKETAPP) {
        if (AEEApplet_New(sizeof(SocketApp), ClsId, pIShell, po, (IApplet**)ppObj, (AEEHANDLER)SocketApp_HandleEvent, NULL) == TRUE) {
            return AEE_SUCCESS;
        }
    }
    return EFAILED;
}

static boolean SocketApp_HandleEvent(SocketApp* app, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
    switch (eCode) {
        case EVT_APP_START:
            return OnAppStart(app);

        case EVT_APP_STOP:
            return OnAppStop(app);

        case EVT_KEY:
            return OnKey(app, wParam);
    }
    return FALSE;
}

// 傾僾儗僢僩偑奐巒偟偨偲偒偵屇傃弌偝傟傞丅
static boolean OnAppStart(SocketApp* app)
{
    IShell* shell = app->a.m_pIShell;
    IDisplay* display = app->a.m_pIDisplay;

    app->socket = NULL;
    ISHELL_CreateInstance(shell, AEECLSID_NET, (void**)&app->netmgr);
    COMMON_Init(&app->common, display, shell, 32768);
    COMMON_WriteString(&app->common, "Push Select Key...\n");
    COMMON_Draw(&app->common);
    return TRUE;
}

// 傾僾儗僢僩偑廔椆偟偨偲偒偵屇傃弌偝傟傞丅
static boolean OnAppStop(SocketApp* app)
{
    // 奺庬夝曻張棟
    if (app->socket != NULL) {
        ISOCKET_Cancel(app->socket, NULL, NULL);
        ISOCKET_Release(app->socket);
    }
    INETMGR_Release(app->netmgr);
    COMMON_Free(&app->common);
    return TRUE;
}

// 僉乕偑墴偝傟偨偲偒偵屇傃弌偝傟傞丅
static boolean OnKey(SocketApp* app, uint16 key)
{
    switch (key) {
        case AVK_SELECT:
            TCPConnect(app);
            return TRUE;

        case AVK_DOWN:
            COMMON_NextLine(&app->common);
            COMMON_Draw(&app->common);
            return TRUE;

        case AVK_UP:
            COMMON_PreviousLine(&app->common);
            COMMON_Draw(&app->common);
            return TRUE;
    }
    return FALSE;
}

// 儂僗僩柤偐傜 IP 傾僪儗僗傪挷傋傞丅
static void TCPConnect(SocketApp* pApp)
{
    CALLBACK_Init(&pApp->callback, TCPDNSConnect, pApp);
    INETMGR_GetHostByName(pApp->netmgr, &pApp->dnsresult, ACCESS_URL, &pApp->callback);
    return;
}

// 儂僗僩偵愙懕偡傞丅
static void TCPDNSConnect(void* p)
{
    SocketApp* pApp = (SocketApp*)p;
    int nErr = pApp->dnsresult.nResult;

    if (nErr > AEEDNSMAXADDRS) {
        // IP 傾僪儗僗偺庢摼偵幐攕丅nErr 偺抣偵傛偭偰尨場偑傢偐傞丅
        DBGPRINTF("** DNS Lookup Failed: Error %d\n", nErr);
    }
    else {
        pApp->socket = INETMGR_OpenSocket(pApp->netmgr, AEE_SOCK_STREAM);
        if (pApp->socket == NULL) {
            DBGPRINTF("** OpenSocket Failed: Error %d\n", INETMGR_GetLastError(pApp->netmgr));
        }
        else {
            // pApp->dnsresult.addrs[0] 偵庢摼偟偨 IP 傾僪儗僗偑曐帩偝傟傞丅
            // HTONS 偼丄億乕僩斣崋傪捠怣梡偵曄姺偡傞儅僋儘娭悢丅
            nErr = ISOCKET_Connect(pApp->socket, pApp->dnsresult.addrs[0], HTONS(80), TCPConnected, pApp);
            if (nErr != AEE_NET_SUCCESS) {
                DBGPRINTF("** Connect Failed: Error %d\n", ISOCKET_GetLastError(pApp->socket));
                ISOCKET_Cancel(pApp->socket, NULL, NULL);
                ISOCKET_Release(pApp->socket);
                pApp->socket = NULL;
            }
            else {
                DBGPRINTF("** connecting...\n");
            }
        }
    }
    return;
}

// 儊僢僙乕僕偺憲怣傪奐巒偡傞丅
static void TCPConnected(void* p, int nErr)
{
    SocketApp* pApp = (SocketApp*)p;

    if ((nErr == AEE_NET_SUCCESS) || (nErr == AEE_NET_EISCONN)) {
        // 僄儔乕偑側偗傟偽儊僢僙乕僕傪憲怣 (TCPWrite 娭悢)
        pApp->index = 0;
        TCPWrite(pApp);
    }
    else {
        DBGPRINTF("** Connect Failed: Error %d\n", nErr);
        ISOCKET_Cancel(pApp->socket, NULL, NULL);
        ISOCKET_Release(pApp->socket);
        pApp->socket = NULL;
    }
    return;
}

// 儊僢僙乕僕傪憲怣丄姰椆偡傟偽庴怣傪奐巒偡傞丅
static void TCPWrite(SocketApp* pApp)
{
    int nSent;
    char message[] = "GET / HTTP/1.0\n\n";

    // 儊僢僙乕僕偺憲怣丅曉抣偼幚嵺偵憲怣偟偨僶僀僩悢 (傕偟偔偼僄儔乕僐乕僪)
    // 戞嶰堷悢偼僶僢僼傽偺僒僀僘
    nSent = ISOCKET_Write(pApp->socket, (byte *)message + pApp->index, (uint16)sizeof(message) - pApp->index);
    if (nSent == AEE_NET_ERROR) {
        DBGPRINTF("** Write Failed: Error %d\n", ISOCKET_GetLastError(pApp->socket));
        ISOCKET_Cancel(pApp->socket, NULL, NULL);
        ISOCKET_Release(pApp->socket);
        pApp->socket = NULL;
    }
    else {
        // nSent 偑 AEE_NET_WOULDBLOCK 偺応崌偼丄儊僢僙乕僕偑憲怣偱偒側偐偭偨丅
        if (nSent != AEE_NET_WOULDBLOCK) {
            pApp->index += nSent;
            if (pApp->index >= sizeof(message)) {
                // 憲怣廔椆
                DBGPRINTF("** writing complete...\n");
                // 庴怣奐巒
                TCPRead(pApp);
                return;
            }
        }
        DBGPRINTF("** writing...\n");
        // 憲怣偑姰椆偟偰偄側偄偲偒偼丄嵞傃僐乕儖僶僢僋娭悢乮偙偺娭悢帺恎乯傪搊榐偡傞丅
        ISOCKET_Writeable(pApp->socket, (PFNNOTIFY)TCPWrite, pApp);
    }
    return;
}

// 儊僢僙乕僕傪庴怣丄姰椆偡傟偽儕僜乕僗傪奐曻偟夋柺偵昤夋偡傞丅
static void TCPRead(SocketApp * pApp)
{
    char buffer[0x7FFF];
    int nRead;

    // 儊僢僙乕僕偺庴怣丅曉抣偼幚嵺偵庴怣偟偨僶僀僩悢 (傕偟偔偼僄儔乕僐乕僪)
    // 戞嶰堷悢偼僶僢僼傽偺僒僀僘
    nRead = ISOCKET_Read(pApp->socket, (byte*)buffer, 0x7FFF - 1);
    if (nRead == AEE_NET_ERROR) {
        DBGPRINTF("** Read Failed: Error %d\n", ISOCKET_GetLastError(pApp->socket));
        ISOCKET_Cancel(pApp->socket, NULL, NULL);
        ISOCKET_Release(pApp->socket);
        pApp->socket = NULL;
    }
    else {
        // nRead 偑 AEE_NET_WOULDBLOCK 偺応崌偼丄儊僢僙乕僕偑庴怣偱偒側偐偭偨丅
        if (nRead != AEE_NET_WOULDBLOCK) {
            if (nRead == 0) {
                // 庴怣廔椆
                DBGPRINTF("** reading Complete...\n");
                ISOCKET_Release(pApp->socket);
                pApp->socket = NULL;
                return;
            }
            else {
                // 僶僢僼傽偺廔抂偵 '\0' 傪戙擖丅
                buffer[nRead] = 0;
                // 暥帤楍偺夋柺昤夋
                COMMON_WriteString(&pApp->common, buffer);
                COMMON_Draw(&pApp->common);
            }
        }
        DBGPRINTF("** reading...\n");
        // 庴怣偑姰椆偟偰偄側偄偲偒偼丄嵞傃僐乕儖僶僢僋娭悢乮偙偺娭悢帺恎乯傪搊榐
        ISOCKET_Readable(pApp->socket, (PFNNOTIFY)TCPRead, pApp);
    }
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -