アーカイブ

Posts Tagged ‘C Sharp’

続・C#で動的なハイポートで待ち受けるWebサーバを実装する

以前C# WebServerに投げたパッチが、1.1にマージされました。これでHttpListenerにハイポートが指定できるようになったのですが、高水準APIのHttpServerはハイポートをサポートしません。
追加のパッチを投げたのですが、そちらは2.0で不要になるので却下となりました。
今の所2.0はリリースされていないので、1.1にパッチを当てて使っています。

広告
カテゴリー:開発 タグ:

C#で動的なハイポートで待ち受けるWebサーバを実装する

ニーズが解りにくいかもしれませんが、LAN内で通信するアプリケーションを実装する時に、通信プロトコルとしてHTTPを選択するケースが該当します。
ランダムなハイポートにどうやって接続するんだと疑問に思うかもしれませんが、ポート番号はZeroconfなどでブロードキャストします。
利点としてはIANAにポート番号を登録したり、衝突覚悟で使う必要が無いという事をあげておきます。

C#でWebサーバを実装する場合、真っ先に思いつくのはSystem.Net.HttpListenerクラスだと思いますが、このクラスは以下の理由で今回の目的には使えません。

  • ポート番号に0を指定して、カーネルに動的なハイポートを割り当てさせる事ができない。未確認なので0を受け付ける可能性もあるが、少なくても割り当て後のポート番号を確認する方法が無い。
  • ファイアーウォールに除外設定を行う方法が無い。HttpListenerは通信をhttp.sysの中で行うため、プロセス名を指定して除外設定を行う事ができない。また、利用するポート番号はランダムなので、ポート番号を指定して除外する事もできない。

そこで、アプリケーションに埋め込み可能なHTTPサーバの実装を探してみたんですが、C# WebServerという物がありました。
すべてC#で書かれていて、Apacheライセンスです。
試したところ、ポート番号0を指定すると例外を投げます。また、リスン開始後のポート番号を確認する方法もありません。
そこで、パッチを作成しました。
ポート番号に0を指定するとランダムなハイポートを割り当てます。
また、割り当てたポート番号を読み出せるプロパティを追加しました。

パッチはプロジェクトにポストしました。
マージしてくれると、メンテが楽なんですが……。

カテゴリー:開発 タグ:

C# 3.0

仕事のプロダクトがC# 3.0に移行しました。少しずつ、新しい文法を試しています。

ラムダ式は匿名delegateのシンタックスシュガーで、アルゴリズムに条件式を渡したい時には使い勝手が良いです。
単純にコードが短くなるという事もありますが、表現も自然です。
一方で複文を渡すような場合の可読性は、匿名delegateと大差無いです。
現状、式を渡す時だけ使っています。

期待していたgenericの共変と反変は、サポートされていませんでした。
しょんぼり。

カテゴリー:開発, 仕事 タグ:

Skype A2A APIを試す

以前からぼんやりと、仲間内用にP2P型のグループウェアを書けないだろうかと考えていました。
しかし実際にプロトコルや相互接続の仕組みを考え始めると難しく、なかなか手が付いていませんでした。

最近になってSkype APIに、A2Aと呼ばれるオーバーレイ通信の仕組みがある事に気がついたので、感触を見てみる事にしました。
Skypeの開発者サイトに行くと、なぜかDelphi用のサンプルプログラムが充実しています。
とっかかりに、A2AのサンプルプログラムをC#に移植してみました。

a2achat.zip
a2astreams.zip

概ねどんな物か理解できましたが、接続性などのSkypeの利点を享受できる事を除けば、さほど楽になりそうも無いです。

カテゴリー:開発 タグ:

CocoaSharpファーストインプレッション

OSX用のMonoには、C#のCocoaバインディングが含まれています。
面白そうなので、試しにヒレガス本のサンプルを移植してみました。

randomapptar.gz

Nibのアウトレットやアクションを、C#のフィールやメソッドに結合させる時にアトリビュートを使うのですが、メソッドなどの名称だけを使うよりもスマートな手法だと感じました。

// クラス
[Register("Foo")]
public class Foo : NSObject {
}

// アウトレット
[Connect]
public NSTextField textField;

// アクション
[Export("generate:")]
public void generate(object sender) {
}

Exportで指定するのはObjective-Cのシグニチャでなので注意が必要です。awakeFromNibを定義した時に、うっかり末尾に「:」を付加してハマりました。

唯一不自然な部分は、Nibからロードするクラスには下記のコンストラクタを用意する必要がある事なのですが、定型なので許容範囲だと思います。

// コンストラクタ
protected Foo(System.IntPtr raw, bool release)
  : base(raw, release) {
}

コンストラクタを忘れると、イベントが発生したとたんに落ちます。

大変面白いと思いますが、現状ではXcodeでデバックするような事は出来ないので、直ぐにObjective-CやJavaの代わりにはならないです。

カテゴリー:開発 タグ: