Gauche > Archives > 2010/04/14

2010/04/14 01:55:46 UTCshiro
#
ついでなのでsrfi-98のサポートを足しました。
2010/04/14 02:22:50 UTChigepon
#
やった!
2010/04/14 02:27:04 UTChigepon
#
srfi で socket の提案があるとうれしいなと思いつつ難しいだろうな。BSD Socket に期待される動作・仕様の部分は、srfi の仕様書には書かなくてもよいなら多少は楽かもしれないけど。
2010/04/14 03:36:05 UTCshiro
#
srfi-98はコードは2行で済むんですけどドキュメントを足すのが億劫で (あちこちクロスリファレンスを入れなくちゃならないので) さぼってました。
#
socketは難しいですね。ほんとに簡単なサーバ/クライアントを実現するだけならかなり共通化して書けるけど、それではトイプログラム程度しか書けない。実用的にしようとするとソケットオプションを考慮したりソケットアドレスをちゃんと扱ったりせざるを得なくなる。
#
いっそ、レイヤをひとつ上げたメッセージパッシングAPIみたいな感じにして、障害時の適切な動作だけ順当なものを決めておき、泥臭い部分は全部実装に任せる、とした方がいいかもしれない。
2010/04/14 03:55:13 UTChigepon
#
>それではトイプログラム程度しか書けない。実用的にしようとするとソケットオプションを考慮したりソケットアドレスをちゃんと扱ったりせざるを得なくなる。
#
同意です。
#
http://mosh.monaos.org/files/lib/mosh/socket-ss.html
#
一方で↑くらいの機能があれば簡単な http server/client が書けるので
#
標準があった方が良いなあと。
#
sockopt 相当は処理系に任せれば良いくらいの気持ちで。
#
Ruby はBSD ソケットまんまだ。
#
http://www.ruby-lang.org/ja/man/html/Socket.html
2010/04/14 04:00:30 UTCshiro
#
raw socket作る時はserviceは単に無視されるの?
2010/04/14 04:07:00 UTChigepon
#
SOCK_RAW はサポートしていないです。
2010/04/14 04:07:02 UTCshiro
#
クライアント側だと簡単なAPIでもそんなに問題ないかも。
2010/04/14 04:07:20 UTChigepon
#
そうなんです>クライアント
#
それこそ twitter クライアント作りたいと思ったら必要な機能はたかが知れている感じ。
2010/04/14 04:08:11 UTCshiro
#
サーバ側は、REUSEADDRが指定できないとか、ipv4/v6両方で待つサーバをポータブルに書けないとかいうのはかなり問題になる。
#
twitterクライアント、ちゃんと動くやつにしたかったらタイムアウト問題に対応しないとならないんじゃない? それは別レイヤにすべきかなあ。
2010/04/14 04:09:08 UTChigepon
#
自分の実装は REUSEADDR はデフォルトです。
#
確かに>タイムアウト
2010/04/14 04:09:37 UTCshiro
#
tcpの永遠待ち問題は抽象化の破れだと思うんで、どっちかというとネットワークライブラリで対応されてるといい感じだと思うんだけど。
2010/04/14 04:09:49 UTChigepon
#
ipv6 はお仕事系では要求がありそうですね。
2010/04/14 04:10:50 UTCshiro
#
というより、システムがv6サポートしてる場合、何も考えずにサーバ作ったら自動的にv4/v6両方で待ってくれる、っていう方がいいと思う。
2010/04/14 04:11:23 UTChigepon
#
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche:I/O%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88
2010/04/14 04:11:36 UTCshiro
#
その場合、「ソケット」というのはちょっと粒度が細かすぎる。
2010/04/14 04:12:33 UTChigepon
#
なるほど。v6がどれくらい必要とされるか全然知らなくてそのあたりの感覚を持ち合わせていないです。
#
お昼ご飯行ってきます〜。
2010/04/14 04:17:02 UTCshiro
#
たぶん、陽に必要とされることってそんなに無いと思うんだけれど、だから簡易APIだとわざわざv6対応しようとは思わないと思うんだよね。で、そういうv4べったりのsocket srfiをベースにしたライブラリがどんどん作られて、後でv6対応したいと思った人が見たら、Schemeの高レベルネットワークライブラリはたくさんあるけど全部v4べったりで結局自分で書き直さないとだめだぁ、ってなったらあんまり嬉しくない。
#
他のやつの基礎になるsrfiなら、そこだけアップグレードすれば上に乗っかったやつは全部その恩恵を受けられるってほうが嬉しい。
2010/04/14 04:26:38 UTCshiro
#
v6対応ではまったことはないんだけど、低層に縛られた例として、CLの何かのライブラリでhttpのハンドリングからボディのhtmlのパージングまでやってくれるやつがあったんだけど、文字エンコーディングのハンドリングが不十分で結局使えなかったってことがあった気がする。
2010/04/14 05:12:18 UTChigepon
#
なるほど。となると socket srfi を提案する人にはそのあたりのバランス感覚が必要ですね。
2010/04/14 06:48:39 UTCshiro
#
簡易socket APIの問題点として、それをベースにして上に抽象化レイヤを積み上げられない、というのがある。
#
ちょっと考えてたんだけど、高レベルのレイヤで必要な機能はなんだろう。
#
通信端点オブジェクト(ハンドル)、通信相手の指定、ブロッキング時の対応、相手消滅時の対応、複数のチャネルを待つこと、あたり?
#
そのへん、「チャネル」みたいなオブジェクトでひとつレイヤを組めないだろうか。
2010/04/14 07:21:26 UTChigepon
#
ふむふむ。組めそうですね>チャネル。いわゆるメッセージング。ところで socket もそういう目的の抽象化レイヤーだとも思います。登場の背景や環境が古いので今から見るとややこしいですが。
#
うまく Scheme のポートに乗ると良さそうですね。ソケットがバイナリポートとして見えるイメージ。