<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
 >

  <channel rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/!feeds/list">
    <title>04WebServer Wiki</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/!feeds/list</link>
    <description>
      SourceForge.jp Wiki pages for 04WebServer project.    </description>
        <dc:date>2009-03-11T00:45:19+09:00</dc:date>
        <items>
      <rdf:Seq>
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/Todo" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/Interface" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/Module" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/FrontPage" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E5%90%8D%E5%89%8D%E6%A4%9C%E8%A8%8E" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%83%A1%E3%83%A2%E5%B8%B3" />
                <rdf:li rdf:resource="http://sourceforge.jp/projects/sf-04webserver/wiki/Tech" />
              </rdf:Seq>
    </items>
  </channel>

      <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/Todo">
    <title>Todo</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/Todo</link>
    <dc:identifier>Todo</dc:identifier>
    <dc:date>2009-03-11T00:45:19+09:00</dc:date>
        <description>
      <![CDATA[= 現在の作業
 * CClientThreadManager UTF8化
   * CContextManager 完了
   * COverloadManager 完了
= 初回公開までに実装
 * UTF8化
   * MFC/ATL排除
     * 基本ツール
     * コアマネージャ
     * サポートマネージャ
 * コアマネージャ
 * 拡張マネージャ]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E7.8F.BE.E5.9C.A8.E3.81.AE.E4.BD.9C.E6.A5.AD">現在の作業</h1><ul><li>CClientThreadManager UTF8化
<ul><li>CContextManager 完了
</li><li>COverloadManager 完了
</li></ul></li></ul><h1 id="h1-.E5.88.9D.E5.9B.9E.E5.85.AC.E9.96.8B.E3.81.BE.E3.81.A7.E3.81.AB.E5.AE.9F.E8.A3.85">初回公開までに実装</h1><ul><li>UTF8化
<ul><li>MFC/ATL排除
<ul><li>基本ツール
</li><li>コアマネージャ
</li><li>サポートマネージャ
</li></ul></li></ul></li><li>コアマネージャ
</li><li>拡張マネージャ
<ul><li>ホスト名マネージャ
</li><li>ユーザマネージャ
</li></ul></li><li>レスポンス
<ul><li>CGI
<ul><li>CGIヘッダの多重出力のチェック
</li></ul></li><li>SSI
</li><li>WebDAV
</li></ul></li><li>フィルタ
<ul><li>Basic認証
</li><li>セキュリティ・チェック
</li><li>アクセス制限
</li><li>帯域幅制御
</li><li>CGI PATH_TRANSLATED
</li><li>統計フィルタ（接続数、転送量、平均速度など）
</li></ul></li><li>コントローラ・インタフェース
<ul><li>Unleakより移植
</li><li>サーバ停止時後にも、コンテキストとステータスを取得できるよう退避
</li></ul></li><li>サーバコントローラ
</li><li>細かい項目
<ul><li>ディレクトリインデックスのソート
</li><li>接続処理スレッドのデバッグ機能
</li></ul></li><li>デバッグ
<ul><li>OpenSSLライブラリのメモリリークを修正（OpenSSLを圧縮機能を切ってビルド？）
</li></ul></li></ul><h1 id="h1-.E6.AD.A3.E5.BC.8F.E7.89.88.E3.81.BE.E3.81.A7.E3.81.AB.E5.AE.9F.E8.A3.85">正式版までに実装</h1><ul><li>コアマネージャ
<ul><li>外部モジュールロード機能
</li><li>リスナのインタフェース変更
</li></ul></li><li>フィルタ
<ul><li>キャッシュコントロール
</li><li>サーバレスポンス上書き
</li></ul></li><li>外部モジュール用インタフェース ラッパ
</li><li>外部モジュール用ＳＤＫ
</li></ul><h1 id="h1-.E5.B0.86.E6.9D.A5.E7.9A.84.E3.81.AB.E6.8B.A1.E5.BC.B5.E3.83.A2.E3.82.B8.E3.83.A5.E3.83.BC.E3.83.AB.E3.81.A8.E3.81.97.E3.81.A6.E5.AE.9F.E8.A3.85">将来的に拡張モジュールとして実装</h1><ul><li>gzip圧縮
</li><li>ディレクトリ固有設定によるパス設定の上書き(.htaccessもどき)
</li><li>IPv6
</li><li>Subversion用レスポンスモジュール
</li></ul><h1 id="h1-.E5.AE.8C.E4.BA.86">完了</h1><ul><li>UTF8化
<ul><li>MFC/ATL排除
<ul><li>基本ツール
<ul><li>CWorkspace
</li><li>CUTF8String
</li></ul></li></ul></li></ul></li><li>マネージャ／コア
<ul><li>フィルタマネージャ、レスポンスマネージャ レベル制御
</li><li>マネージャインタフェース、共通ラッパの作成
<ul><li>サーバメインインタフェース構造見直し
<ul><li>IServerTool
</li><li>IConnectionTool
</li><li>IFilter
</li><li>IResponse
</li></ul></li><li>マネージャインタフェース構造見直し
<ul><li>ILogManager;
</li><li>IServerTextManager;
</li><li>IMimeTypeManager;
</li><li>IPathManager;
</li><li>ICGIManager;
</li><li>IResponseManager
</li><li>IFilterManager
</li></ul></li></ul></li><li>マネージャ共通インタフェースの設計
</li><li>マネージャインタフェースマネージャ
</li><li>CGIマネージャ
</li><li>サーバーインフォマネージャ
</li><li>サーバーテキストマネージャ
</li><li>ログマネージャ
</li><li>サーバレスポンス 表示カスタマイズ
</li><li>SSLリスナ
</li><li>サーバステータスマネージャ、ステータス管理機能の実装
</li></ul></li><li>レスポンス
<ul><li>ディレクトリ表示
</li></ul></li><li>フィルタ
<ul><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/KeepAlive">KeepAlive</a>
</li><li>アクセスログ
</li><li>インデックス ファイル
</li></ul></li><li>細かい項目
<ul><li>多段サイト証明書に対応
</li><li>サーバ名など、サーバ基本情報の扱い
</li><li>Contextへ通信サイズ設定
</li><li>オーバーロードモードによる503発生
</li><li>ブロックメモリサイズの設定
</li><li>最大バッファサイズの設定
</li><li>フィルタ名・関数のスレッドへの登録
</li><li>OpenSSLライブラリを最新版へ入れ替え
</li><li>CGIにおいて、HTTPヘッダ（http_*）を環境変数に追加
</li><li>サーバレスポンス上書き（フィルタにより実現）
</li></ul></li><li>パフォーマンスチューニング
<ul><li>SSLのオーバーラップIO実装（独自BIO？）
</li></ul></li><li>デバッグ
<ul><li>何故かログに「リクエスト ヘッダを受信中...」（構造上ありえない）
</li></ul></li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/Interface">
    <title>Interface</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/Interface</link>
    <dc:identifier>Interface</dc:identifier>
    <dc:date>2009-01-10T01:36:25+09:00</dc:date>
        <description>
      <![CDATA[= インターフェース
== コア
  * IServerTool
    * マネージャへのアクセス元
  * IConnectionTool
    * 接続関係の機能を提供
  * IConnectionThreadStatus
    * 接続スレッドステータス
  * IConnectionControl
    * 接続操作
== 外部モジュール定義用
外部モジュー]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9">インターフェース</h1><h2 id="h2-.E3.82.B3.E3.82.A2">コア</h2><ul><li>IServerTool
<ul><li>マネージャへのアクセス元
</li></ul></li><li>IConnectionTool
<ul><li>接続関係の機能を提供
</li></ul></li><li>IConnectionThreadStatus
<ul><li>接続スレッドステータス
</li></ul></li><li>IConnectionControl
<ul><li>接続操作
</li></ul></li></ul><h2 id="h2-.E5.A4.96.E9.83.A8.E3.83.A2.E3.82.B8.E3.83.A5.E3.83.BC.E3.83.AB.E5.AE.9A.E7.BE.A9.E7.94.A8">外部モジュール定義用</h2><p>外部モジュールインタフェースは、全てインスタンス削除用メソッドを持っている。
</p><ul><li>IFilter
</li><li>IFilterFactory
</li><li>IResponse
</li><li>IResponseFactory
</li><li>IListener
</li><li>IClientConnection
</li><li>IManagerInterface
</li><li>IManager
</li></ul><h2 id="h2-.E3.83.9E.E3.83.8D.E3.83.BC.E3.82.B8.E3.83.A3.E6.8F.90.E4.BE.9B">マネージャ提供</h2><ul><li>ICGIManager
</li><li>ILogManager
</li><li>IMimeTypeManager
</li><li>IPathManager
</li><li>IServerInfoManager
</li><li>IServerTextManager
</li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/Module">
    <title>Module</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/Module</link>
    <dc:identifier>Module</dc:identifier>
    <dc:date>2009-01-10T01:32:40+09:00</dc:date>
        <description>
      <![CDATA[= コア
  * CServer
    * サーバ本体

= マネージャ
いろいろ管理するクラス郡。
外部モジュール化はしない
  * CConnectionManager
    * リスナから接続を受け取り、処理スレッドを起動する
    * CCnotextManager
      * コンテキストの管理を行う
    * COverloadManager
   ]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.82.B3.E3.82.A2">コア</h1><ul><li>CServer
<ul><li>サーバ本体
</li></ul></li></ul><h1 id="h1-.E3.83.9E.E3.83.8D.E3.83.BC.E3.82.B8.E3.83.A3">マネージャ</h1><p>いろいろ管理するクラス郡。
外部モジュール化はしない
</p><ul><li>CConnectionManager
<ul><li>リスナから接続を受け取り、処理スレッドを起動する
</li><li>CCnotextManager
<ul><li>コンテキストの管理を行う
</li></ul></li><li>COverloadManager
<ul><li>サーバ負荷の管理を行う
</li></ul></li></ul></li><li>CFilterManager
<ul><li>フィルタモジュールの管理を行う
</li></ul></li><li>CListenerManager
<ul><li>リスナを管理する
</li></ul></li><li>CLogManager
<ul><li>ログの一時的なキャッシュなどを行う
</li></ul></li><li>CMimeTypeManager
<ul><li>拡張子と<a href="http://sourceforge.jp/projects/sf-04webserver/wiki/MimeType">MimeType</a>、表示アイコンの関連付けを行う
</li></ul></li><li>CPathManager
<ul><li>サーバパスとローカルパスの管理を行う
</li></ul></li><li>CResponseManager
<ul><li>レスポンスモジュールの管理を行う
</li></ul></li><li>CServerStatusManager
<ul><li>サーバステータスの管理を行う
</li><li>CSystemLogManager
<ul><li>システムログの管理を行う
</li></ul></li></ul></li><li>CSettingManager
<ul><li>設定の管理を行う
</li></ul></li></ul><h1 id="h1-.E3.83.AA.E3.82.B9.E3.83.8A">リスナ</h1><p>通信を受け付けるクラス。
外部モジュール化は検討中
</p><ul><li>CNormalListener
<ul><li>通常のHTTPアクセスを受け付けるリスナ
</li></ul></li></ul><h1 id="h1-.E3.83.95.E3.82.A3.E3.83.AB.E3.82.BF">フィルタ</h1><p>処理のフィルタリングを行うクラス。
外部モジュールが可能になる予定
</p><ul><li>CAccessLogFilter
<ul><li>アクセスログを出力する
</li></ul></li><li>CIndexFilter
<ul><li>インデックスファイルを検索する
</li></ul></li><li>CKeepAliveFilter
<ul><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/KeepAlive">KeepAlive</a>を管理する
</li></ul></li><li>CPathFilter
<ul><li>ローカルパスを取得する
</li></ul></li><li>CServerInfoFilter
<ul><li>ヘッダにサーバ情報を設定する
</li></ul></li></ul><h1 id="h1-.E3.83.AC.E3.82.B9.E3.83.9D.E3.83.B3.E3.82.B9">レスポンス</h1><p>レスポンスの生成を行うクラス。
外部モジュールが可能になる予定
</p><ul><li>CDirectoryIndexResponse
<ul><li>ディレクトリリストを表示する
</li></ul></li><li>CFileResponse.cpp
<ul><li>ファイルを表示する
</li></ul></li><li>CServerResponse
<ul><li>サーバレスポンスを表示する
</li><li>このクラスは特別扱いで、通常の処理フローには含まれない。サーバレスポンス例外が発生したときに動作する</li></ul></li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/FrontPage">
    <title>FrontPage</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/FrontPage</link>
    <dc:identifier>FrontPage</dc:identifier>
    <dc:date>2009-01-10T01:32:15+09:00</dc:date>
        <description>
      <![CDATA[= 04WebServer 開発メモ
== このWikiについて
現在の所、Yuhのメモ帳です。

== 開発方針
 * 想定している利用用途
   * 個人・小規模グループ用Webサーバ
   * Webアプリケーションの開発・デバッグ用
 * 方針
   * 分かりやすく、使いやすく、必要十分な機能
== 開発メモ
 * [Todo]
 * [Interface]
 ]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-04WebServer.20.E9.96.8B.E7.99.BA.E3.83.A1.E3.83.A2">04WebServer 開発メモ</h1><h2 id="h2-.E3.81.93.E3.81.AEWiki.E3.81.AB.E3.81.A4.E3.81.84.E3.81.A6">このWikiについて</h2><p>現在の所、Yuhのメモ帳です。
</p><h2 id="h2-.E9.96.8B.E7.99.BA.E6.96.B9.E9.87.9D">開発方針</h2><ul><li>想定している利用用途
<ul><li>個人・小規模グループ用Webサーバ
</li><li>Webアプリケーションの開発・デバッグ用
</li></ul></li><li>方針
<ul><li>分かりやすく、使いやすく、必要十分な機能
</li></ul></li></ul><h2 id="h2-.E9.96.8B.E7.99.BA.E3.83.A1.E3.83.A2">開発メモ</h2><ul><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/Todo">Todo</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/Interface">Interface</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/Module">Module</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%83%A1%E3%83%A2%E5%B8%B3">メモ帳</a>
</li></ul><h2 id="h2-.E6.8A.80.E8.A1.93.E3.83.A1.E3.83.A2">技術メモ</h2><ul><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/Tech">Tech</a>
</li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E5%90%8D%E5%89%8D%E6%A4%9C%E8%A8%8E">
    <title>いろいろ名前検討</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E5%90%8D%E5%89%8D%E6%A4%9C%E8%A8%8E</link>
    <dc:identifier>いろいろ名前検討</dc:identifier>
    <dc:date>2008-12-22T17:13:38+09:00</dc:date>
        <description>
      <![CDATA[= いろいろ名前検討
== モジュール名検討
 * コア
   * ConnectionManager
   * ListennerManager
   * FilterManager
   * ResponseManager
   * ServerStatusManager
     * SystemLogManager
   * SettingManager
   * Ma]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E3.81.84.E3.82.8D.E3.81.84.E3.82.8D.E5.90.8D.E5.89.8D.E6.A4.9C.E8.A8.8E">いろいろ名前検討</h1><h2 id="h2-.E3.83.A2.E3.82.B8.E3.83.A5.E3.83.BC.E3.83.AB.E5.90.8D.E6.A4.9C.E8.A8.8E">モジュール名検討</h2><ul><li>コア
<ul><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/ConnectionManager">ConnectionManager</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/ListennerManager">ListennerManager</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/FilterManager">FilterManager</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/ResponseManager">ResponseManager</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/ServerStatusManager">ServerStatusManager</a>
<ul><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/SystemLogManager">SystemLogManager</a>
</li></ul></li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/SettingManager">SettingManager</a>
</li><li><a href="http://sourceforge.jp/projects/sf-04webserver/wiki/ManagerInterfaceManager">ManagerInterfaceManager</a>
</li></ul></li></ul><h2 id="h2-.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E7.A8.AE.E9.A1.9E.E5.90.8D">インタフェース種類名</h2><ul><li>ただのポインタ
<ul><li>C--Ptr, I--Ptr
</li></ul></li><li>自動開放機能付き
<ul><li>I--IIPtr?
</li><li>DEFINE_INTERNAL_INTERFACE()
</li></ul></li><li>管理されたインタフェース
<ul><li>MI--, MI--Access
</li><li>CManagedInterfaceImplement : IManagedInterfaceImplement
<ul><li>CManagedInterfaceImplementArgStack
<ul><li>CManagedInterfaceImplementArg
</li></ul></li></ul></li><li>CManagedInterfaceAccess : IManagedInterfaceAccess
<ul><li>CManagedInterfaceAccessArgStack : IManagedInterfaceAccessArg
<ul><li>CManagedInterfaceAccessArg
</li></ul></li></ul></li><li>CManagedInterfaceMapper : IManagedInterfaceMapper
</li><li>CManagedInterfaceRegister
</li></ul></li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%83%A1%E3%83%A2%E5%B8%B3">
    <title>メモ帳</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/%E3%83%A1%E3%83%A2%E5%B8%B3</link>
    <dc:identifier>メモ帳</dc:identifier>
    <dc:date>2008-12-17T13:10:01+09:00</dc:date>
        <description>
      <![CDATA[[[LineComment]]
  * http://www.epsilon.jp/service/credit.html[[BR]]-- [id:yuh yuh] (2008-12-17 13:10:01 JST)
  * (GnuDIP で DDNS) http://www.heart-pot.co.jp/gnudip.html[[BR]]-- [id:yuh yuh] (2008-12-1]]>
    </description>
    <content:encoded>
      <![CDATA[<p>
</p><ul><li><a href="http://www.epsilon.jp/service/credit.html" class="external" rel="nofollow">http://www.epsilon.jp/service/credit.html</a><br />-- <a href="/users/yuh" class="user" style="background-image: url(http://sourceforge.jp/usericon.php?user=yuh);padding-left: 12px;">yuh</a> (2008-12-17 13:10:01 JST)
</li><li>(GnuDIP で DDNS) <a href="http://www.heart-pot.co.jp/gnudip.html" class="external" rel="nofollow">http://www.heart-pot.co.jp/gnudip.html</a><br />-- <a href="/users/yuh" class="user" style="background-image: url(http://sourceforge.jp/usericon.php?user=yuh);padding-left: 12px;">yuh</a> (2008-12-17 00:51:25 JST)
</li></ul>]]>
    </content:encoded>
      </item>
        <item rdf:about="http://sourceforge.jp/projects/sf-04webserver/wiki/Tech">
    <title>Tech</title>
    <link>http://sourceforge.jp/projects/sf-04webserver/wiki/Tech</link>
    <dc:identifier>Tech</dc:identifier>
    <dc:date>2008-12-05T10:08:15+09:00</dc:date>
        <description>
      <![CDATA[= 技術メモ
== 2.0の通信モデル
04WebServer 1.xx では、ブロッキングモードのソケットを通信に使用していた。
マルチスレッド環境では、通信関数でスレッドをブロックさせればよく、selectを使う必要が無いので、転送効率は良い。

04WebServer 2.0 の通信では、以下の機能の実装を必要とした。
 * タイムアウト
 * 中断
 * 任意のタイミングで]]>
    </description>
    <content:encoded>
      <![CDATA[<h1 id="h1-.E6.8A.80.E8.A1.93.E3.83.A1.E3.83.A2">技術メモ</h1><h2 id="h2-2.0.E3.81.AE.E9.80.9A.E4.BF.A1.E3.83.A2.E3.83.87.E3.83.AB">2.0の通信モデル</h2><p>04WebServer 1.xx では、ブロッキングモードのソケットを通信に使用していた。
マルチスレッド環境では、通信関数でスレッドをブロックさせればよく、selectを使う必要が無いので、転送効率は良い。
</p><p>04WebServer 2.0 の通信では、以下の機能の実装を必要とした。
</p><ul><li>タイムアウト
</li><li>中断
</li><li>任意のタイミングでの、切断検知
</li></ul><p>同等の機能は、1.xxでも実装されていたが、別のスレッドからclosesocketを呼ぶなど、良い実装とは言えなかった為、以下のように実装を変更した。
</p><ul><li>タイムアウト
<ul><li>オーバーラップI/O + 待機関数
</li></ul></li><li>中断
<ul><li>オーバーラップI/O + 待機関数
</li></ul></li><li>任意のタイミングでの、切断検知
<ul><li>WSAEventSelectでFD_CLOSEを有効にしておく
</li></ul></li></ul><p>当初、WSAEventSelectと非同期I/Oで実現していたが、転送効率が悪かったため、オーバーラップI/Oへ変更した。
これにより、OpenSSLの利用も、独自BIOを使用したものに変更した。
</p><h2 id="h2-OpenSSL">OpenSSL</h2><h3 id="h3-BIO">BIO</h3><ul><li>BIO.ptr は、自由に使ってよさそう
</li><li>BIO.num は、自由に使ってよさそう(ファイルディスクプリタの割り当てに使われる模様)
</li></ul><p>独自BIOは、以下のように実装
<pre>/*!
	COverlappedSocket を入出力に使うBIO

	参考：bss_file.c, bss_sock.c
*/
#include &quot;StdAfx.h&quot;
#include &quot;openssl/bio.h&quot;
#include &quot;openssl/err.h&quot;
#include &quot;OverlappedSocket.h&quot;

#define BIO_TYPE_OVR_SOCKET		(30 | 0x400)	//	BIO_TYPE_SOURCE_SINK

#ifndef MS_CALLBACK
	#define MS_CALLBACK
#endif

static int MS_CALLBACK	ovrs_write(BIO *h, const char *buf, int num);
static int MS_CALLBACK	ovrs_read(BIO *h, char *buf, int size);
static int MS_CALLBACK	ovrs_puts(BIO *h, const char *str);
static long MS_CALLBACK	ovrs_ctrl(BIO *h, int cmd, long arg1, void *arg2);
static int MS_CALLBACK	ovrs_new(BIO *h);
static int MS_CALLBACK	ovrs_free(BIO *data);

static BIO_METHOD methods_ovrs =
{
	BIO_TYPE_OVR_SOCKET,
	&quot;COverlappedSocket&quot;,
	ovrs_write,
	ovrs_read,
	ovrs_puts,
	NULL, // ovr_gets,
	ovrs_ctrl,
	ovrs_new,
	ovrs_free,
	NULL,
};

/*!
	インタフェース取得
*/
BIO_METHOD *BIO_s_ovrs(void)
{
	return(&amp;methods_ovrs);
}

/*!
	割り当て
*/
BIO *BIO_new_ovrs(COverlappedSocket *ovrs)
{
	if(ovrs == NULL)
		return(NULL);

	//	新規生成
	BIO *ret = BIO_new(BIO_s_ovrs());
	if(ret == NULL)
		return(NULL);

	//	設定
	ret-&gt;ptr = ovrs;
	ret-&gt;init = 1;
	return(ret);
}

/*!
	初期化
*/
static int ovrs_new(BIO *bi)
{
	bi-&gt;init=0;
	bi-&gt;num=0;
	bi-&gt;ptr=NULL;
	bi-&gt;flags=0;
	return(1);
}

/*!
	開放
*/
static int ovrs_free(BIO *a)
{
	if (a == NULL)
		return(0);
	a-&gt;ptr=NULL;
	a-&gt;init=0;
	return(1);
}

/*!	
	読み込み
*/
static int ovrs_read(BIO *b, char *out, int outl)
{
	if(out != NULL)
	{
		//	ポインタ取得
		COverlappedSocket *ovrs = (COverlappedSocket*)b-&gt;ptr;

		//	操作実行
		return(ovrs-&gt;BlockingRecv(out, outl));
	}
	return(0);
}

/*!
	書き込み
*/
static int ovrs_write(BIO *b, const char *in, int inl)
{
	//	ポインタ取得
	COverlappedSocket *ovrs = (COverlappedSocket*)b-&gt;ptr;

	//	操作実行
	return(ovrs-&gt;BlockingSend(const_cast&lt;char *&gt;(in), inl));
}

/*!
	書き込み(文字列)
*/
static int ovrs_puts(BIO *bp, const char *str)
{
	return(ovrs_write(bp,str, strlen(str)));
}


/*!
	コントロール
*/
static long ovrs_ctrl(BIO *b, int cmd, long num, void *ptr)
{
	long ret=1;

	switch (cmd)
	{
	case BIO_CTRL_RESET:
		num=0;
	case BIO_C_FILE_SEEK:
		ret=0;
		break;

	case BIO_CTRL_DUP:
	case BIO_CTRL_FLUSH:
		ret=1;
		break;

	default:
		ret=0;
		break;
	}
	return(ret);
}
</pre></p>]]>
    </content:encoded>
      </item>
    </rdf:RDF>

