トップページ⇒tech
1001コメント360KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001lmtp2009/07/07(火) 00:46:28
主にソケットに関しての質疑応答スレッドです。

Programming UNIX Socket FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

関連リンクは>>2-10辺り
足りなかったら適当に付け足してね

前スレ
ネットワークプログラミング相談室 Port23
http://pc12.2ch.net/test/read.cgi/tech/1230466044/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc11.2ch.net/test/read.cgi/tech/1086238859/
0136デフォルトの名無しさん2009/07/29(水) 03:54:36
>>133
んな訳あるかい
0137デフォルトの名無しさん2009/07/29(水) 09:12:15
>>133
フラグメントがどのレイヤで発生するのか、勉強し直せ。
0138デフォルトの名無しさん2009/07/29(水) 10:14:20
ビッグパケットとか想定してもしょうがないしなあ
0139デフォルトの名無しさん2009/07/29(水) 19:41:39
クライアント側のマシンからネットワーク越し(TCPを想定)に
サーバ側マシン命令を送って(例えば move とか)
サーバ側マシン上においてOpenGLで描画されている3DCGを動かす
プログラムを作りたいと思っています。

この場合,サーバ側は,マルチスレッドにするしか方法はないのでしょうか?
クライアントから命令がくる→OpenGLに反映
はマルチスレッドじゃないとむりぽ!?

えろいひと、よろしくおねがいします。
0140デフォルトの名無しさん2009/07/29(水) 19:49:25
別にマルチスレッドじゃなくてもいいと思うけど、
OpenGLをマルチスレッドで動かすほうが面倒じゃね?
0141デフォルトの名無しさん2009/07/29(水) 20:00:35
>>139
シングルプロセス/シングルスレッド構成でも実現できると思うが、
想定している言語(C/C++/Java/Ruby/ObjC)や
プラットフォーム(Win/Linux/MacOSX)を明記してくれないと
アドバイスのしようがない。
0142デフォルトの名無しさん2009/07/29(水) 20:04:58
>>140, >>141
早速のご回答ありがとうございます。

iPhone上のOpenGL ESで描いたCGを母艦マシン(MacOSX)から
操りたいと考えています。
そのため,仕様言語はObjective-Cになります。

スレッド・プロセスまわりの話しに詳しくないので
何が最適なのか戸惑っています。

もうしわけありませんが、ご教示いただければ幸いです。
0143デフォルトの名無しさん2009/07/29(水) 20:05:25
>>141
結局は何もつくれないに一票
0144デフォルトの名無しさん2009/07/29(水) 20:18:56
もしUNIX系(Linux/MacOSX)でプロトタイピングを作成するのであれば、
Rubyがお勧め。標準でdRuby(分散オブジェクト)があるし、
OpenGLはRuby-GNOME2で実装されている。
プロジェクトが構想段階なら検討してみては?
0145デフォルトの名無しさん2009/07/29(水) 20:28:47
iPhoneでRubyは動かないんじゃね?
01461442009/07/29(水) 20:55:34
>>145
リロードしてなかった....orz
0147デフォルトの名無しさん2009/07/29(水) 20:55:45
Pythonがお勧め。
0148デフォルトの名無しさん2009/07/29(水) 22:03:03
>>142
iPhone向けの開発経験は無いけどReference Libraryを漁ってみた。

まずNSProx/NSConnectionで分散オブジェクトが簡単だろうと思ったが、
iPhoneOSのFoundation FrameworkにはNSConnectionクラスが見当たらない。
次にCFNetwork(Core Foundation)にはHTTP/FTP/Web Service向けのクラスは
存在するけど、どれもクライアント側のプロトコルしか実装されていない。

結論として、直にTCPソケット(CFStream)を操作して独自のプロトコルを
実装するしかないと判断する。(TCPコネクション確立はiPhone側から開始)
送受信メッセージのエンコーディングには、PropertyListを利用するのが
良いと思われる。(想定転送データ量によってバイナリ/XML形式の選択を決断)

で、最終的に質問のマルチスレッディングの要否についてだけど、
run loopにコールバック関数を登録する事で非同期I/Oが実現できるから、
結論として「マルチスレッディング無しで実装可能」と判断する。
iPhone Reference Libraryにある文書"CFNetwork Programming Guide"の
章"Preventing Blocking When Working with Streams"を参照してみてください。

実際に試した訳ではないので(すべて推測なので)、間違ってたらゴメソ
01491392009/07/29(水) 22:37:08
みなさまご回答ありがとうございます!

>>148
ここまで調べて頂きありがとうございます!
やってみます。
01501482009/07/29(水) 23:23:04
あと全体のアーキテクチャ設計について助言すると、
MacをクライアントそしてiPhoneをOpenGL表示サーバと位置づけ、
メッセージの対話形態としては「要求/応答/通知」方式にするのが良いと思う。
具体的には、Mac上のアプリケーションが表示メソッドを呼び出すと、
要求メッセージが送信され、iPhone上の表示サーバで要求された描画処理が
完了すると応答メッセージを返信する。またiPhone側からアプリケーションへ
イベントを発行したい場合(たとえば処理中断ボタンがタップされた)には、
通知メッセージを送信する。

おそらくX-Window Systemのコアプロトコルが参考になる。
意外にもWikipediaの文書が充実しているので、一読を勧めます。

ttp://ja.wikipedia.org/wiki/X_Window_System_コアプロトコル

RPCと分散オブジェクトを(Foundation Framework無しに)自力で実装する
わけですから、もしも汎用的な「リモートOpenGL表示システム」の設計を
目指すとしたら、かなり大変な作業になると思います。
でも、がんばって挑戦してみてください!!
0151デフォルトの名無しさん2009/07/30(木) 11:51:42
「C言語で2chに書き込みたいのですが」からやってきたんですが、
2chに書き込めない原因がわかりません。誰か手伝ってくれますか?

http://www1.axfc.net/uploader/Sc/so/22688.zip
0152デフォルトの名無しさん2009/07/30(木) 12:36:02
ok
0153デフォルトの名無しさん2009/07/30(木) 12:45:04
    ヾミ || || || || || || || ,l,,l,,l 川〃彡|
     V~~''-山┴''''""~   ヾニニ彡|       手伝う・・・・・・!
     / 二ー―''二      ヾニニ┤       手伝うが・・・
    <'-.,   ̄ ̄     _,,,..-‐、 〉ニニ|       今回 まだ その時と場所の
   /"''-ニ,‐l   l`__ニ-‐'''""` /ニ二|       指定まではしていない
   | ===、!  `=====、  l =lべ=|
.   | `ー゚‐'/   `ー‐゚―'   l.=lへ|~|       そのことを
    |`ー‐/    `ー――  H<,〉|=|       どうか諸君らも
    |  /    、          l|__ノー|       思い出していただきたい
.   | /`ー ~ ′   \   .|ヾ.ニ|ヽ
    |l 下王l王l王l王lヲ|   | ヾ_,| \     つまり・・・・
.     |    ≡         |   `l   \__   我々がその気になれば
    !、           _,,..-'′ /l     | ~'''  そのzipを開くのが
‐''" ̄| `iー-..,,,_,,,,,....-‐'''"    /  |      |    10年後 2chが無くなってからということも
 -―|  |\          /    |      |   可能だろう・・・・・・・・・・ということ・・・・!
0154デフォルトの名無しさん2009/07/30(木) 12:52:01
まずクッキーの終わりに改行?
0155デフォルトの名無しさん2009/07/30(木) 12:55:12
>>154
無かったね。218行目と357行目付近にWriteSz("\r\n");を追加。
0156デフォルトの名無しさん2009/07/30(木) 13:30:43
for(it++; it != cookie.end(); it++)
{
wsprintf(buf, "; %s=%s", it->first.c_str(),
url_escape(it->second).c_str());
WriteSz(buf);
}

これって cookie.end() にもデータはあるんだろ?

do
{
・・・処理・・・
}while(it != cookie.end()); じゃね?
0157デフォルトの名無しさん2009/07/30(木) 13:37:09
map::end()にはデータはないよ。
http://www.cplusplus.com/reference/stl/map/end/
0158デフォルトの名無しさん2009/07/30(木) 13:40:09
そうか、じゃあ>>156はなしで
0159デフォルトの名無しさん2009/07/30(木) 14:32:19
とりあえず、>>155とクッキーのパラメータのとこのurl_escapeを外したら書けるみたいよ
0160デフォルトの名無しさん2009/07/30(木) 14:34:07
あーあとNAMEとMAILのクッキー書いてるの外したわ
0161デフォルトの名無しさん2009/07/30(木) 14:35:19
まあ時間制限で書けなかったみたいだし関係ないとは思うが
0162デフォルトの名無しさん2009/07/30(木) 16:06:02
おれが153のAA貼ったとたん優しくなりやがって
天邪鬼どもが
0163デフォルトの名無しさん2009/07/30(木) 16:16:41
>>159-160
アップしてくれ
0164デフォルトの名無しさん2009/07/30(木) 16:23:55
age
0165デフォルトの名無しさん2009/07/30(木) 16:25:02
>>163
何でやねん、数行しか変わってないがな。
うまくいかんのならそう書けば。
そうそう、pc11.2ch.net を pc12.2ch.netに変えたりもしたけど。
0166デフォルトの名無しさん2009/07/30(木) 16:43:23
馬鹿に凶器持たせるようなことすんなよ・・・
0167デフォルトの名無しさん2009/07/30(木) 23:04:22
select() を使って recv() すると WSAEWOULDBLOCK って出ないはずですよね?
0168デフォルトの名無しさん2009/07/30(木) 23:15:36
>>167
非同期系ではそういう幻想を持たないほうがいい。
0169デフォルトの名無しさん2009/07/30(木) 23:20:34
>>168
そうなんですか。あるんですか。。
デバッグ中にブロックされていないはずの recv() が WSAEWOULDBLOCK を
返すところを見ちゃった気がするのですが気のせいだと思ってました。 orz
0170デフォルトの名無しさん2009/07/30(木) 23:45:35
届いてたけど拾いにこないから捨てちゃったとか?
通常ありえないよ。
デバッガで止めてたからとか。
0171デフォルトの名無しさん2009/07/31(金) 00:45:32
>>169
戻りを確認するifを入れて実際に起きるかどうか確認すればいい。
0172デフォルトの名無しさん2009/07/31(金) 11:25:21
>>165
「ERROR:ブラウザを立ち上げなおしてみてください。」
て出てきてできなかった。

http://www1.axfc.net/uploader/Sc/so/23023.zip
0173デフォルトの名無しさん2009/07/31(金) 22:26:18
>>170-171
確かにデバッガで止めてはいたのですが。。
色々調べてみるとWin9x系では起きるがNT系では起きないとか
select()はブロックされない事を完全には保証しないとか。

サンプルプログラム等をみるとselect()は非ブロックキングソケットを
使うのが前提となっているみたいですな。
ブロッキングされないのが保証されるのならブロッキングソケットでも
問題ないはずですが。
0174デフォルトの名無しさん2009/07/31(金) 22:32:30
ブロッキングだからこそselect必須。
ブロックされないのが保証できないなら、インターネット動いてねーわ。
0175デフォルトの名無しさん2009/08/01(土) 00:04:37
>>173
ブロッキングの意味を間違えて理解してる気がする。

あと、
>select()はブロックされない事を完全には保証しないとか。
という一文についても、日本語の解釈が誤っているのでは?
これは、ソケットにデータが到着していないにもかかわらず、
selectが戻ることがある(=ブロッキングを保証できない)、
という意味だと思う。言い換えると、selectが戻っても
いざreceiveしてみると受信データ長=0になることも時にはあるから、
その場合はもう一度selectをかけておくれ、を期待しているのではないかな。

最後におせっかいを言うと、何かトラブルが発生したとき、
「....だから、問題ないはず」という思い込みは解決のさまたげになる。
「....だけど、どこかに問題があるはず」という発想でいこうよ。
0176デフォルトの名無しさん2009/08/01(土) 00:20:24
>>175
受信データ長=0はfinがきたってこと。
それでもう一度selectって処理は普通しない。
そうでなければTCP的に言えば受信データ長0ってのは
確認応答しかありえない。これは上位レイヤーに届くことはない。

と言ってみる。
0177デフォルトの名無しさん2009/08/01(土) 00:28:02
平たく言えばアプリケーションレイヤで何かを受信した場合、
長さ1以上はデータ、0は通信の終了を意味する。
TCPがデータストリームの実装だという事を忘れている。
0178デフォルトの名無しさん2009/08/01(土) 00:40:25
>>176
では、
>いざreceiveしてみると受信データ長=0になることも時にはあるから、
の部分は、
>いざreceiveしてみるとエラー(EAGAIN or EWOULDBLOCK)になることも時にはあるから、
に訂正する。
0179デフォルトの名無しさん2009/08/01(土) 12:10:55
「ERROR:ブラウザを立ち上げなおしてみてください。」 って出てきて
2chへの書き込みができない。誰か助けて!

http://www1.axfc.net/uploader/Sc/so/23023.zip
0180デフォルトの名無しさん2009/08/01(土) 13:02:00
http://pc12.2ch.net/test/read.cgi/tech/1247438792/
C/C++の宿題片付けます 129代目
http://pc12.2ch.net/test/read.cgi/tech/1242876647/
いろんな言語で宿題スレ
http://pc12.2ch.net/test/read.cgi/tech/1197620454/
C#,C#の宿題片付けます。
0181デフォルトの名無しさん2009/08/01(土) 13:10:28
Linux だと「select が『読める』といっても read で
ブロックすることあるよ」って書いてあるな。
0182デフォルトの名無しさん2009/08/01(土) 13:25:00
>>180
宿題スレに書けと? 宿題じゃないんだけど。
0183デフォルトの名無しさん2009/08/01(土) 16:22:15
>>181
これか・・・
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
>データが到着したが、検査でチェックサム異常が見つかり廃棄された
>時などに起こりえる。

一体どこで検査してんだ
破棄したなら上に投げるなよw
明らかに違反してるだろ
時など、って他にもあるなら書けよ
省略すんなよ
0184デフォルトの名無しさん2009/08/01(土) 18:40:57
宿題じゃなくても丸ごと依頼するなら宿題と同じだ。
自分でネットの勉強ぐらいしろよ。
0185デフォルトの名無しさん2009/08/01(土) 18:51:30
>>182>>179
http://pc12.2ch.net/test/read.cgi/tech/1224449899/
01861732009/08/01(土) 20:36:54
>>181
それって酷い気がする。
NT系だとブロックしないらしいけど念のためwoodblockは
スルーするように実装しました。
0187デフォルトの名無しさん2009/08/02(日) 05:48:55
>>183,186
Linux TCP/IPドライバの中の人を擁護してみると、
一般論としてselectを前提にしたAPI(ソケット/デバイス/ライブラリなど)の場合、
selectでREAD可能を返したのにread操作でデータ無しとなってしまう事態は、
どうしても避けることができないケースが存在しえることを理解してほしい。
今回のLinux TCP/IPドライバの場合、受信割り込みの延長でのチェックサム計算は
(システム全体の応答性能を劣化させるから)避けたかったのだろうと推測する。

だから最近のAPIでは(特にGUI向けAPIでは)、APIの内部でevent loop & selectを実行し
本当にデータが到着した場合にだけ(事前にアプリケーションが登録した)
call back関数を呼ぶという方式が増えているのだと思う。
この方式であれば今回のselectの問題だけでなく、このスレでたびたび話題となっている
受信メッセージの組み立て処理もAPI側で吸収できる(アプリケーションから隠蔽できる)
利点がある。

0188デフォルトの名無しさん2009/08/02(日) 08:35:44
>>187
> 今回のLinux TCP/IPドライバの場合、受信割り込みの延長でのチェックサム計算は
> (システム全体の応答性能を劣化させるから)避けたかったのだろうと推測する。

割り込み処理は, 読み込んだ物理層のフレームをソケットバッファにつないで
ソケットバッファ持ってるプロセス(スレッド)を起こすだけ.

IPヘッダやさらに上位の層のチェックサムはプロセスコンテキストで計算して
る

到着したセグメントを捨てた後, 再度新規セグメントの入力待ちに移行する方
法を選択しなかっただけ.

おそらく, 初期の腐りきったスタックの挙動と互換性を取る為だとおもわれる.
0189デフォルトの名無しさん2009/08/02(日) 09:02:37
腐りきったってw
TCP/IPのタイムアウトの設定なんかかなり古いもんを引きずっている気がする。
connect()なんてタイムアウトまで待ちきれなくて自分で切ってるし
TIME_WAITなんかも長く居座り過ぎだし。
今のギガビットのネットワークにはそぐわないな。

0190デフォルトの名無しさん2009/08/02(日) 09:20:05
>>189
> TIME_WAITなんかも長く居座り過ぎだし。
RFC で 2MSL と決まってる
01911872009/08/02(日) 09:28:17
>>188
詳しい解説ありがとう。TCP/IPドライバの実装に詳しそうだから教えてほしいのだけど、

>割り込み処理は, 読み込んだ物理層のフレームをソケットバッファにつないで
>ソケットバッファ持ってるプロセス(スレッド)を起こすだけ.
とありますが、起こすのはシステムプロセス(システムスレッド)でいいのでしょうか?
もしアプリケーションプロセスだと、そのプロセスが監視(select or recv)していない時は
フレーム受信キューに溜まりっぱなしになってしまう訳だから。

ただ、そうだとすれば、チェックサム計算はシステムプロセスで実行して
エラーであれば破棄し、正常であれば(上位の)ソケット受信キューへつないで
アプリケーションプロセスを起こすように実装していれば、
(チェックサム計算エラーに限定すると)今回のselect問題は発生しなかったように思えます。
その辺が自分にはよく分からないのですよ。
0192デフォルトの名無しさん2009/08/02(日) 10:07:53
>>191
> とありますが、起こすのはシステムプロセス(システムスレッド)でいいのでしょうか?
そだよ.

> フレーム受信キューに溜まりっぱなしになってしまう訳だから。
どっちにしても, 受け取る奴がいないとたまりっぱなし
window size = 0 で ack 返して送信側がそれ以上送らないように制御する
UDP だと黙って捨てる

> エラーであれば破棄し、正常であれば(上位の)ソケット受信キューへつないで
> アプリケーションプロセスを起こすように実装していれば、

BSD 系の実装だとそうなってるし, Linux も 2.0 から 2.2 へ移行するときの
大幅にスタック書き換えたタイミングで, そうゆう実装をする選択枝も可能
だったはず.
ソース眺めても, そんなに大変な変更じゃないし………

結局は, 過去との互換性を取ったって事ではあるまいか?
0193デフォルトの名無しさん2009/08/02(日) 10:14:35
玉味噌な人だな〜
0194187,1912009/08/02(日) 10:21:39
>>192
過去との互換性ですか。
もしTCP/IPスタックの実装を参考にしようと思ったら、
(Linuxではなく)BSD系のコードを追ったほうが良さげですね。

どちらにしてもスレから脱線した質問ですので、これで終わりにします。
レスありがとうございました。
0195デフォルトの名無しさん2009/08/02(日) 11:54:18
いや、こういう挙動の話はためになる
もっと続けて欲しい
0196デフォルトの名無しさん2009/08/02(日) 12:26:02
ネットーワークプログラミングってアンドキュメントなお決まり事があったり、
ネットで拾えるサンプルプログラムがDQNな実装(特に.Net系)だったりするので
挙動が分かってないと苦労しまするよ。
0197デフォルトの名無しさん2009/08/02(日) 12:27:58
>>187
> 受信割り込みの延長でのチェックサム計算は(システ
> ム全体の応答性能を劣化させるから)避けたかったの
> だろう

昔組み込み向けネットワークドライバを Linux でクロ
ス開発してて、テストとして Linux のパケットをルー
プバックデバイス経由で RAW ソケットで読んでもチェッ
クサムが合わなくてさぁ…。

FreeBSD でやったら一発で通って「なんじゃそら」って
なもんでしたよ。
0198デフォルトの名無しさん2009/08/02(日) 12:32:20
本採用な鯖でlinuxが使われない理由がなんとなく判った
0199デフォルトの名無しさん2009/08/02(日) 12:35:21
>>198
そうなん?
Linux鯖って結構稼動している気がするが。
0200デフォルトの名無しさん2009/08/02(日) 15:15:26
いまどき、IPはもちろん、TCPチェックサムまでは、送信受信ともハードウェアの仕事でしょ。
パケット生成時にチェックサム作るなんてことしない。
その辺考慮してないと197みたいなことになる。
0201デフォルトの名無しさん2009/08/02(日) 15:57:39
基本的な質問だと思うけど、うまく見つけられなかったのでおせーてください。

自分のルータのグローバルIPアドレスを外部鯖にHTTP接続して取得したいのだけど、
【IPのみ】をページ表示してくれる有名な鯖とかってある?

本当はホスト名を一発表示してくれるとこがいいけど、
まーAPIでなんとかなるんでとりあずIPで!
02022012009/08/02(日) 15:59:44
上の文章だとわかりづらかったので補足。

IPのみというのは、IPアドレス以外の無駄な情報が無いってこと。
正規表現とかHTMLパーサーとか使うのが面倒なので・・・。
0203デフォルトの名無しさん2009/08/02(日) 16:02:16
ルータに聞けばいいじゃない
02042012009/08/02(日) 16:03:50
>>203
汎用的な方法がしりたいんでつ
いろいろな場所で使いたいので、ルータ固有となるとちょっと・・
SNMPも一般向けのルータにはあまりないらしいので。
0205デフォルトの名無しさん2009/08/02(日) 16:25:49
>>204
汎用的な方法は、自分のルータのグローバルIPアドレスを
Dynamic DNSに登録して、その名前でIPアドレスを検索すること。
登録するドメインは自分で取得してもいいし、借りてもいい。

おそらく自宅鯖を外部からアクセスしたいんだとエスパーするけど、
汎用的な方法はこれしかない。

DNSへの登録が嫌で、なおかつ汎用的でなくても良ければ、
自分で安いレンタル鯖を借り、要求元のIPだけを返すCGIを置けばいい。

いずれにしても板違いの質問だよ。
自宅サーバ板/通信技術板/ネットサービス板へドーゾ。
0206デフォルトの名無しさん2009/08/02(日) 16:27:38
>>200
へぇ〜、そんなハードもあるんだ。。
一般のパソコンにも実装されてるの?
0207デフォルトの名無しさん2009/08/02(日) 16:35:00
>>201
そういうサーバを立てればいいだけじゃね?
0208デフォルトの名無しさん2009/08/02(日) 16:38:38
>>200
> いまどき、IPはもちろん、TCPチェックサムまでは、送信受信ともハードウェアの仕事でしょ。
> パケット生成時にチェックサム作るなんてことしない。

NAT とかどうすんのさ。仮想レイヤは? 一々ハードウェ
アレイヤまで落すのか? そもそも NIC 持ってないマシ
ンでの SLIP とかどうすんの?
0209デフォルトの名無しさん2009/08/02(日) 16:42:49
DDNSは運用面で問題有るから、うざいのが本音だな。
基本reject_hostに入れてる。

犬のTCP/IPスタック周りの挙動は怪しいよな。学習用のminix由来じゃしょうがないが。
0210デフォルトの名無しさん2009/08/02(日) 16:48:04
>>209
> 学習用のminix由来

Minix なめんな(w
http://www.minix3.org/
0211デフォルトの名無しさん2009/08/02(日) 16:50:58
DDNSをreject_hostに入れるって何の話よ
02122012009/08/02(日) 16:52:57
>>205>>207
板違いなのに答えてくれてサンクス
自分がだけが使うわけではないから、DynamicDNS登録もcgiもパスかな。
素直に診断君とか、適当な鯖にUDP送って取得することにする
どもでしたー
0213デフォルトの名無しさん2009/08/02(日) 16:53:14
>>206
おそらく以下の記事にある「TCPチェックサムオフロード」の事を
>>200は言っているのだと思う。

FreeBSD 10ギガビットネットワーク高速通信の秘密(2008/10/29)
 [3] ハードウェアオフロードによる処理の高速化
http://journal.mycom.co.jp/articles/2008/10/29/bsdcon5/002.html

ただしサポートしているのは一部のサーバ向けハイエンドNICだけだったはず(?)だし、
ましてや>>197は「組み込み向けネットワークドライバ」と明記しているから、
>>200の言う「いまどき」が何を(or いつの時代)を指しているのかよくワカランwww
0214デフォルトの名無しさん2009/08/02(日) 16:54:48
正常切断でこんなロジックを見かけるけど、これってありなの?
shutdown(soc, SHUT_RDWR);
close(soc);
0215デフォルトの名無しさん2009/08/02(日) 17:37:52
>>213
何年前から来たんだよ。FEの時代は高級品だけだったけど、GbEならオンボだつて蟹だってついてる。>TOE
Windowsのハードウェアのプロパティにチェックサムオフロードの設定あるだろ。
オフロードが効いてるとWiresharkでチェックサムエラーになるから判る。
Linuxは、ドライバ設計が古くてTOE使えない時期が長かったけど、流石に今は対応してたはず。
0216デフォルトの名無しさん2009/08/02(日) 17:44:54
>>214
通信シーケンスに自信がないなら入れておくという程度。
sdの状態的にSHUT_RDWRを指定した時FINハンドシェークが起こるが、
closeをいきなり呼んでも暗黙的にこの処理は行なわれる。
半二重通信でもしない限り明示的なshutdownは必要ない。
ただし、能動通信側が送りっぱなしで突然閉じるようなことをすると、
shutdown無しの場合受動通信側のパケットを無駄に待ってしまったりと
sdが完全に無効になるまで時間が掛かる場合がある。
0217デフォルトの名無しさん2009/08/02(日) 18:03:18
>>216
shutdown(SHUT_WR)
recv() でゼロかエラーが帰ってくるまで待つ。
(どちらも帰って来ない場合もあるのでタイムアウト処理を入れる)
close()

こんな面倒くさい(お行儀の良い)処理をしなくて一方的に切断しても特に
問題ないって事ですか?
0218デフォルトの名無しさん2009/08/02(日) 18:26:47
>>215
>Linuxは、ドライバ設計が古くてTOE使えない時期が長かったけど、流石に今は対応してたはず。
いやデスクトップはいいんだけど、>>197の言う「組み込み向けLinuxボード」でも対応してますか?
>>206の質問にある、(チェックサムオフロードをサポートした)ハード(ボード)にも答えて下さいませ。
あなたは>>200のレスで、>>197に対して「いまどき」と発言しているんですが........。
一般的な事実(独り言)としては正しいのかもしれないけど、質問に対する返答になってない気がします。
0219デフォルトの名無しさん2009/08/02(日) 18:52:09
犬廚はウィンドウズのドライバの詳細項目なんてチェックしないと思うけどな。
TOEってちゃんと動くか? 動かない条件のほうが多いと思うよ。
0220デフォルトの名無しさん2009/08/02(日) 19:29:20
>>219
>TOEってちゃんと動くか? 動かない条件のほうが多いと思うよ。

いや、>>215の住む世界だと、Linux/WindowsともGbEでさえあれば、
TOEが動くのが今時は当然な事らしい....。
0221デフォルトの名無しさん2009/08/02(日) 20:00:40
>>218
話をややこしくして済まないんだが、「クロス開発」で
あって別に Linux 向けの組み込みじゃなかったのよ。
ターゲットは OS から俺一人で書いた奴(RISC CPU で
メモリがバンク切り替えな環境)。

でもって開発環境だった Linux をネットワークドライ
バテストの対向ルーチンにしようとしてて、たとえば
UDP パケットを Linux 側で作ってループバックデバイ
ス通して RAW ソケットで読んで自前のドライバのテス
トケースに突っ込んで…ってなことをやってたわけ。

別にハードウェアで計算するならするでいいけどさ、そ
れなら仮想的なループバックデバイスを使う場合はそこ
で計算すべきじゃないかと思うんだ(計算しない理由は
パフォーマンスを稼ぎたいというのが正解で、コンパイ
ルオプションで計算が有効になるようになってたところ
までは調べた)。

因みにちょっと前にあった「NAT 通した時にチェックサ
ムおかしいんだけど…」なんていうバグはこの辺に起因
してる気がする。くわばらくわばら(w
0222デフォルトの名無しさん2009/08/02(日) 20:20:07
>>217
だからぁ、「一般的には問題ない。でも、ある特別なケースでは
問題となるかもしれない」と>>216はレスしている。
その可能性のあるケース(の一部)も>>216でレスされている。
それが>>217に当てはまるかどうかは、>>217が想定してる状況を
明記してくれないと、エスパーでもない限り誰にも返答できないよ。

横レス失礼
0223デフォルトの名無しさん2009/08/02(日) 20:59:17
>>222
>>216 は、
shutdown(SHUT_RDWR)
close()
と
close() #暗黙的にshutdown処理されるので
は同じだと言っている。

であればshutdown()は意味のないことに成る。

だったら、>>217 の処理はしなくて close() でいきなり
ソケットを閉じても問題ないってこと?

TIME_WAITで処理されるのでどんな切り方をしょようと
結局は皆同じってことでよいのかな??
0224デフォルトの名無しさん2009/08/02(日) 21:23:38
逆に言えばshutdown入れとけばどんな切り方してもいいから入れとけ。
0225デフォルトの名無しさん2009/08/02(日) 21:33:51
鯖が迷惑するとか考えないのかな。
IPBANされるぞw
0226デフォルトの名無しさん2009/08/02(日) 21:42:11
>>224
(゚◇゚)ゞラジャ -
でも、shutdownしたら鯖の電源が落ちました〜
0227デフォルトの名無しさん2009/08/02(日) 21:53:59
鯖が先に切るのか、クライアント側が先に切るのか、
実際はプロトコルによって変わるとしか言えない。
APIの呼び出し手順みたいな単純な話には置き換えられない。
0228デフォルトの名無しさん2009/08/02(日) 22:01:16
組み込みでもチェックサム生成ぐらいの機能なら
ハードウェアに用意してある場合が多い。
もっともエラータで使えなかったりするが。>microchipのやつ
02292222009/08/02(日) 22:17:58
>>223
だから、「一般的」には

>だったら、>>217 の処理はしなくて close() でいきなり
>ソケットを閉じても問題ないってこと?

で問題ないと(>>216の先頭に)書いてあります。

>TIME_WAITで処理されるのでどんな切り方をしょようと
>結局は皆同じってことでよいのかな??

これも、「一般的」には同じと考えてかまいません。

でもね、数百、数千台のクライアントの相手をしなければならない
サーバ環境を想定してみてください。大量に残ってしまった
(カーネル空間内の)TIME_WAIT待ち状態が、システム性能に
深刻な悪影響を与えかねないという事は分かってもらえますか?

もしもそのようなシビアな状況を想定しているのであれば、
(>>216にある「送りっぱなしで突然閉じる」ようなことをせずに)
きちんと手順をふんでTCPコネクションを解法するよう実装すべきです。
でも、>>217,223の想定している状況がどれほどシビアなのかは
本人にしか知り得ないから、誰にも返答できないと>>222でレスしました。
0230デフォルトの名無しさん2009/08/02(日) 22:33:24
>>229
>サーバ環境を想定してみてください。大量に残ってしまった
>(カーネル空間内の)TIME_WAIT待ち状態が、システム性能に
>深刻な悪影響を与えかねないという事は分かってもらえますか?

どんな切り方をしようが先にshutdown()した方にTIME_WAIT状態の
セッションが2MSLは残るんじゃないの?
02312222009/08/02(日) 22:51:27
>>230
失礼、>>229内にあるTIME_WAITは誤りで、FIN_WAITに訂正します。
(>>216にも、きちんと「FINハンドシェークが...」と書いてありました)
0232デフォルトの名無しさん2009/08/02(日) 23:16:01
>>231
FIN_WAITって鯖側のソケットをclose()しても残ったままになるの?
02332222009/08/02(日) 23:19:47
>>232
TCPの状態遷移図を(RFCなどで)確認してみてください。
0234デフォルトの名無しさん2009/08/02(日) 23:35:32
えーと、TCP/IP って双方向通信だって事忘れてない?

世の中には一方通行通信で良い場合もあるし、一方通行
で構わないタイミング(たとえば、片方は言いたいこと
を全部言い終わったとか)もある。shutdown() で片方
閉じるってのは元々そういう用途だよ。
0235デフォルトの名無しさん2009/08/02(日) 23:39:05
>>233
RFC見ましたがソケット関数とtcp状態遷移の関係がわからない。。
首吊って人生やりなおしてきます。orz
0236デフォルトの名無しさん2009/08/03(月) 00:15:25
RAWソケットで実際につくってみたらいい
■ このスレッドは過去ログ倉庫に格納されています