トップページ⇒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/
0666デフォルトの名無しさん2009/09/08(火) 01:22:01
受信サイズが毎回違っても問題ないようなプログラムを書けばいい。
0667デフォルトの名無しさん2009/09/08(火) 01:28:56
>>663
そのあたりの面倒を全部引き受けてくれるのがTCP
パケットの順序がバラバラになっても一部が失われても再送したりして復元してくれるし
相手が忙しそうなら送信スピードを自動的に調節したりもする
UDPはパケットが失われたり順序が入れ替わったり同じパケットが2度届いたり
等の現象にすべて自分で対処しなければならない

>>665
TCPは複数のsendを1つのパケットにまとめて転送効率を上げたり
送信スピードを調節してゆっくり送ったりする機能があるので
sendした分が実際に送られるパケットサイズと一致するとはまったく限らないし
sendしたバイト数とrecvできるバイト数が一致するなどとはまったく期待できない
recvは1バイトでも今すぐ返せるデータがあればさっさと返すような仕様になってるから、そういう動作をする
例えばGIFのインタレース表示をしたいブラウザなんかは、一部でもデータが到着したら
その部分はもう描画し始めたいわけだから、そういう仕様でないと困る
固定サイズずつ処理したいアプリケーションは、そのサイズが来るまで繰り返しrecvを呼べばよい
0668デフォルトの名無しさん2009/09/08(火) 01:50:54
>>663
たとえばだな、イーサネットのフレームサイズは 1500 バイト程度だ
IPが連続したデータとして、ある程度はめんどう見てくれるけど
UDP には到達保証を行う機能がないので 10k 送った中で 1 フレーム
でもエラーを起こすと 10K 全部が全滅
0669デフォルトの名無しさん2009/09/08(火) 07:14:16
またこの話題か・・・
ネットワークプログラミングってこの話題しかないし
この話題には回答者がいっぱい出てくるねw
0670デフォルトの名無しさん2009/09/08(火) 08:04:58
毎回、受信するサイズが違うのにそれらを一つのデータとするようなプログラムって
どんな感じになるのでしょうか?

TCPならコネクション切断されるまでが一つのデータ?
UDPならその境目がないような
0671デフォルトの名無しさん2009/09/08(火) 08:12:45
毎回受信するサイズが同じだったら一つのデータにできるのか?
だったら簡単だろ。
0672デフォルトの名無しさん2009/09/08(火) 08:13:16
なんか適当にぐぐってサンプルコード探して読んでみろ
0673デフォルトの名無しさん2009/09/08(火) 08:33:50
データの頭に長さをデータとして持つとか
このデータが来たら一つのデータ終わりとか
0674デフォルトの名無しさん2009/09/08(火) 08:50:45
UDPにおいて、単一ソケットで複数個所と通信するのと、
通信先分ソケットを作るのではどっちが効率いいんだろう
必要分のバッファをソケットに確保しておけば変わらない?
0675デフォルトの名無しさん2009/09/08(火) 12:27:18
>>674
一つのスレッドが一つのソケットで通信するようにして、
ソフトウェアスレッドをハードウェアスレッド数作成するのが一番いい。
0676デフォルトの名無しさん2009/09/08(火) 13:02:49
ソケットが一つなのに複数スレッドで何やるん?
0677デフォルトの名無しさん2009/09/08(火) 13:03:38
ああ分かったごめん何でもない^^;
0678デフォルトの名無しさん2009/09/08(火) 19:30:32
複数の相手と通信する場合、
・ひとつのソケット
・通信先の数のソケット
どっちがいい?ってことだから間違ってはないんじゃないの?>>675-676
0679デフォルトの名無しさん2009/09/08(火) 19:33:47
675=677 じゃなくて 676=677 なのか
0680デフォルトの名無しさん2009/09/08(火) 19:54:57
そういう事を疑問に思うレベルの奴がUDP使うと絶対に嵌る。
0681デフォルトの名無しさん2009/09/08(火) 20:45:25
ネットワークプログラミングでネットワークがつながらない時にもなんとか処理してくれと言われたんだけど
こいつは頭がいかれているのか、それとも何か方法があるのか
0682デフォルトの名無しさん2009/09/08(火) 20:50:26
ワラタw
0683デフォルトの名無しさん2009/09/08(火) 20:50:47
そのなんとかを考えるのがお前の仕事じゃないのか? 思いつかない降参しろ。
0684デフォルトの名無しさん2009/09/08(火) 20:55:44
>>681
上司か?w
さらに上に相談して解雇してもらえw
0685デフォルトの名無しさん2009/09/08(火) 20:57:03
迂回回線を引くしかないな
0686デフォルトの名無しさん2009/09/08(火) 21:00:07
>>681
ローカルにキャッシュ置いといたりするのはよくやるけど。
あと、接続に失敗したらsleepして、ネットワークが回復したら再トライとか。
0687デフォルトの名無しさん2009/09/08(火) 21:00:37
cacheだろ常考
0688デフォルトの名無しさん2009/09/08(火) 21:01:31
たぶんそういうことじゃないんだろうな。
0689デフォルトの名無しさん2009/09/08(火) 21:05:51
>>681
あらかじめクライアント側に自動的にあらゆるデータを改ざんするプログラムを仕込んでおけばおk
0690デフォルトの名無しさん2009/09/08(火) 23:00:56
通信出来ませんって表示すればOK
プログラムが固まってしまうとかはNG
0691デフォルトの名無しさん2009/09/09(水) 00:47:06
TCPで受信するときって、毎回受信サイズ違いますよね
それらを一つのデータとしてバッファに入れる方法ってあるのでしょうか?
recvで一度に受信できるサイズを1パケット以下にすればいいのでしょうか?
0692デフォルトの名無しさん2009/09/09(水) 00:50:13
recv1とrecv2をそれぞれ別のスレッドで待ち受けているとき、

recv1→recv2 もしくは、recv2→recv1 の順番に処理されますよね

それを、recv1→ と同時に処理させることは可能なのでしょうか?
recv2→

前者だと見かけ上は、同時にやろうとしてるけど、順番で処理していくのですが
後者だと処理速度は半分程に落ちるけど同タイミングにきても同じスピードで処理していくみたいに

これって、プログラムだけで組めますか?
0693デフォルトの名無しさん2009/09/09(水) 01:44:02
>>691
> TCPで受信するときって、毎回受信サイズ違いますよね
> それらを一つのデータとしてバッファに入れる方法ってあるのでしょうか?
recvで受けたデータを順番にバッファに詰めていけばいいだけだろ。
ネットワークプログラミング以前のスキル不足じゃね?
0694デフォルトの名無しさん2009/09/09(水) 01:49:13
>>692
たぶん何をやりたいのか自分でもわかってないのが問題だとおもうけど。

TCPなら、それぞれのソケットから交互に1byteずつreadしていけばいいんじゃね?
0695デフォルトの名無しさん2009/09/09(水) 01:54:46
できる限り、見かけ上の並列じゃなくて完全に近い並列をしたいとおもったのですが
CPUが2個あるようなイメージの処理で
そういうのってやはり無理なのかなぁ。

そうでないと、送信と受信を同タイミングでする際、どちらかが終わってからじゃないと
処理できませんよね。送信→受信もしくは、受信→送信の流れに
0696デフォルトの名無しさん2009/09/09(水) 03:51:51
まず、ネットワークプログラミング以前にその完全に近い並列を実現させろ。
あとはソケットからの読み込みとかを組み込めば楽勝。
0697デフォルトの名無しさん2009/09/09(水) 10:10:04
cではwinsockを使っていたのですが、
最近javaでネットワークプログラミングを始めようと思っています。(TCP)
cのときは、ここの話題にも時々出てくるように長さプレフィックスつけたり、区切り文字使ったりとても苦労しましたが、
javaだと、Serializable、ObjectInputStreamといったものでオブジェクト渡せば悲しいぐらい簡単で、うまくいっているように見えます。
これは正解ですか?
0698デフォルトの名無しさん2009/09/09(水) 10:18:57
>>697
パフォーマンスとか効率とかを求めないなら、便利で楽で良いと思うよ
0699デフォルトの名無しさん2009/09/09(水) 10:40:09
>>691
fdopenしてstdioにバッファリングさせる。
0700デフォルトの名無しさん2009/09/09(水) 10:57:11
>>695
CPUが2つあってもネットワークインタフェースがひとつじゃあねぇ。
0701デフォルトの名無しさん2009/09/09(水) 10:58:49
ストリーム系のクラスで取得するにも区切り識別は必要だろ?
0702デフォルトの名無しさん2009/09/09(水) 11:06:08
必要だけど、それが何か?
>>691には関しての質問はないので、解決済みなんだろ。
0703デフォルトの名無しさん2009/09/09(水) 11:12:08
>>697
> 悲しいぐらい簡単

ワロタ

しかし C でも TLV とかにしてればさして苦労はしなかっ
たはずだぞ。マクロでなんとかなってた気がする。
0704デフォルトの名無しさん2009/09/09(水) 11:37:44
>>697
あと、Java以外のシステムと通信しないなら。
0705デフォルトの名無しさん2009/09/09(水) 11:46:30
>>702
話がかみ合ってないぞ
0706デフォルトの名無しさん2009/09/09(水) 22:00:17
クライアントからIE以外でアクセスされたらクライアントのIE強制起動してやりたいんだけど
ActiveX無しでできる?
0707デフォルトの名無しさん2009/09/09(水) 22:27:18
無理
例えばtelnetとかでアクセスすることも可能なわけで
telnetはサーバから何を受け取ってもIEを起動したりしないし
0708デフォルトの名無しさん2009/09/09(水) 22:33:24
       |
   \  __  /
   _ (m) _ピコーン
      |ミ|
    /  `´  \
     ('A`)     IEを強制起動するtelnetを
     ノヽノヽ    あらかじめ配布しておけば!
       くく
0709デフォルトの名無しさん2009/09/09(水) 22:34:09
     ('A`)  
     ノヽノヽ=3 ブー
       くく
0710デフォルトの名無しさん2009/09/09(水) 22:44:50
>>698 >>704
ありがと、サーバーもjavaで書くんで大丈夫そうです
パフォーマンスは気にならないわけではないが・・・まぁいっかw

>>703
TLVとか詳しくわからない・・・
まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてたが、
マクロとか使えるものが合ったのか・・・・
0711デフォルトの名無しさん2009/09/09(水) 23:02:10
マルチキャストアドレスで送ることはできるのですが何故か受信されません
ブロードキャストで送ると受信はされるのですが…
送信に関しては設定はいらないけど受信する場合は何か設定がいるのでしょうか?
0712デフォルトの名無しさん2009/09/10(木) 10:08:35
受信したいマルチキャストアドレスに参加しなければならないんじゃなかったっけ
0713デフォルトの名無しさん2009/09/10(木) 11:15:43
>>706
一種のウィルスだな、それは。
0714デフォルトの名無しさん2009/09/10(木) 22:16:06
>>706
できるわけねーだろクソガキ消えろ
0715デフォルトの名無しさん2009/09/10(木) 23:06:52
何をファビョってるんだ?
0716デフォルトの名無しさん2009/09/10(木) 23:50:12
>>710
> まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてた

TLV は type, length, value だからそんなもん。
メリットとしては新旧バージョンが混在しても
TL の部分で読み飛ばし判定が出来るってことかな。

だから構造体みたいなのは構造体ごと読み飛ばせるように
中の要素サイズも含めたサイズを指定することになる。
0717デフォルトの名無しさん2009/09/10(木) 23:57:31
>>712
マルチキャストアドレスグループの参加の方法ってどうやるのでしょうか?
送信側は参加に関係ないのかな
0718デフォルトの名無しさん2009/09/11(金) 00:01:39
>>717
とっておきの解説サイトを教えてやろう。
http://www.google.com/
0719デフォルトの名無しさん2009/09/11(金) 00:14:24
>>716
素人の知識で自慢するなかれ。笑われるよ。
0720デフォルトの名無しさん2009/09/11(金) 01:08:46
>>719
国際通信規格でも使われてますが何か?(プ
0721デフォルトの名無しさん2009/09/11(金) 01:15:14
>>720
その国際通信規格を>>679,710に勧める(自慢する)のが適切か?と言ってるだけ。
他の選択肢と比較した場合の利点と欠点を理解してるのか?
0722デフォルトの名無しさん2009/09/11(金) 01:34:12
選択肢はあんまりないんじゃね?
・固定長
・区切りをつける(STX,ETXとか改行とかみたいな)
・ヘッダ+ボディ構成(ヘッダ部に種別と長さみたいな)
くらいなもんじゃね?

TLV形式って名前は知らなくてもみんな無意識に
似たような実装してるだろ
0723デフォルトの名無しさん2009/09/11(金) 02:03:59
選択肢をあげるなら、こうだろ。
・オブジェクトマーシャリング -- >>679,710が選んだ方式で、言語が限定される
・テキスト -- Internetプロトコルで多用される(SMTP/HTTPなど)
・プログラミング言語様式の定義言語 -- 現在の主流(Protocol Buffer/IDL/XDRなど)
・形式的仕様記述言語 -- TLV方式(国際通信規格の名称はASN.1/BER)
後にいくほど、メッセージ形式仕様定義の厳密さは増すが、実装は困難になる。

だから安易にTLV方式を採用することで「みんな無意識に似たような実装して」
似たようバグを作り込んでいる。もしもTLV方式に固執しつつ、他の方式と同等な
品質も確保するのなら、ASN.1インスタンスをBERへ変換するC言語モジュールを
自動生成できるASN.1コンパイラを導入するしかないが、覚悟と準備が前提になる。

これらの事柄を理解した上で、その国際通信規格とやらを提案(自慢)するのか?と
言っているのだが。自分は、>>679,710が彼自身の置かれている現状の中で、
最良な方式を(無意識にせよ)選択したと考えたから、特にレスもせずスルーしたよ。
0724デフォルトの名無しさん2009/09/11(金) 02:35:38
>>723
似たようなバグってたとえばどんなの?
0725デフォルトの名無しさん2009/09/11(金) 03:01:22
>>724
TLV方式というのは、XMLと同じで柔軟で階層的なデータ構造を実現できる(これは利点)。
ただし、それだけでは、スキーマを決めずに(定義せずに)XMLでデータ交換するようなものだから、
通信相手相互の解釈の違いがバグに直結する。

解釈の相違について、具体的な例をあげる。
・このTypeは必須か/オプションか
・これらのTypeの並び順は規定されるか/自由か
・このTypeの重複は許すか/禁止するか(列の表現)
・このTypeの列の要素は多相を許すか/禁止するか
これらのデータ構造(構文)を形式的に定義するのが、ASN.1という言語。
XMLでいうDTD/RELAX-NG/XML Schemaといったスキーマ定義言語に相当する。

おそらく、これらが問題になるほどの複雑なメッセージ形式は必要ねえだろ?と
思うかもしれない。だとすれば(それほど単純なメッセージ形式であるならば)、
それは他の3つの方式を選択すべきで、あえて柔軟なTLV方式を選ぶこと自体が誤りである、
という結論になる。
0726デフォルトの名無しさん2009/09/11(金) 03:13:10
そこらの人間だって DB スキーマ設計くらいやるだろ。
それを通信路上でやるだけ。
0727デフォルトの名無しさん2009/09/11(金) 03:33:15
>>726
DBスキーマは固定的(柔軟ではない)だよ。
通信であれば>>723の3番目にあげたProtocolBuffer/IDL/XDLに近い。
これなら、ある程度のプログラマなら対応できると思う。

ただ、ASN.1は(>>723で書いたように)、XMLスキーマに近い位置づけの言語。
そこらの人間だってDBスキーマくらいはやれるかもしれないけど、
XMLスキーマを自由に操れる人は、RDB屋さんほどありふれていないでそ。
XMLデータベースの普及を遅らせている、最大の要因だと思っているよ。
0728デフォルトの名無しさん2009/09/11(金) 23:54:35
TLVとASN.1の関係が解らないんだけど。
単にTLVってType,Length,Valueの略ってわけじゃないの?w
0729デフォルトの名無しさん2009/09/12(土) 00:08:50
Type,Length,Valueを全部埋め込んだデータ構造の意味で使ってるみたいだね。
0730デフォルトの名無しさん2009/09/12(土) 00:43:05
TLVはType,Length,Valueの略。
一般的には、ネットワーク上を流れるバイナリ形式のデータ構造表現法の一つ。

で、そのエンコード/デコード処理は手作業で作成することもできるし、過去はそうだった。
ただ、(>>725であげたような)問題があるから、最初は(日本語のような)自然言語で
メッセージの仕様(エンコードの規則)を記述していた。そして自然言語では、
仕様の曖昧さが残るから、形式的な仕様記述法が考案され、最終的にOSIプレゼンテーション層仕様の
一つとして、ASN.1(Abstract Syntax Notation:抽象構文記法)という名前で国際規格化された。

で、ASN.1の仕様策定と同時に、ASN.1で定義されたメッセージ仕様をエンコードするための規則も
策定された。これがBER(Basic Encoding Rule:基本エンコーディング規則)。
BERの中身は、階層的なType,Length,Value構造になっている。

自分としては、>>720で国際通信規格という言葉が提示されたから、
ああ、それは一般的なTLV構造ではなく、ASN.1/BERの事を指しているんだなと解釈し、
それ以降は>>720の意向に沿った形でレスしているつもりだよ。
07317202009/09/12(土) 02:14:31
>>730
いや、全然沿ってない(w

どうも俺には ASN1 や XML ってパラノイア的に自由度
が高すぎるというか、レキシカルな部分とセマンティッ
クな部分がごっちゃになってるとういか、やれやれだぜ
とい印象を受ける。

TLV 的なもの、というのはレキシカルな意味で出したん
だよ。元々「シリアライズ」なんて言葉も出てたしオブ
ジェクトとの紐づけもそんなに難しくない。X というコ
ンポーネントがオプショナルに更に小さな a を持つ、
とかなら X の試験における a の有り無し評価くらいの
試験で済むじゃん。X が充分小さければ組合わせ数も
小さいし、X を含む試験では a の評価はオミット出来る。

ところが XML とかになるともう大変。あらゆる文脈で
X の a を評価しないといけなくなりそうなんだが皆どう
してんの? それとも皆そんなに巷のエンコーダ/デコー
ダ信用してんの?

俺が時流に乗ってないという意見は認める(w
0732デフォルトの名無しさん2009/09/12(土) 02:58:30
>>731
ではナゼ>>716でTLVを提案し、>>720で国際通信規格という言葉を持ち出したの?
そんな「パラノイア的に自由度が高すぎるというか....」な物を初心者に自慢したのはナゼ?
それを何度も問いているんだけど、まるで返答がない。まあ、どうでもいいんだけどね...。

>TLV 的なもの、というのはレキシカルな意味で出したんだよ。

TLVのレキシカル(lexical:字句)には、必ずシンタックス(syntax:構文)が伴う。
言語処理系を知っているなら、それは常識だよね。
そのTLV(BER)のシンタックスに対応するのがASN.1。
TLVという「パラノイア的に自由度が高すぎるというか....」な物を提案する以上、
そのシンタックスも一緒に考えないと、システム設計が崩壊するよ。

>皆どうしてんの? それとも皆そんなに巷のエンコーダ/デコーダ信用してんの?

今のネットあるいはビジネス分野では、SOAPやXML-RPCといったXMLベースの技術が主流だよ。
特にアプリケーションに近い開発者には、XMLとXMLスキーマは避けて通れない技術になりつつある。

ネットワークに近い開発者(たとえば、このスレ住人の大半であろうソケットプログラマ)であれば、
>>723の3番目にあげたProtocolBuffer/IDL/XDRが主流であると思う。ただし、実際の実装は、
手作業でデコーダ/エンコーダを作成することが大半。メッセージ形式が単純なうちは、それで十分。

もし、それが負担になるようなら、専用のコンパイラ(ソースコードジェネレータ)の導入を検討すべき。
ProtocolBuffer/IDL/XDRのどれもがプログラミング言語に近い様式でメッセージ形式を記述できるから、
多くのプログラマが活用できると思う。ただ、新しい技術の導入には、必ず壁がつきまとうから、
生産性や品質保証といった項目を十分に比較/検討してから、導入の是非を判断してください。
07337202009/09/12(土) 03:05:07
>>732
> ではナゼ>>716でTLVを提案し、>>720で国際通信規格という言葉を持ち出したの?

TLV は国際通信規格でも使われてるし、もっとお手軽に
使える考え方でもあるでしょ。実際 >>710 だって独自に

> まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてた

って言ってるんだし。

そこに「そんなの教えてどうすんの」的なのを言いだす
方が「説教したいだけなんですね?」って思うけど。
0734デフォルトの名無しさん2009/09/12(土) 04:11:50
>>733
>TLV は国際通信規格でも使われてるし、もっとお手軽に
>使える考え方でもあるでしょ。

その「国際通信規格」という甘い言葉にのせられ、一見すると「もっともお手軽に使える考え方」に
思える「TLV方式の実体」というのが、ASN.1という「パラノイア的に自由度が高すぎる(>>731)」
枠組みで固めなければ容易に扱えない「怪物」であるという事を、気がついてくれないのかな....orz

>実際 >>710 だって独自に
>> まぁ何送るか教えて、(サイズ教えて)、データ送るようにはしてた
>って言ってるんだし。

>>710が言ったのは、単純に<長さ, 固定長ヘッダ(複数フィールド), 可変長ボディ(単一)>という
メッセージ形式ではないのかな。これはTLV方式じゃないよね。Typeフィールドが無いから。

このくらい単純なメッセージ形式であれば、(怪物である)TLV(あるいはXML)を採用しなくても、
ProtocolBuffer/IDL/XDRが使えるよ。どれも構造体/共用体/可変長文字列/可変長配列が定義できるし、
>>716にあった新旧バージョンの混在は、共用体で容易に実現できる。

返答してくれたから、>>720の意図は理解できた。説教臭いと感じているようだし、
後ろ向きな問いかけであるのは事実だから、これ以降は提案うんぬんの話は持ちかけない。
これで終わりにするよ。
0735デフォルトの名無しさん2009/09/12(土) 09:01:20
受信バッファに溜まってるデータサイズの取得ってどうやるの?Winsockで
0736デフォルトの名無しさん2009/09/12(土) 11:48:28
>>735
実際に受信してみればわかる
ioctlsocketとかでもわかるけど、それをやる前にザ・間違いリストの12番を読むべき
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/lame-list.html#item12
0737デフォルトの名無しさん2009/09/12(土) 12:35:45
しかも取得した直後に増えてるかも知れないし。
0738デフォルトの名無しさん2009/09/12(土) 13:25:09
>>736, 737
元の質問は, 全部到着したかどうかを判定したいって書いてないんだが…

おれは, バッファをどれだけ増やせばいいかを調べるときには ioctlsocket
を使うけどな
0739デフォルトの名無しさん2009/09/12(土) 15:41:51
マルチキャストアドレスグループの参加の方法ってどうやるのでしょうか?
送信側は参加に関係ないのかな
0740デフォルトの名無しさん2009/09/12(土) 17:18:10
>>739
とっておきの解説サイトを教えてやろう。
http://www.google.com/
0741デフォルトの名無しさん2009/09/12(土) 17:27:06
つまんね
0742デフォルトの名無しさん2009/09/12(土) 20:39:13
>>740
くだらない。ひねりがない。
0743デフォルトの名無しさん2009/09/12(土) 21:00:31
ひねる必要無いでしょ。>>717-718
0744デフォルトの名無しさん2009/09/12(土) 21:21:05
そこで一捻り欲しかったって話だろ
0745デフォルトの名無しさん2009/09/12(土) 21:23:01
ひねったら、馬鹿には理解できないかもしれないじゃないか。
0746デフォルトの名無しさん2009/09/12(土) 21:27:11
>>717-718
>>739-740
次回用テンプレおいときますね


マルチキャストアドレスグループの参加の方法ってどうやるのでしょうか?
送信側は参加に関係ないのかな

とっておきの解説サイトを教えてやろう。
http://www.google.com/
0747デフォルトの名無しさん2009/09/12(土) 21:36:49
自演乙
0748デフォルトの名無しさん2009/09/12(土) 21:39:35
なんかおもしろいのかこれ?
0749デフォルトの名無しさん2009/09/12(土) 22:09:23
>>739
setsockopt で IP_ADD_MEMBERSHIP を設定するんじゃねぇの?
0750デフォルトの名無しさん2009/09/12(土) 22:16:26
あるアプリ(サーバー・独自プロトコル)のソースコードを見ていたのですが、
・非ブロッキング
・acceptはSleepとセットのループ
・送受信はwrite(const void *p, int len)のようなラップ関数内で、recv/sendとselect(待つのは一つのソケットのみ)によるループ
により実装されていました。
※何れも一つのソケット(コネクション?)に対し一つのスレッドを生成し処理していました。
この場合、ブロッキングと比べてどのようなメリットがありますでしょうか?
私の無い頭だと、ブロッキングとあまり変わらないように思ってしまいまして・・・
0751デフォルトの名無しさん2009/09/12(土) 22:59:49
>>740
なにか質問があったら「ググレ」って得意げに言うのやめてもらえます?
こっちは別にあんたらみたいに教える気などなく説教したがりなだけの人に無理に聞こうと思ってませんよ。
私は、グーグルさんじゃなくて、ここで聞いているんです。
自分で調べる気がないのはなく、ここでもし知ってる人がいたら教えてもらおうという選択肢を選んだだけのこと。
教える気ないなら黙ってもらってて結構。
この掲示板の管理人さんに「質問はしないでください」といわれるのなら質問は自粛しますが
質問の制約のない掲示板で、管理人でもない分際の人に「自分で調べなさい」などと言われる筋合いはありません。
0752デフォルトの名無しさん2009/09/12(土) 23:02:37
>>751 他の質問者の邪魔
0753デフォルトの名無しさん2009/09/12(土) 23:04:00
>>738
バッファを動的に増減するメリットは何?
0754デフォルトの名無しさん2009/09/12(土) 23:11:54
>>739はググれといわれてもしかたないね。
「UDPで複数の端末にパケット投げたりできますか?」
という質問なら親切に答えたかもしれないけど。
0755デフォルトの名無しさん2009/09/12(土) 23:21:46
別に良いよ答えないで
0756デフォルトの名無しさん2009/09/12(土) 23:28:25
回答者に不快な思いをさせると質問者は損する (回答を貰えなくなるかもしれない)
質問者に不快な思いをさせても回答者は損しない
従って回答者は何書いてもどうってことないが、質問者は書く内容をよく考えるべき
0757デフォルトの名無しさん2009/09/12(土) 23:34:00
不快な思いをすると損してんじゃないの?
0758デフォルトの名無しさん2009/09/12(土) 23:39:04
質問者のふりして回答者をイラつかせるような書き込みをする荒らしが
最近いるようなのでもちつけ。
0759デフォルトの名無しさん2009/09/12(土) 23:40:16
ブロッキングと非ブロッキングの違いってなんですか
0760デフォルトの名無しさん2009/09/12(土) 23:40:53
ブロッケンとブロッケンJrの違いくらいはさすがにググれ
0761デフォルトの名無しさん2009/09/12(土) 23:41:06
不快な思いを「させると」
0762デフォルトの名無しさん2009/09/12(土) 23:41:53
?
0763デフォルトの名無しさん2009/09/12(土) 23:42:03
>>759
ブロックするか、ブロックしないか
0764デフォルトの名無しさん2009/09/12(土) 23:49:44
>>750
=== マルチスレッド&ブロッキング方式 ====
<利点>
・プログラムのロジックが単純になる。一般的なCプログラムが標準入力からのreadと
 標準出力へのwriteをループさせて処理しているように、ソケットとのreceive/sendを
 ループさせることで処理を実現できる。
・上記の理由により、TCPはレコード境界が無いプロトコルであるにもかかわらず、
 receiveで待ち続ければいいから、受信メッセージの組立て処理のロジックは単純になる。
・マルチコア/マルチプロセッサ構成ではスレッド単位にコアまたはCPUが割り当てられるから、
 コア数/プロセッサ数に応じてシステムの性能がスケーラブルに向上しやすい。
<欠点>
・スレッド間で資源の競合がある場合(たとえば同じ変数/ファイルを複数のスレッドが共有する場合)、
 スレッド間で排他制御が必要になる。一般に、排他制御のデバッグは再現性が無いために難しい。

=== シングルスレッド&非ブロッキング方式 ====
<利点>
・そもそもスレッド間の資源競合が存在しないため、デバッグが容易になる。
<欠点>
・プログラムのロジックが複雑になる。TCPコネクション単位にオブジェクトを管理する(Cであれば、
 たとえば構造体で送受信バッファ等を表現し、それらをリンクリストで繋いで管理する)必要がある。
・TCPはレコード境界の無いプロトコルであるため、ソケットに届いた受信メッセージの断片を
 少しずつ組立て、さらにその処理を各TCPコネクション上で並行に実行させる必要があるため、
 プログラムのロジックが複雑になる。
・マルチコア/マルチプロセッサ構成ではコアまたはCPUへの割り当てはコンパイラの最適化に
 依存するから、コア数/プロセッサ数を増やしていっても、期待したほどシステムの性能は向上しない。

他にもあれば(訂正を含めて)追加ヨロ >>all
0765デフォルトの名無しさん2009/09/13(日) 00:02:20
通信初心者ですがよろしくお願いします。
プロセス間通信をしたいんですけど、
サーバーは同一のパソコン上で一つのみしか
起動できないんでしょうか?
複数サーバーがあるとクライアントがどのサーバーにつなげば良いのかわからないのでは?
と思うのですが。
それとも、サーバーのアドレスはそれぞれ異なるように設定できて
そういう問題は起こらないんでしょうか?
よろしくお願いします。

■ このスレッドは過去ログ倉庫に格納されています