- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/
- 52 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:23:55 ]
- >>51
最初は、実行回数よりも、実行時間の合計が大きな関数を見つけるほうがいいと思う。 ミクロな最適化して速度を稼ぐのは、後からでもいい。
- 53 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:33:26 ]
- >>52
うるせーバ〜カ
- 54 名前:48 mailto:sage [2007/09/01(土) 10:40:57 ]
- >>50
> 速くしたいのはどれだけ、というのは難しくとにかくできるだけ 達成すべき目標が与えられていないのなら、現状を目標にしてしまえ。 何もしなくても目標達成だ。おめでとう。 「とにかくできるだけ」つまり速度無限大が目標なら、 それを実現するためのコストも無限大が必要だ。 ということは、 自分でやらないで金を出してプロを雇ったほうがいい。 まぁいいや、桁違いに速くしたい、ということだと解釈しよう。 処理時間の大半を占めている部分について、 データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、 よりオーダーの小さいアルゴリズムに変更する。 下手なプログラムなら、これで桁違いに速くなる。
- 55 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:41:52 ]
- >>53
心が寂しいんだね。同情するよ。
- 56 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:53:11 ]
- >>55
同情するな金をくれ!
- 57 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 10:56:55 ]
- >>56
同情ってことは、俺も心が寂しいってことだ。 だから金はやれない。 あの安達祐実のセリフは日本語として間違っている。 「同情するなら〜」ではなく、「哀れむなら〜」のほうが意味としては適切かと。インパクトないけどね。
- 58 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 11:06:12 ]
- もう少し日本語を勉強したほうが良いと思うよ・・・
- 59 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 17:44:33 ]
- gcc -O2 hoge.c
- 60 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 11:33:14 ]
- まあ、この書き込みもみたくねぇって言われるのは承知の上で、
なんでここ、IDでないの? こんなウザイ書き込みIDNGワードにしてしまいたい。
- 61 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 11:39:07 ]
- >>60
死ね
- 62 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:00:16 ]
- たった一言で誰だか分かってしまうこのクォリティw
- 63 名前:44 [2007/09/04(火) 00:45:27 ]
- 返事がすごく遅れて申し訳ありません。アドバイスありがとうございます。
>データ量Nに対して処理のオーダーがNのX乗になっている部分を探し、 >よりオーダーの小さいアルゴリズムに変更する。 オーダーがNのX乗になる部分の探し方がわからないです。 まずはぐぐってみます。 そして、実行時間、実行回数が多い関数を探し出し(プロファイル使用。 使用したことはないのですが・・・)、その部分のより適した 計算方法を検討することを行ってみます。 大体このような流れでみなさんも処理時間の短縮を図っているのでしょうか?
- 64 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 00:56:30 ]
- わかりやすいボトルネックは二重ループしてるところとかかな。
でもループ内から呼び出した関数の中で別のループをしてるような一見わかりにくいものもある。 ま、プロファイラを使えば簡単に見つかるだろうけど。
- 65 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 03:04:58 ]
- >>63
> オーダーがNのX乗になる部分の探し方がわからないです。 データ量Nを10倍にしてみて、実行時間が100倍になれば2乗、1000倍になれば3乗。
- 66 名前:65 mailto:sage [2007/09/04(火) 03:08:06 ]
- 言葉が足りなかったかも。
プログラムを見て探すのではなく、 実際にプログラムを走らせてみて、 実行時間の変化を見るのです。 10倍だと極端かもしれません。 2倍とか3倍とか適当に試して。
- 67 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 05:00:10 ]
- C++の演算子の
.* ->* は、どういう時に、どのように使うものなのですか?
- 68 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 05:18:11 ]
- (構造体).(構造体のメンバ)
(構造体へのポインタ)->(構造体のメンバ)
- 69 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 07:47:22 ]
- メンバポインタのようにも見える
→ *
- 70 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 12:43:16 ]
- メンバポインタだな
X x, *p; int X::*m; というのがあったとき、 x.*m = 1; p->*m = 2; このように使う
- 71 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:53:45 ]
- クラスのメンバに、
自分自身を破棄してメモリを解放する関数って作れるのでしょうか? 例えばこんな感じです。 void destroy(){ DELETE(this);//インスタンスを破棄してメモリ解放する関数 }
- 72 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:56:10 ]
- そうすると静的に作ったインスタンスの扱いはどうなるの?
インスタンスが有効かどうかを保持するフラグをメンバ変数に持たせておく、 ぐらいの解決方法が一番な気がする。
- 73 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 23:56:36 ]
- delete this;
当然newしたものである必要がある。
- 74 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:08:48 ]
- newで作ってないインスタンスはdeleteで消せないんですね。
Javaしかやったことがないので、メモリ解放がイマイチ馴染まず、 できるだけ意識せず簡単に消せる作りにしたいんです。 メソッドのスコープ抜けたり、参照外れたりしたら、 勝手に解放されるとかいう風に作るのは無理でしょうか。
- 75 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:15:31 ]
- つ[スマートポインタ]
- 76 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:22:07 ]
- >>74
そもそもnewする必要がないものをわざわざnewして作ることもないと思うが。
- 77 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:23:59 ]
- >>75
stdっていうのが無いので使えませんたぶん… >>76 もしかしてnewで作らなければ、メソッドのスコープ抜けたとき勝手に破棄されるんでしょうか。
- 78 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:25:26 ]
- >>77
される(それはJavaと同じ)。 てか、まずは試してみたらどうだろう?
- 79 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:27:27 ]
- スタックとヒープの区別すらついていないとは…まるで知性を感じませんよ
newで作ったやつ…関数抜けても消えない。ヒープに取るから ローカル変数…関数抜けたら消える。以降は使用不可
- 80 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 00:33:04 ]
- スタックとヒープなんとなく違いが分かりました。
確かに知識不足ですね。まだ始めたばかりなんで勉強してみます。
- 81 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 07:06:58 ]
- >>77
ないならば、用意すればいい。 テンプレートが使えるコンパイラなら、 boost::scoped_ptrやboost::shared_ptrが使える。 もちろん外部のライブラリ使用禁止なら、 適当に名前空間を変えて自己責任で使えばいい。 そんなに複雑なものでもないし。
- 82 名前:67 mailto:sage [2007/09/05(水) 08:31:06 ]
- >>69-70
ありがとうございます。 これはエグい機能ですね。 どうりで今まで使いみちが理解できなかったわけです。 これを使うべき場面というのはあるのでしょうか。
- 83 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 09:11:26 ]
- >>71
C++に不慣れなうちは、delete this するようなクラスを作るのは、やめたほうがいいと思う。 なぜなら、delete this は、どうしてもそれが必要な特別な場合だけに限定すべきだから。 どうして、自分自身を破棄するようなメンバ関数が必要なの? もっと適切で良い方法を教えられるかも。
- 84 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 10:45:08 ]
- >>82
メンバ関数ポインタ でぐぐると使用例がいくつかヒットするかもしれない。 まぁでも滅多に使うもんじゃない。
- 85 名前:デフォルトの名無しさん mailto:sage [2007/09/05(水) 11:21:37 ]
- 直接メンバへのポインタには触れないけど、
mem_fun(やboost::bind)の中で使っているんだろうなとは思う。
- 86 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:29:14 ]
- >>83はもしかしからデストラクタを呼びたいのかも。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:30:20 ]
- >>83じゃねえや>>71だな。
- 88 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:10:16 ]
- 関数の引数で、
読み取りのみで変更を行わないものは、 void hoge(const Type& o) ; void hoge(const Type* p) ; どう使い分けるべきなのでしょうか。
- 89 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 13:19:56 ]
- 常に前者。
ただし、配列の要素を指すポインタを受け取るのであれば、 要素数を示す引数を追加した上で、ポインタを使う。 しかし、イテレータで済むならそっちを使う。
- 90 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 15:59:14 ]
- なぜポインタではなく参照を使うのでしょうか。
- 91 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 16:04:27 ]
- void hoge(const Type& o) ;
だったら引数にNULLを設定した場合、コンパイル時にエラーが分かるから。 ついでに void hoge(const Type* o) ; だと常にNULLチェックが必要、そうしないと実行時にどんなエラーが起こるやら。 ちなみにNULLがありえる場合は後者を使う。 ちなみに、ここでいうNULLとは Type* p = NULL; hoge(p); のことではなく hoge(NULL); のことですぅ。念のため補足
- 92 名前:デフォルトの名無しさん [2007/09/08(土) 16:58:52 ]
- C++で色々なプログラムを作りそのときの考え方を示し
実際にどのようにして作るのか解説してくれる本はありませんか?
- 93 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 17:25:48 ]
- 88です。
ポインタの安全ではない部分を解決するために、C++で参照が導入されたのだから、 参照を使ったほうがいい、ということですね。
- 94 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 00:30:37 ]
- >>91
NULLで参照がエラーになるのはNULLだからじゃなくて型が違うからだろ。
- 95 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:14:54 ]
- >>94
>>91はそういう話をしている。何も間違ってない。
- 96 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:46:04 ]
- >>95
>>91の書き方はからは読み取れない。 補足も意味不明。
- 97 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:51:34 ]
- 日本語でおk
- 98 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 01:55:28 ]
- >>97
日本語じゃなくてC++が分かってないんだろ。
- 99 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:00:32 ]
- 何や此奴俺初めて書き込んだのに
- 100 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:03:39 ]
- 91の言いたいことはわかるが、
説明がいまいちだったな。
- 101 名前:デフォルトの名無しさん [2007/09/09(日) 02:23:37 ]
- 94の言いたいことはわからないし、
人としていまいちだったな。
- 102 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:29:00 ]
- >>91 のポインタだと常にNULLチェックが必要ってのも素人くさいな。
- 103 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:32:35 ]
- >>102
まぁその辺は宗教入って来る話な気もするし、無しにしようや。
- 104 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:32:52 ]
- >>91
補足は、hoge(p); でなくて、hoge(*p); だよな。 hoge(p);とhoge(NULL); なら、どっちも参照ならエラーだし、ポインタならエラーにならないし。
- 105 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 02:45:13 ]
- >>103
宗教って言うと「常にNULLチェックする」ほうにも理があるみたいじゃん。
- 106 名前:デフォルトの名無しさん [2007/09/09(日) 04:51:23 ]
- 今BCCを使ってC言語の勉強をしていますが何かアプリケーションを作製したいときってどんなソフトがいりますか?
- 107 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 04:52:58 ]
- >>106
VisualC++
- 108 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 04:54:27 ]
- >>107 ありがとうございます!
- 109 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:18:46 ]
- >>106
107は、あなたをからかっている。 BCCでもアプリケーションは作れるが、 便利で強力な道具を使えば手間が省けるというもの。 どのようなアプリケーションを作りたいの?
- 110 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:44:59 ]
- >>109 メーラーです。複雑な機能は抜きとしてメールサーバーからメールを取ってくるというものです
- 111 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 07:58:30 ]
- GUIとCUIどっち?
- 112 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:02:49 ]
- GUIです。最低限の機能としてメール受信送信それと閲覧ができれば。
- 113 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 08:21:34 ]
- じゃぁ、C++Builder
- 114 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:35:15 ]
- >>112
何故作りたいの? 一発で巧く動くものが作れればいいけどそうでなければメールサーバに迷惑を掛けることにもなりかねないし、 何より便利なメールソフトが腐るほどあるのに。
- 115 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:37:33 ]
- >メールサーバに迷惑を掛けることにもなりかねない
ここには同意だが、なぜそんなにもやってみようという気持ちをくじくようなことを言うのか。
- 116 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:57:01 ]
- どうせやるなら、そこらに無いものを作ろうよ。
- 117 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 09:57:54 ]
- >>114
言語の話とはズレるけど、メールサーバを自分で立てるという発想は無いのか?
- 118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:05:25 ]
- >>105
ある。 例えばバグの早期発見と原因分析に役立つ。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:34:43 ]
- NULLポインタに何か意味があるならともかく、
そうでないなら、 NULLチェックなんてするとバグを見落とすことになる。 デバッグ中は、 NULLチェックせずに例外で落ちたほうがマシだと思うよ。
- 120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:53:18 ]
- >>119
そういうのを含めてNULLチェックというんでないの? NULLに対し何らかの処理が必要という意味で
- 121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 10:56:34 ]
- >>104
Type* p = NULL; のあとに*pとかやったら関数とか関係なく落ちるだろ…それもコンパイル時には分からん品
- 122 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:20:55 ]
- >>120
ふつ〜NULLチェックといったら、 NULLでないことを確認してからポインタの指す先を触り、NULLの場合はエラーとしてfalseを返す だろう。 正しくエラー処理していて堅牢に見えるけど、かえって、バグを抱えたまま、それらしく動いたりするのよ。
- 123 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:25:27 ]
- >>119
例外で落ちるってWindowsのメモリアクセス違反例外のこと? さておき。 単にセグメンテーションフォルトされたら、 落ちた位置とか原因とか分かり辛くなるじゃん。 現象が再現するとも限らないし、 テスト環境に開発環境があるとも限らないし。 異常発生後も動くのが嫌ならNULLチェックで 例外投げるなりexit()するようにしたら良いよ。 少なくともログ出せない落ち方よりログ出せる落ち方のが良いと思う。 そいえば。 Linuxとかでcore吐いてたら、まだコールスタックやら拾えるかなぁ。 VCとかにもそういうのあるの?
- 124 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:52:27 ]
- >>123
Windows限定ではないけど、いまどきのリッチな環境向けのOSなら、 NULLポインタの指す先にアクセスしたら、OSが待ったをかけてくれると思う。 メモリ保護がないハードとかは・・・別の話にしてほしい。 Windowsローカルの話だと、Dr.ワトソンというログ記録ツールが、OS標準搭載されてる。 メモリアクセス違反をやらかした場所のコードを逆アセンブルし、レジスタとスタックの状態を テキストファイルで保存してくれる。設定でプロセスのメモリイメージのダンプも可能。 下手にハンドルして貴重な情報をログに残さず捨ててしまうくらいなら、これを使ったほうがいい。 まぁ普通は、開発環境が入っているPCでテストしている最中に問題を見つけるし、 逆に言うと、その段階で問題を見つけられるようにテストすべきだから、 メモリアクセス違反をやらかしたらデバッガをアタッチすることになるかと。 自分は使うに至ったことないけど、リモートデバッグもできるとのこと。 これなら、リモートデバッグ用のエージェントだけをターゲットマシンに インストールすればいいので軽い。
- 125 名前:124 mailto:sage [2007/09/09(日) 12:04:27 ]
- 捕捉
逆アセンブルされたコードを見ても、C/C++のソースの該当箇所がわからないとダメなので、 コンパイルするときに、ソースコード付きでリスティングファイルを出力 リンクするときに、mapファイルを出力 んでもって、これらを生成されたバイナリとセットでしっかり管理する。
- 126 名前:デフォルトの名無しさん [2007/09/09(日) 12:44:44 ]
- データへのポインタpDataを取得する関数が、
こんな感じで定義されているのですが、 long GetData( void*& pData ) 「*」と「&」が並んでいるところのわけがわかりません。 void*& pDataのところは「*」がpDataのポインタをさしていて、 「&」はその参照を受け取る、というようなことなんでしょうか。 自分の持っている初心者向けの参考書には「参照には*をつける必要はない」と 書いているのですが…。
- 127 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:57:45 ]
- int &x
bool &y void* &pData
- 128 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 12:59:01 ]
- >>126
たとえば、 typedef void* VOID_PTR ; としたならば、 long GetData(VOID_PTR& pData ) と同等。 仮に参照を使わなければ、 long GetData(VOID_PTR* ppData ) long GetData(void** ppData ) かな。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 14:32:38 ]
- "voidポインタ"型の参照 と思え
それがよくわかるように>>127みたいに書くのを俺はすすめる (int* a, b; ってできないから困るが。)
- 130 名前:デフォルトの名無しさん [2007/09/09(日) 14:55:46 ]
- 質問です。
stl::listやstl::queueなどを複数のスレッドから操作 (push_back()やpop_front()など)する場合ミューテックスで ロックする必要があるのでしょうか? それとも元からスレッドセーフになっているのでしょうか?
- 131 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:38:10 ]
- VC++の場合はロックする必要がある
msdn2.microsoft.com/en-us/library/c9ceah3b(VS.80).aspx gccの場合もロックする必要がある gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_6 他の実装でもたぶんロックする必要がある あと stl:: っていう名前空間はないと思うが
- 132 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 16:30:35 ]
- >>130
もしWindowsなら、Mutexよりも、CriticalSectionを使おう。 念のため言っとくけど、 STLのコンテナのメンバ関数を1つ呼び出す直前・直後でロックするのはダメよ。 iteratorやコンテナ内のオブジェクトへのポインタの有効期間を考えて、適切な範囲でロックすべし。
- 133 名前:デフォルトの名無しさん [2007/09/09(日) 17:01:58 ]
- >>131
>>132 ありがとうございます。参考になりました。(英語はあんまり読めないけど。) コンテナのメンバ関数内で勝手にロックされるわけではないのですね。 >>131 std::の間違いでした。
- 134 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:49:57 ]
- >>114 何故?といわれましても別に仕事でもなく学校の課題でもないのですが個人的に作りたいと思いまして・・・
サーバーに関しては知り合いの許可をもらいやるので大丈夫です
- 135 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 19:59:33 ]
- テスト用のメールサーバくらい、VMwareとかVirtualPCとか使って、Linuxで適当に立てればいいじゃん。
通信するプログラムの場合、自分側だけでなく、相手側もデバッグモードにしたり、ログをチェックしたりするよ?
- 136 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:09:18 ]
- >>135 ありがとうございます。ちょと調べてみます。
- 137 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 20:13:29 ]
- パケットモニタも用意しよう。
暗闇を照らすものは多ければ多いほどいい。
- 138 名前:デフォルトの名無しさん [2007/09/09(日) 21:57:47 ]
- #include <stdio.h>
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main() { int sock0; struct sockaddr_in addr; struct sockaddr_in client; int len; int sock; sock0 = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = INADDR_ANY; bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); listen(sock0, 5);
- 139 名前:デフォルトの名無しさん [2007/09/09(日) 21:58:48 ]
- while (1) {
len = sizeof(client); sock = accept(sock0, (struct sockaddr *)&client, &len); write(sock, "HELLO", 5); close(sock); } close(sock0); return 0; } 364 名前:デフォルトの名無しさん[] 投稿日:2007/09/09(日) 21:48:41 このプログラムは複数のクライアントと接続するサーバプログラムらしいのですが なぜ複数のクライアントと接続することができるんですか? 実際、このプログラムはどのように動作するんですか? まず、listen(sock0, 5);で接続受付状態になって停止して 接続を受け付けたらwhile以下を実行するんですよね?
- 140 名前:デフォルトの名無しさん [2007/09/09(日) 22:00:34 ]
- コピペ?
- 141 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:03:03 ]
- すいません
聞く場所を間違えたのでここにコピペしました
- 142 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:11:19 ]
- >>121
だから>>91が意味わからんって言ってるんじゃないの。 「補足」どの部分の何を補足してるつもりなのか、意味がわからん。
- 143 名前:140 [2007/09/09(日) 22:17:53 ]
- >>141
すまそんとりあえず分かる範囲で… listen関数の第2引数は待ち受けの数を表し、 複数のクライアントからの接続要求を待つようです。
- 144 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:32:27 ]
- >>143
このプログラムでは待ちうけ数が5であるということは 接続要求が1つ来たらコードのlisten以下に処理が移るということですよね? このときの待ち受け数は4でこのプロセスはwhile内部の処理を行う そして、closeしたら待ち受け数が5になる 以下接続要求が来るごとにそれぞれのプロセスがlisten以下をcloseされるまで 実行するということですか? かなり日本語がおかしくて申し訳ないです
- 145 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:42:01 ]
- 違う。
listenは5つ分の接続要求を貯めるキューを作ってポートを開くだけ。 acceptで実際に接続が来るまで待ち、接続が来たらacceptから下にいく。 クライアントにHELLOを送って、接続を閉じて、またacceptで次の接続を待つ。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 22:47:06 ]
- 待ち受け数とかプロセスとか妙な言葉を使ってるけど、別に複数のプロセスが立ち上がるわけでもないし、同時並行的に5つの接続を捌けるわけでもない。
listenに指定する5っていうのは、プログラムの処理が追いつかなくてクライアントをどんどんacceptするのが追いつかないときに、OSが裏で5つまで接続要求を貯めておけるだけ。 6つめが来るとクライアントは接続拒否される。
- 147 名前:140 [2007/09/09(日) 22:47:45 ]
- ソケットは扱った事が余り無いのでなんとも言えませんが
その通りだと思います。 また、複数の接続要求(この場合だと5以下)が来た時は、 待ち行列に置かれアクセプト待ちに 越えると無視されるようです。 つ UNIXネットワークプログラミング入門 雪田修一 著 買ったは良いが今日まで読む機会が無かったありがとう…orz
- 148 名前:144 mailto:sage [2007/09/09(日) 22:54:48 ]
- >>145
>>146 並列的に処理をするものとばかり・・・ 実際は処理を行っているのは1つだけであとはためておくんですね listenで停止する(待つ)のではなくてacceptで停止して接続を待つんですね
- 149 名前:144 mailto:sage [2007/09/09(日) 22:59:27 ]
- あともうひとつ聞きたんですがlen = sizeof(client)という処理を行っているんですけど
この時点でclientには代入などが行われていないのでこのような処理を行うことは 出来ないと思うのですが?
- 150 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 23:08:02 ]
- 代入してなくても、その変数のサイズ (つまり sockaddr_in 構造体のサイズ) くらいはわかる
- 151 名前:144 mailto:sage [2007/09/09(日) 23:09:28 ]
- >>150
ああそういえば・・・ 色々答えていたただいてありがとうございました
- 152 名前:140 [2007/09/09(日) 23:32:37 ]
- #include <sys/types.h>
#include <sys/socket.h> int accept(int s, struct socketaddr *addr, socklen_t *addrlen); s…ソケットに結びついているディスクリプタ addr…ユーザプログラムの責任でアロケートしたアドレス格納用バッファへのポインタ addrlen…socklen_tへのポインタ よって struct sockaddr_in client; とあるので 第2引数にはclientのポインタが… &client 第3引数にはアドレス用バッファのバイト数が入ります。 int len = sizeof(client); はぁ、もう寝よ…
|

|