ネットワークプログラミング相談室 Port13

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/06/10(金) 01:49:45
そんなに支離滅裂かなあ。バックグラウンドにある
概念を素直に括り出しただけだと思うけど。
支離滅裂だと思ってる人は、実はソケットの概念を
ちゃんと理解してない希ガス。
UNIX の socket API なんて、4.2BSD の時に定義
されてからほとんど変わってないので、>>946
言うようなその場しのぎの拡張なんてものは、
そもそもないわけだし。(WinSock は知らん)

あと、handbook もいいけど、
/usr/share/doc/psd/20.ipctut/
/usr/share/doc/psd/21.ipc/
も読んだ方がいいような。
*BSD系の場合ね。Linux は知らん。
まあUNP読めばいいんだけどね。和訳もあるわけだし。
953デフォルトの名無しさん:2005/06/10(金) 02:01:59
> バックグラウンドにある概念を素直に括り出した

言い換えれば、要するに「低水準」「そのまんま」「剥き出し」
なインタフェースなんだよな。
昔から概念が存在するファイルのようには、高度に抽象化・単純化された
インタフェースにはなってない。

ソケットプログラミングは、open/read/write/closeでは済まずに
皆にioctlを強要するようなイメージ。
もっと標準に近いところで、Java程度に手軽なC/C++ライブラリが
あるといいのだが。
954デフォルトの名無しさん:2005/06/10(金) 02:41:36
あんまし単純化されちゃうと面白みがなくなる
955デフォルトの名無しさん:2005/06/10(金) 02:43:38
んなことない。
普通socket/getaddrinfo/connect/read/write/closeだけで
済みますよ。openがsocket/getaddrinfo/connectに変わった
だけで、ファイルアクセスとレベルは変わらん。
956デフォルトの名無しさん:2005/06/10(金) 03:10:24
>>955
おめでたいな・・・
趣味レベルにとどめとけよ
957デフォルトの名無しさん:2005/06/10(金) 03:21:19
やりたいことにもよるが、>>955の範囲で書けるプログラムも
多いでしょ。たとえば古き良き finger なんて、実際その程度
のことしかしてない。
それ以外のAPIが必要なのは、socketシステムコールがファイル
アクセスシステムコールよりも低レベルだからじゃなくて、
背後にある概念がファイルアクセスよりも複雑だからだな。
レベルの高い低いは似たようなもん。
958デフォルトの名無しさん:2005/06/10(金) 09:23:28
>>945
>ろくなドキュメントをそろえもせずに
>口を開けば find grep man

じゃお前の部署で書いて晒せ
うちには予算が無い いや~ん(//∇//)
959デフォルトの名無しさん:2005/06/10(金) 13:32:34
>>953
凝ったことしなくてイイんなら、ディスクリプタを fdopen に突っ込めば
イイんじゃないの?俺は使ったことないから知らんけど。
960デフォルトの名無しさん:2005/06/10(金) 14:16:44
>>959
実際、4.3BSD以降の finger は、まさに fdopen() にソケットを
渡してる。

ただし stdio の実装がタコタコなOSだと駄目かも。
例えば SVR4 の 4.0.3 以降、4.1 より前では、fread() で
partial read を正しく処理してないため、ベンダが独自に
直してない限り fread() を使うと問題が出る筈。
961デフォルトの名無しさん:2005/06/11(土) 01:22:44
むしろなんでもファイルにしようという概念が好かん
fd扱ってても結局ファイル扱ってるのかパイプ扱ってるのか
ソケット扱ってるのか意識しなけりゃならないし
962デフォルトの名無しさん:2005/06/11(土) 01:25:41
生成するときはそれぞれゴチャゴチャと設定が必要だけど
とにもかくにも作ってしまえばあとはまあそれなりに
ディスクリプタを等価に扱える ってのは便利だよな

問題は生成時の処理のデタラメ加減なわけだが
963デフォルトの名無しさん:2005/06/11(土) 01:29:47
>>961
「ファイル」って…「入出力ストリーム」です。
964デフォルトの名無しさん:2005/06/11(土) 01:46:26
デバイスも入出力ストリーム・・・

と言えなくもないか
965デフォルトの名無しさん:2005/06/11(土) 01:55:09
あんなに簡潔なAPIを、ゴチャゴチャとかデタラメとか
表現する感覚が理解できん。

ストリームをディスクリプタで抽象化するという概念を
ちゃんと理解していたら、あれ以外の選択肢は、ほぼ
あり得ないのは明らかなのに、そういうことも分かって
ないのね。かわいそう。
966デフォルトの名無しさん:2005/06/11(土) 02:01:03
struct sockaddrをベースクラスのように扱って、サイズを見て判断
みたいなのはCだからしょうがないところはあるが、
キャストだらけの汚いコードを書かされる元

ユーザコード側の至る所でhtons, htonlなどを使う必要があるが、あれも
もっと減らせるだろ
プロトコルスタック側で変換かけりゃいいんだから

967デフォルトの名無しさん:2005/06/11(土) 02:01:49
インターフェースは簡潔なんだけどね
968デフォルトの名無しさん:2005/06/11(土) 02:08:36
getaddrinfo(3) と sockaddr_storage を使ってれば、いまどき
キャストなんて要らないよ。
sockaddr は opaque な型として扱うので、sockaddr_in みたいな
構造を触る必要もない。当然 htons や htonl も全く使わない。
感覚古すぎるよ...
969デフォルトの名無しさん:2005/06/11(土) 02:11:56
>>968
そりゃすまんかった
970デフォルトの名無しさん:2005/06/11(土) 02:43:48
いきあたりばったりの拡張であることは事実
971デフォルトの名無しさん:2005/06/11(土) 02:47:33
windowsのapiよりは…
972デフォルトの名無しさん:2005/06/11(土) 02:51:18
>>970
socket 関係のシステムコールは 4.2BSD の時に今のものと
ほぼ全く同じものが実装されて、その後、インターフェース
は特に変わってないんだけど。
自分が無知なのを自覚してないのか、それとも分かってて
デマを流しているのか、どちら?
973デフォルトの名無しさん:2005/06/11(土) 03:05:10
まあ当時はIPv6とかは無かったわなあ
974デフォルトの名無しさん:2005/06/11(土) 03:07:27
で、IPv6 でも、4.2BSD で設計されたシステムコールが
そのまま全く同じように使えると。こういうのは、普通
いきあたりばったりじゃなくて、先見の明があるって言
うよね。
975デフォルトの名無しさん:2005/06/11(土) 03:13:09
getaddrinfo()とかは新しいでしょ
あ、あれはシステムコールじゃないか
976デフォルトの名無しさん:2005/06/11(土) 03:15:38
まあでも、アドレスファミリー・プロトコル依存性だとか
>>966の言う汚さを隠蔽するために新しいインタフェースが導入されてるわけで
>>968の言うような世界はもともとは無かった訳だから
>>970の言うことも必ずしも間違いとは言えまいよ
977デフォルトの名無しさん:2005/06/11(土) 03:19:40
そう? いきあたりばったりってのは完全に間違いだと思うけど。
右に左にフラフラしてたわけじゃなくて、まっすぐ自然な拡張
だと思うよ。システムコール自体は、最初っからプロトコル独立
になってたわけだしね。
978デフォルトの名無しさん:2005/06/11(土) 03:24:26
プロトコル独立だけど透明ではなかったわけだ
だから後で隠蔽するラッパーを作る必要があった
979デフォルトの名無しさん:2005/06/11(土) 03:28:50
>>978
ひょっとして全然分かってないんじゃない?
IPv6を利用する場合のAPIは、システムコールに
ついては以前と全く同じで、ラッパーでも何でも
ないよ。
ライブラリ関数として実装されていた以前の
gethostbyname(3)/gethostbyaddr(3) が、別の
ライブラリ関数である getaddrinfo(3)/getnameinfo(3)
に置き換わるだけ。これも、置き換えであってラッパー
じゃない。
980デフォルトの名無しさん:2005/06/11(土) 03:33:54
ライブラリ関数=システムコールのラッパーという意味で書いたんだけど
まあどうでもいいや

置き換えは置き換え。ようするにインタフェースが代わったのは事実だよね
昔のままでは対応できなかったと。
981デフォルトの名無しさん:2005/06/11(土) 03:36:17
gethostbyname
getipnodebyname
gethostbyaddr
とコロコロかわってますな
982デフォルトの名無しさん:2005/06/11(土) 03:36:55
gethostbyname(3) や getaddrinfo(3) を
システムコールのラッパーと考える奴は
根本的にモノを分かってないと思われ。
983デフォルトの名無しさん:2005/06/11(土) 03:38:54
>>981
gethostbyname()とgethostbyaddr()を並べて「コロコロかわってる」って
言うわけね。(w
とりあえず、君はプログラミングはしない方がいいよ。
984デフォルトの名無しさん:2005/06/11(土) 03:38:56
いいよ俺はアフォでもモノがかわってなくても。
でも、インタフェース変わってるのは事実でしょ。

で、なぜか昔からかわってないんだと主張する香具師もいれば
>>968みたいに、新しいインタフェースなら綺麗なんだと主張する香具師もいる
985デフォルトの名無しさん:2005/06/11(土) 03:41:04
>>982
getaddrinfoは本質的にはgethostbyname, gethostbyname2のラッパーじゃないのか
アドレスファミリの差異その他を隠蔽するための
986デフォルトの名無しさん:2005/06/11(土) 03:42:06
inet_addr()のように使い物にならないとされて消えたのもあるな
987デフォルトの名無しさん:2005/06/11(土) 03:43:59
システムコールは昔から変わってないし、
ネームサービスのためのライブラリ関数は、昔の
プロトコル依存した関数から、プロトコル独立の
きれいな関数に変わった。
全然矛盾してないと思うけど?

いきあたりばったりっていうのは、拡張に拡張を重ねて、
迷路みたいになったインターフェースことを言うんだよ。
昔よりずっと見通しが良くなったのを指して、いきあた
りばったりと表現するってのは、プログラミングだけ
じゃなくて日本語のセンスにも問題があるのでは?
988デフォルトの名無しさん:2005/06/11(土) 03:47:02
なんだ単に「いきあたりばったり」って言葉にこだわってるだけか
もしかして?
それこそどうでもいい話だな
989デフォルトの名無しさん:2005/06/11(土) 03:49:39
size_tがsocklen_tに変わったりとか
まあ色々あるわな
ネームサービス周りだけじゃないだろ
990デフォルトの名無しさん:2005/06/11(土) 03:50:07
>>981
gethostbyaddrじゃなくて
getaddrinfo
だった
まぁどうでもいいな

しかしなんでそんなに必死なのか
991デフォルトの名無しさん:2005/06/11(土) 03:53:02
>>989
size_t が socklen_t になったんじゃなくて、
int を使ってる OS と size_t を使ってる OS があった
ので、共通のソースにできるように socklen_t が定義
されただだよ。
つまり実際には型は変わってない。名前が統一されただけ。
992デフォルトの名無しさん:2005/06/11(土) 03:55:10
行き倒れマッタリ
993デフォルトの名無しさん:2005/06/11(土) 04:10:30
ひとり基地害がいるね
994デフォルトの名無しさん:2005/06/11(土) 05:27:18
どこどこ?
995デフォルトの名無しさん:2005/06/11(土) 05:55:31
>>995
>どこどこ?
お前の事だ
996デフォルトの名無しさん:2005/06/11(土) 09:49:59
>>966>>970は馬鹿だから無視してください。スレが汚れます。
997デフォルトの名無しさん:2005/06/11(土) 09:51:58
>>985も馬鹿。仕様を理解してない。
998デフォルトの名無しさん:2005/06/11(土) 10:04:23
商用UNIXではシステムコール並の扱いだけどね。
999デフォルトの名無しさん:2005/06/11(土) 10:05:10
それが何か?
1000デフォルトの名無しさん:2005/06/11(土) 10:29:28
close(13);
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。