2008-01-01から1年間の記事一覧
前回よりも安定して動作するようになりました。 このプログラムは .NET Framework で用意されている HttpListener クラスと HttpWebRequest を使ってプロキシサーバ (Proxy Server) を実現します。 System.Net.HttpListener の仕様上、プラットフォームに制…
ThreadPool を使ってぶんまわすだけ。 Stop では Loop の終了を待ちます。 using System; using System.Net.Sockets; using System.Net; using System.Threading; using System.Diagnostics; namespace Samples { class ThreadPoolListener { Socket listene…
Socket.AcceptAsync() と SocketAsyncEventArgs を使います。 using System; using System.Net; using System.Net.Sockets; using System.Diagnostics; namespace Samples { /// <summary> /// SocketAsyncEventArgs を使ったサーバー。 /// </summary> class SocketAsyncListen…
.NET Framework で実装されている Begin/End パターンを使ってサーバーを作ってみました。 今回はクライアントと接続するだけです。クライアントとの通信処理は実装していません。 using System; using System.Net; using System.Net.Sockets; using System.…
移動しました。
実は数ヶ月前に toto に当選しました。といっても2等だったので1千万円まではいかなかったので非常に悔しいです。後1つあってれば金額が全然違ったのに!せっかく当選したので「当選証明書」をもらってみました。以下その時の流れ。 イーバンクにて toto を…
WWWC 補助ツール からダウンロードできます。今回の更新で動くページがかなり増えたと思います。 CONNECT で Socket.xxxAsync を使わないようにしたので、Windows XP 以前でも動くかも。調べてないけど。 接続の再利用するかしないかの判断がうまくなったの…
SocketAyncEventArgs を使った通信は WindowsXP 以上でしかサポートされていないみたい。まぁこだわらなくて良いので Begin/End パターンを使えばいいか。操作ごとに SocketError がとれて便利だったけど。 .NET のヘルプで Socket.Poll を調べてみると、Soc…
なにやら気をつける事があるようなので自分用テンプレート。 以下ソースコード using System; namespace Samples { // 参考: http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpgenref/html/cpconfinalizedispose.asp class Disposable :…
Keep-Alive の実装が適当すぎるせいか、ソケットを再利用したときにサーバー側から切断されていてもそれを検出できない。 GET なら再接続して送り直せばいい。しかし POST でメッセージボディが大きすぎるとき、メモリ使いすぎて困る。 なのでクライアントか…
まぁ、MS の公式サイトに載ってるのをほぼぱくっただけですが。 Begin/End パターンに見慣れているので、StartAccept を BeginAccept にしたってだけ。受け入れたクライアントを閉じる処理はしていない。OnAccept は virtual にしておいた。 Server.Start() …
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 では切断されるまでつなぎ続けるのがベストっぽいので非同期メソッドをつかって処理しよう。 Socket.ReceiveAsync() でブラウザ側から読んで、読むのに使った SocketAsyncEventArgs をそのまま オリジンサーバーに Socket.SendAsync() で送ればいい…
ストリームから1行読み取りたいなら、StreamReader なんかが使えるわけだけど、文字列としてしか扱えないので不便だ。HTTP 通信ではヘッダまでは ASCII で読んで良いが、それ以降は画像だったり書庫だったりのデータが送られてくる事があるので、StreamReade…
追記: 2008/12/28 改訂版 プロクシサーバーの作成は難しいです。ブラウザ側とプロクシ間の keep-alive と、プロクシとオリジンサーバー間の keep-alive ができないといけません。その辺の管理がややこしい。というわけで .NET Framework にぜんぶやってもら…
Safari for Windows Public Beta Seed 31A7 が公開されました。スクリーンショットです。 フォントスムージング機能はかなり気に入っています。Windows のフォントは見にくい(醜い)ですから、フォントスムージングのおかげでかなり綺麗に見えます。 普段は F…
CONNECT で SSL 通信をトンネリングするとなんか重くなるなーとおもったら無限ループしてた。通信終わっても Socket.Connected == false にはならないのね。 切断されるまでトンネリングするっていうループで、切断の判断を Socket.Connected でしてた。でも…
HTTP プロキシサーバを作っていて、最もやっかいなのは Keep-Alive の実装かな。 ブラウザ側との Keep-Alive とウェブサイト側との Keep-Alive をしなければならない。 (Browser Proxy, Proxy WebSite) ウェブサイト側の Socket を再利用しようとすると、既…
とりあえずなプロキシサーバーの実装ではあるが、keep-alive もできるようになってきた。ただ、例外処理はほとんどしていないのでその辺が問題だなー。ブラウザの中止ボタンとかで接続が止まったりとか、Origin Server が切断してきたりとか、なんやらするこ…
自分が初めてふれたプログラミング言語は Delphi だった。とりあえず ShowMessage() して動かした。だけど、何となく書きにくかった覚えがある。 んで、C# ってもんが出たってきいて Visual C# を買った。高かったけど。やってみるとコードは書きやすいと思…
名前は今後考えるとして・・・。 まず、考えがあまかった。HTTP の仕様なんてほとんどみてなかった。リクエストラインとかレスポンスラインをとりあえず受信して、それをそのまま送信すればいいやって思ってた。でも仕様をみてみると、持続的接続とかあって…