mones2/22.ネットワークサーバ/04.uIPのサーバーを作ろうイベント整理


Top / mones2 / 22.ネットワークサーバ / 04.uIPのサーバーを作ろうイベント整理

これは何か

uipのイベント処理を理解し、サーバー内にウェブクライアントを実装します。

成果

■[Mona][mones][network] NetServer実装の悩み
 
uIPを利用してNetServerを実装する。そのNetServerはC#のようなネットワークAPIを提供する。
 
そういう形を目指しているのですが、一つ前のエントリーの通りこれはかなり難しそう。
 
一つ前のエントリーで実現したことは
 
    * NetServer内にそのままコードを直書き
    * あて先はひとつの(IPアドレス, port)
    * 複雑な状態遷移がない
 
という感じなのですが
 
これからネットワークAPI到達までには
 
    * 複数のIPアドレス、portのコネクションの保持
    * uIPのようなイベントモデル⇔C#のようなネットワークAPIの乖離を埋める実装方法の検討
 
 
と問題は山積みのような気がします。
 
こういうときは誰かとホワイトボードに図を描きながら相談したいなぁ。
 
この日記上やWikiで相談に乗ってくれる人がいるだけ幸せかもしれませんが。
 
Permalink | コメント(0) | トラックバック(0) | 00:10  このエントリーを含むブックマーク
■[Mona][mones][network] uIPのイベント
 
uIPで簡単なHTTPクライアントを書いてみる。
 
大げさなものではなくGETしてそれを画面に出力するだけ。
 
まずはuIPのドキュメント通りに、各状態に合わせたハンドラを呼んでやる
 
void NetServer::DoEvent()
{
    if (uip_aborted())
    {
        AbortedHandler();
    }
    if (uip_timedout())
    {
        TimeoutHandler();
    }
    if (uip_closed())
    {
        ClosedHandler();
    }
    if (uip_connected())
    {
        ConnectedHandler();
    }
    if (uip_acked())
    {
        AckedHandler();
    }
    if (uip_newdata())
    {
        NewDataHandler();
    }
    if (uip_rexmit() || uip_newdata() || uip_acked() || uip_acked() || uip_connected() || uip_poll())
    {
        SendDataHandler();
    }
 
 
次にそれぞれのハンドラを定義してやります。
 
今回は実験なので、効率とか誰がメモリ解放するのかとか、エラーのときは?とかは一切考えていません。
 
void NetServer::ConnectedHandler()
{
    printf("%s\n", __FUNCTION__);
    struct server_state* s = (struct server_state *)uip_conn->appstate;
    const char* message = "GET /file HTTP/1.0\r\nServer:192.168.100.2\r\n\r\n";
    s->message = new char[strlen(message) + 1];
    strcpy(s->message, message);
    s->length = strlen(message) + 1;
}
 
void NetServer::AckedHandler()
{
    printf("%s\n", __FUNCTION__);
    struct server_state* s = (struct server_state *)uip_conn->appstate;
    s->length -= uip_conn->len;
    s->message += uip_conn->len;
    if(s->length == 0)
    {
        printf("send done\n");
    }
}
 
void NetServer::NewDataHandler()
{
    printf("%s\n", __FUNCTION__);
    for (dword i = 0; i < GetDataLength(); i++)
    {
        printf("%c", (char)uip_appdata[i]);
    }
}
 
void NetServer::SendDataHandler()
{
    printf("%s\n", __FUNCTION__);
    struct server_state* s = (struct server_state *)uip_conn->appstate;
    if (s->length != 0)
    {
        uip_send((volatile u8_t*)s->message, s->length);
    }
}
 
 
フローとしては
 
1. 接続が完了すると ConnectedHandlerが呼ばれる
 
2. GETを発行するために、GET文字列と長さを格納
 
3. 送信
 
4. ackedが返ってきてまだ未送信分がある場合や、再送の必要があれば再送信します。
 
5.uip_newdata()が1だったらデータが返ってきています。
 
これを踏まえたうえで次のエントリーへ。
 

コメント

コメントはありません。 コメント/mones2/22.ネットワークサーバ/04.uIPのサーバーを作ろうイベント整理?

お名前:

MENU

now: 7

リンク


最新の20件
2018-10-07 2018-09-20 2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-05-29 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 2288, today: 1, yesterday: 1

添付ファイル: fileuip-0.9-server-winpcap-20060131.zip 463件 [詳細] fileuip-0.9-server-winpcap-20060129.zip 449件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:01 (3910d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.049 sec.