2007-06-29

文字列操作(続き その2)

今朝めずらしく早起きすると Advances / W-Zero3[es]の予約開始案内メールが届いていました。
 
送信時刻を見ると夜中の 1時に届いていた模様...。
すぐにWILLCOM STOREで予約したのですが、朝の6時過ぎの時点で受付番号は400番台でした。
この400人強の人たちは日が変わった頃からメールを待っていたのでしょうか...。
 
祭に参加しそこねた(笑
 
それでも無事に本予約ができたので勉強の続きをしていきます。
先日からC#のサンプルと同じことをしようとして IPアドレスがうまく表示できてなかった件は、 単にANCIコードページからUNICODEに変換できてなかった事が原因でした。
昨日までのコードのホスト名と同じことをするだけで無事表示することができました
void ShowMessage(HWND hWnd)
{
    WSADATA     wsaData;
    LPHOSTENT   host;
    IN_ADDR *   ip;

    CString     msg;
    CString     hostname;
    CString     ipAddress;
    char *      bufHostname;
    char *      bufIPAddress;

    WSAStartup(MAKEWORD(2,2), &wsaData);
    bufHostname = (char *)hostname.GetBuffer(256);
    gethostname(bufHostname, 256);
    host = gethostbyname(bufHostname);
    WSACleanup();
    if (host == NULL) return;
    bufIPAddress = (char *)ipAddress.GetBuffer(20);
    ip = (IN_ADDR *)host->h_addr_list[0];
    strncpy_s(bufIPAddress, 20, inet_ntoa(*ip), _TRUNCATE);
    ipAddress.ReleaseBuffer();    

    Ansi2Unicode(&hostname);
    Ansi2Unicode(&ipAddress);
    msg.Format(_T("host=%s,IP=%s"), hostname, ipAddress);

    MessageBox(hWnd, msg, _T("ホスト名"), MB_OK);
}

void Ansi2Unicode(CString *text) {

    int     len;
    _TCHAR  *buf;
    char    *ansiText;

    len     = text->GetLength();
    buf     = text->GetBuffer(len);
    text->ReleaseBuffer();

    ansiText    = _strdup((const char *)buf);
    len = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, ansiText, -1, NULL, 0);
    if (len > 0) {
        MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, ansiText, -1, text->GetBuffer(len), len);
        text->ReleaseBuffer();
    }
    free(ansiText);
}
 
そういえば C#のサンプルでは IPアドレスがループバックアドレスかどうかも表示しているのですが、 WinSockで同じことを判定する方法はわかりませんでした。
IPv4なら"127.0.0.1"と比較するだけのような気もするのですが、あまりカッコ良くないですしね...。
 

0 件のコメント: