2008-01-01から1年間の記事一覧

C# と .NET Framework で作る簡単プロキシサーバ

前回よりも安定して動作するようになりました。 このプログラムは .NET Framework で用意されている HttpListener クラスと HttpWebRequest を使ってプロキシサーバ (Proxy Server) を実現します。 System.Net.HttpListener の仕様上、プラットフォームに制…

ThreadPool を使った非同期サーバ

C#

ThreadPool を使ってぶんまわすだけ。 Stop では Loop の終了を待ちます。 using System; using System.Net.Sockets; using System.Net; using System.Threading; using System.Diagnostics; namespace Samples { class ThreadPoolListener { Socket listene…

SocketAsyncEventArgs を使った非同期サーバ

C#

Socket.AcceptAsync() と SocketAsyncEventArgs を使います。 using System; using System.Net; using System.Net.Sockets; using System.Diagnostics; namespace Samples { /// <summary> /// SocketAsyncEventArgs を使ったサーバー。 /// </summary> class SocketAsyncListen…

Begin/End パターンを使用した非同期サーバー

C#

.NET Framework で実装されている Begin/End パターンを使ってサーバーを作ってみました。 今回はクライアントと接続するだけです。クライアントとの通信処理は実装していません。 using System; using System.Net; using System.Net.Sockets; using System.…

toto (スポーツ振興くじ) に当選したらどうすればいいか?当選証明書のもらい方

移動しました。

toto (スポーツ振興くじ) に当選したらどうすればいいか?当選証明書のもらい方

実は数ヶ月前に toto に当選しました。といっても2等だったので1千万円まではいかなかったので非常に悔しいです。後1つあってれば金額が全然違ったのに!せっかく当選したので「当選証明書」をもらってみました。以下その時の流れ。 イーバンクにて toto を…

Proxy を更新しました

WWWC 補助ツール からダウンロードできます。今回の更新で動くページがかなり増えたと思います。 CONNECT で Socket.xxxAsync を使わないようにしたので、Windows XP 以前でも動くかも。調べてないけど。 接続の再利用するかしないかの判断がうまくなったの…

SocketAsycnEventArgs は Windows XP 以上でしかサポートされていないらしい

SocketAyncEventArgs を使った通信は WindowsXP 以上でしかサポートされていないみたい。まぁこだわらなくて良いので Begin/End パターンを使えばいいか。操作ごとに SocketError がとれて便利だったけど。 .NET のヘルプで Socket.Poll を調べてみると、Soc…

IDisposable の実装

C#

なにやら気をつける事があるようなので自分用テンプレート。 以下ソースコード using System; namespace Samples { // 参考: http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpgenref/html/cpconfinalizedispose.asp class Disposable :…

Expect: 100-continue

Keep-Alive の実装が適当すぎるせいか、ソケットを再利用したときにサーバー側から切断されていてもそれを検出できない。 GET なら再接続して送り直せばいい。しかし POST でメッセージボディが大きすぎるとき、メモリ使いすぎて困る。 なのでクライアントか…

SocketAsyncEventArgs を使ったサーバーを作る

C#

まぁ、MS の公式サイトに載ってるのをほぼぱくっただけですが。 Begin/End パターンに見慣れているので、StartAccept を BeginAccept にしたってだけ。受け入れたクライアントを閉じる処理はしていない。OnAccept は virtual にしておいた。 Server.Start() …

HTTP のリクエストを解析する

HTTP のリクエストを解析し、プログラム上で扱いやすくするクラス。 using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Text; using System.IO; namespace ReadTest { class Request…

CONNECT のトンネリングは非同期で

CONNECT では切断されるまでつなぎ続けるのがベストっぽいので非同期メソッドをつかって処理しよう。 Socket.ReceiveAsync() でブラウザ側から読んで、読むのに使った SocketAsyncEventArgs をそのまま オリジンサーバーに Socket.SendAsync() で送ればいい…

ストリームから1行読み取る

ストリームから1行読み取りたいなら、StreamReader なんかが使えるわけだけど、文字列としてしか扱えないので不便だ。HTTP 通信ではヘッダまでは ASCII で読んで良いが、それ以降は画像だったり書庫だったりのデータが送られてくる事があるので、StreamReade…

C# で作る簡単プロクシサーバー

追記: 2008/12/28 改訂版 プロクシサーバーの作成は難しいです。ブラウザ側とプロクシ間の keep-alive と、プロクシとオリジンサーバー間の keep-alive ができないといけません。その辺の管理がややこしい。というわけで .NET Framework にぜんぶやってもら…

Safari for Windows Public Beta Seed 31A7

Safari for Windows Public Beta Seed 31A7 が公開されました。スクリーンショットです。 フォントスムージング機能はかなり気に入っています。Windows のフォントは見にくい(醜い)ですから、フォントスムージングのおかげでかなり綺麗に見えます。 普段は F…

CONNECT のトンネリング

CONNECT で SSL 通信をトンネリングするとなんか重くなるなーとおもったら無限ループしてた。通信終わっても Socket.Connected == false にはならないのね。 切断されるまでトンネリングするっていうループで、切断の判断を Socket.Connected でしてた。でも…

Keep-Alive の実装

HTTP プロキシサーバを作っていて、最もやっかいなのは Keep-Alive の実装かな。 ブラウザ側との Keep-Alive とウェブサイト側との Keep-Alive をしなければならない。 (Browser Proxy, Proxy WebSite) ウェブサイト側の Socket を再利用しようとすると、既…

持続的接続

とりあえずなプロキシサーバーの実装ではあるが、keep-alive もできるようになってきた。ただ、例外処理はほとんどしていないのでその辺が問題だなー。ブラウザの中止ボタンとかで接続が止まったりとか、Origin Server が切断してきたりとか、なんやらするこ…

言語の選択

自分が初めてふれたプログラミング言語は Delphi だった。とりあえず ShowMessage() して動かした。だけど、何となく書きにくかった覚えがある。 んで、C# ってもんが出たってきいて Visual C# を買った。高かったけど。やってみるとコードは書きやすいと思…

Proxy Server について

名前は今後考えるとして・・・。 まず、考えがあまかった。HTTP の仕様なんてほとんどみてなかった。リクエストラインとかレスポンスラインをとりあえず受信して、それをそのまま送信すればいいやって思ってた。でも仕様をみてみると、持続的接続とかあって…