無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

やねうらおさんから http クライアントサンプルコードへのツッコミ

mixi にてやねうらおさんから http://x68000.q-e-d.net/~68user/net/c-http-1.html のコードについてご指摘を受けたので、ここで書いても伝わるかどうかわかりませんが、一応回答と言い訳を。

> connectに失敗したときにソケットがcloseされない。

うーん。懐かしの malloc/free 論争を思い出してしまいました。その考えを否定はしませんが、わたしはここでは close しません。サンプルコードの可読性を損なうから。実務であっても、即終了するなら close しないと思う。理由は「OS にまかせて実害がないから」。常駐モノならするけど。

> そのreadってhttpで送られてきたデータを受け取っているのでないの?
> データ自体はRFCで規定されている長さまでなら送られてくると思うのだけど。

わたしの知る限りでは、RFC2616 においては HTTP のレスポンスメッセージの最大長は規定されていませんので、理論的には ssize_t の範囲のデータが返ってくると思います (実際は mbuf がもたなくてブロックしてしまうでしょうが)。

ついでに恥をさらしておくと、あのソースは他にもいろいろまずいところがあって、サンプルコードであるという前提であったとしても、以下の問題点があります。参考になれば>葵さん

◎直すべきもの
 ・write(2) のエラーチェックが漏れている。
 ・read(2) のエラーチェックが漏れている。
 ・close(2) のエラーチェックが漏れている。
 ・おっしゃるとおり、int は ssize_t に直すべき。
  ところで負け惜しみのようでかっこ悪いですが、「ssize_t は unsigned」というのは
  誤りだと思います (signed じゃないと read(2) が -1 を返せない)。ちなみに FreeBSD
  では int でした。

◎直した方がいいなぁと思うもの
 ・socket(2)・connect(2) などのエラーチェックで、errno を表示した方が親切。
 ・gethostbyname(3) のエラーチェックは herror(3) あたりを使った方が親切。
 ・read(s, buf, BUF_LEN) は read(s, buf, sizeof(buf)) に変えたいなぁ。
 ・strcmp(argv[1], "http://" ) は strcmp(argv[1], "http://" ) != 0 としたい。
 ・socket(AF_INET, ...) は socket(PF_INET, ...) が正しい (プロトコルファミリの指定なので)
 ・write(2) で全データを送りきったかどうかのチェックが漏れている。
  (ただし、送りきれない場合があるよってのはページをわけて説明したい)
 ・BUF_LEN は定数の種類を増やすとわかりにくくなると思っていたのですが、
  今考えると分けておいた方がいいような気がしてきました。

◎直すべきかどうか、いまだにわからないもの
 ・printf(3) のエラーチェック
  … みんな仕事の場合、printf(3)/sprintf(3)/fprintf(3) の戻り値をチェックしてるの?
    stdout or stderr への出力であっても?
スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

すみません

> 「ssize_t は unsigned」というのは誤りだと思います (signed じゃないと read(2) が -1 を返せない)。

みたいですね。ssize_tの頭文字のsがsignedの意味なんでしょうね。普通、size_t は unsignedにするのが常識なので確認せずに書いてしまいました。申し訳ない。

> わたしはここでは close しません。サンプルコードの可読性を損なうから。

あのサンプルコードを提示された初心者は、ソケットがリソースであるということと、ソケットをOpenした以上、Closeしなくてはならないのだ、ということがサンプルコードから学ぶことができません。その意味でもサンプルコードなのだからなおさらCloseしておくのが行儀が良いと感じます。

> ◎直すべきかどうか、いまだにわからないもの
> ・printf(3) のエラーチェック

すべての関数呼び出しに対してエラーチェックを行なうのはプログラムが冗長になりすぎます。そこで、現実的にはある程度エラーチェックをはしょるか、wrapするようなクラスを書いて、そこでエラーチェックを徹底するかします。C++なら例外を投げて全体をtry~catchしても良いでしょうから、結局のところ方針に一貫性さえあれば何でも構いません。

サンプルコードとしてはエラーチェックは要所以外(今回のはソケットのサンプルですから、ソケットまわり以外)は省略してあっても良いと考えます。

やねうらお | URL | 2007-01-25(Thu)02:35 [編集]


あ、あれ?どこで知ったのでしょう?*1 メールアドレスもわからなかったので送りようがなかったんですが。。
元々あのコードをサンプルとしてあげたのは、「何も考えずに打てば…」っていう前提なので、やねサンから突っ込み入るのも当然なんですよねw
コードの事については私は何も言わない事に…自分ならこう書くとか言い出したらどこぞの板みたいに不毛になりそうなので。
ちなみに私は20行くらいに縮めましたw

*1 私は「やねうらお プログラマ 本」で検索して発見

葵 | URL | 2007-02-27(Tue)13:47 [編集]


【参加者募集】開発者・技術者の支援プロジェクト

プログラマ・エンジニア特化型の事業支援プロジェクト
『スプリング・テック・キャンプ2008』(STC2008)の運営開始!


突然のメッセージにて失礼致します。
初めまして、ALITO株式会社と申します。開発者・技術者の方々向けの情報の1つとしてご覧頂けましたら幸いです



国内外企業のインキュベーション事業を展開する弊社は、開発者及び、技術者に焦点を当てた起業家支援プロジ

ェクト『スプリング・テック・キャンプ2008』(以下、STC2008)を開始しました。このプロジェクトは、開発者及び、技術者

がこれまで培った技術を活用し、自分が作りたいサービスを思う存分2ヶ月間で開発して頂くために、当社が最大限

に支援するプロジェクトとなります。


【STC2008の詳細ウェブ】
http://www.alito.co.jp/stc2008.html


■ 本プロジェクト概要
 STC2008は、開発者及び、技術者が集中して開発・制作に取り組めるよう、すべての環境を提供します。

■ スプリング・テック・キャンプ2008
生活(宿泊施設・食事)
インフラ(PC・サーバー・ネット)
オフィス(開発スペース)
技術サポート

■ 受付 2008年3月17日(月)より随時受付

■ 事業テーマ(どのプログラム言語でも可)
・ソフトウェア製品の開発
・ソフトウェアサービス
・ソフトウェア技術開発
・その他、ネット系開発・技術に特化したサービス 

■ 参加条件
・個人での応募、または開発チームでの応募可
・自分の開発・制作に対してフルコミットメントができること
・独創性・オリジナリティのあるアイデアであること
・自分のアイデアを開発するにあたって、エントリー者本人が技術力を持っていること
・現在、起業をしていないが、将来的に起業の意思があること
・年齢が15歳~40歳までであること
・ALITO株式会社の本社(東京都中央区)で作業が可能なこと
・ビジネス化を予定しているアイデアや技術に対する特許・著作権などの権利をALITO株式会社以外の個人、また

は団体が保有していないこと


もし、興味がありましたら、このプロジェクトに参加して、色々なプログラマーやエンジニアの方々とそれぞれの目標に向

って頑張ってみませんか?

http://www.alito.co.jp/stc2008_entry.html
こちらからご応募頂けますので、是非ご応募をよろしくお願い致します。

スプリング・テック・キャンプ2008 | URL | 2008-03-25(Tue)11:35 [編集]