トップページ⇒tech
956コメント340KB

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。 NGNG
主にソケットに関してのFAQ
0906デフォルトの名無しさんNGNG
パフォーマンスの要求されるsocketアプリケーションをPCで開発・運用する場合、最も高速なOSは何でしょうか?
とりあえずWin+cygwin/Winsockを考えているのですが。
0907デフォルトの名無しさんNGNG
>>906
OSが高速でも、ネットワーク回線自体の伝送速度で制限を受けるので、意味ないです。
10Mbps の回線では、どんなOSを使っても 10Mbps しか出ないのです。

・・・それとも、ネットワークとは関係なく、単にCPUパワーを得たいだけ?
0908デフォルトの名無しさんNGNG
>>906

Windows2000Server+Winsock2+完了I/Oポートを使って組むやり方が
Windowsだと最もパフォーマンスが高い。
マルチプロセッサ対応もさせやすいのでCPU毎に得意な処理を分散可能だ。

ただしライセンス料もべらぼうに高い(w
0909908NGNG
スマン、ただしサーバ用途に限ってのこと。
クライアントサイドなら組み方を問題にするべきでOSはなんでもいいと思うが
0910デフォルトの名無しさんNGNG
>Windows2000Server+Winsock2+完了I/Oポートを使って組むやり方が
>Windowsだと最もパフォーマンスが高い。
これをUNIXでやる場合、各ポートをselectでチェックする処理を
ループでぐるぐる回すの?なんか遅そうだな...
0911デフォルトの名無しさんNGNG
>>911
なんかミスリーディングな言い方してるけど、
selectすると一度に全部のポートがチェックできるよ。
0912デフォルトの名無しさんNGNG
でもselectって、ソケット数に限界なかった?
あれがイヤ。
0913デフォルトの名無しさんNGNG
じゃあ最もパフォーマンスの高いPC用サーバOSってなによ?
0914無党派さんNGNG
>>912
固定の奴でも128〜4096はあるし、変更できるUNIXもあるが…
0915デフォルトの名無しさんNGNG
>>913
MacOS X
0916デフォルトの名無しさんNGNG
>>915
それだけは絶対にない
0917908NGNG
>>913
自分がMSマンセーなのでWindows2000/XP
むしろUnix系は良く知らんので判断できん。

>>911
私未だにselectの使い方がよく判らんのですが。
複数のソケットをチェックできても、どのソケットが反応したのか
調べる効率的な方法があるんでしょか

ちなみに完了I/OポートではなくてI/O完了ポートAPIだった。
0918デフォルトの名無しさんNGNG
>>910
パラメータはtimeslot以外ほとんどNULLにすればいいんじゃない。
ブロッキングをいちいち気にしてられないよ。
selectってようはエラーがないか調べるだけでしょ。
0919デフォルトの名無しさんNGNG
selectって何するものなの?
0920デフォルトの名無しさんNGNG
>>919
複数のソケットに対する、普通は受信を待つために、使うもの。
0921デフォルトの名無しさんNGNG
>>920
ソケットに限らない
0922デフォルトの名無しさんNGNG
完了IOポートAPI使うんならselectは関係ないんじゃない?
つうかselectを使わないための完了IOポートでしょ?
0923デフォルトの名無しさんNGNG
マルチスレッドがまだなかったころに非同期処理を実装するための
苦肉の策
0924デフォルトの名無しさんNGNG
>>913
Solarisちがうかな?

>>923
マルチスレッド使うときと使えないときで、非同期処理はどう違うのさ?
0925デフォルトの名無しさんNGNG
マルチスレッドあり → 受信専用スレッドを作って select で待ち
マルチスレッドなし → メッセージループでメッセージ待ち
0926デフォルトの名無しさんNGNG
>925
つか、そのマルチスレッド有りは「非同期」やなく「同期」やとおもうんだが。
0927デフォルトの名無しさんNGNG
>>926
dispatcherに専用threadがいるだけで、
その先はportにbindされた非同期methodをpoolされていたthreadに実行させる、
って実装を想定しているんじゃないかな?
実際、I/O完了ポートAPIだって、kernel/dll内threadがdispatchしているわけでしょう?

>>920
file, socket, diviceなどの複数のstreamが、
readableか、writableか、例外が起きてないか調べます。
真であるstreamがあれば復帰して、bit maskが1になります。
acceptで受けるような接続要求も検知できます。(inetdで使っている)

>>923
そんなことはない。
素朴にどんどんthreadを生成すると、SunOS 5の様に強力なthreadをsupportするOSでも
bottle neckになるから、複数のstream待ちを、何本かのselect/dispatcherにまとめて、
別のthreadに管理させる、ってのは、highly multi-threadedなprogrammingの常套手段。
まあ、普通のprogrammerは、滅多にそういうsystem設計する機会ないと思うけど、
知らないし、bottle neckを調べられから、hardwareを増強させて逃げるdesignerも多い。
0928デフォルトの名無しさんNGNG
>>927
横文字使いすぎでみっともない
0929908NGNG
非同期要求が完了したコールバックをAPI呼出したプライマリスレッドではなく、
プールしておいたいくつかのワーカスレッドに対して行うって事で良いのかな?
これによって平行動作するスレッドの数を制限する事には賛成。

無制限にスレッド作りつづけるとWindowsならいづれブルースクリーンだ。
つまりこの実装を強力にサポートするI/O完了ポートがあるWindows最高(w
0930デフォルトの名無しさんNGNG
Winsock2でrecvfromでUDPデータを受けるプログラムを動かしているのですが、
およそ18Kバイト分のパケットを受信したあたりからデータが所々おかしくなって
しまいます。虫食い状態です。recvfromで受けた直後でデータを見てみたのですが
その時点で既におかしいってことは、あとはどこらへんを調べていったらいいんで
しょうか?はまってます。(泣)
(ちなみにLinuxで問題なく動いていたものをWinsock2(Windows)に移植
 したものです。)
0931デフォルトの名無しさんNGNG
>>930
ちなみにrecvfromの受信バッファの大きさは十分大きくしたり毎回0リセットしてみたり
色々やってみましたが症状変わりませんでした。
0932デフォルトの名無しさんNGNG
>>930
送信側はだいじょぶ?
0933デフォルトの名無しさんNGNG
>>932
同じサーバに対してLinuxからアクセスした場合は問題ないんです。(とほほ)
VisualC++6.0なんですが、昔recvfromでSin_Zeroに誤ったデータを書いてしまう
バグがあったようなのですが、パッチのSP2は既にあてているので環境は問題無さ気
なんですけどね。ここの皆さんはそういう経験は無いでしょうか?やっぱこんなの
俺だけかな(藁
0934デフォルトの名無しさんNGNG
>930
単にUDPの制限(仕様)とかやなくて?
>927
http://state-threads.sourceforge.net/docs/st.html
つまり、こういうこと?(/.でみつけた。)
0935デフォルトの名無しさんNGNG
>>934
その後色々調べて見たところサーバからは正しいパケットが送信されている事が
モニターツールにより分かりました。つまりクライアント側の問題であると…。
さらに、クライアント側のイーサーのインターフェースをモニタリングするとなんと
UDPでなくIPパケットとしか認識されてませんでした。何故だぁ…(怒)
IPパケットが山のように見えます。(藁
ちなみにTCP,ARPのレイヤーはちゃんと見えてます。また他のUDPを使うソフト
で試しに通信してみるとUDPはちゃんと通りますのでUDPが通らないという事では
ないみたいです。クライアントソフトの問題ということになるのかな…謎
0936デフォルトの名無しさんNGNG
>>935
つーかよ、

> また他のUDPを使うソフトで試しに通信してみるとUDPはちゃんと通りま
> すのでUDPが通らないという事ではないみたいです。

の時によ、

> さらに、クライアント側のイーサーのインターフェースをモニタリングするとなんと
> UDPでなくIPパケットとしか認識されてませんでした。何故だぁ…(怒)

すると、どうなるんだ?
「UDPパケット」と表示されるのか? 「IPパケット」と表示されるのか?

どうせ、「他のUDPを使うソフト」でも「IPパケット」と表示されていて、
単に、UDPパケットだから、Winが破棄しちゃう事があるだけだろ。

そのプログラムにパケットの再送機構は含まれているわけ?
なければ、たまには虫食いになるのが正しい動作。
0937デフォルトの名無しさんNGNG
>>930
パケットが途中で失せたり、順序がごっちゃになったりしても
UDPは関知しない(ので、対策は上位レイヤーでしろや)、
ちゅうUDPの仕様を理解した上で、UDPを利用してる?
つーかさ、なんでUDPなわけ?TCPの方がいいと思うが

>データが所々おかしくなって
CRCでもつけて、おかしいところを再送するように書けや。
0938デフォルトの名無しさんNGNG
>>936
>>937
状況がきちんと説明できてなかったのでちょっとあれなんですが、
ご指摘ごもっともです。たしかにTCPでやっちまえってのもそうなん
ですが、今回の症状の原因が知りたくて。あとUDPの特性はベスト
エフォートってことで分かって使ってます。モニターツールで見てると
受け側のマシンのイーサ?までは正しいパケットが正しい順番で来
ているのです。それをrecvfromでソケットから取り出した後データが
おかしくなってる。なんだかVC++の環境やライブラリの問題?の
ような気がしてきました。いずれにせよくだらん質問にレス頂いて感
謝しています。
0939938NGNG
>>938
>なんだかVC++の環境やライブラリの問題
えっとソケットライブラリのバグパッチがちゃんと当たってない
のかもという意味です。その変もちっと調べてみます。それでは。
0940デフォルトの名無しさんNGNG
>>938
べつにイーサまで正しいパケットが来てて、
それがプロトコルスタックで破棄されてもUDPなら問題ではないと思いますが…
>>937もそういうことを言ってるのだと…
0941デフォルトの奈々氏さんNGNG
ご存知の方、教えてください。

WinNT4.0でnetstatを実行してるんですが、TIME_WAIT状態になったソケットって
1000コまでしか表示されないようなんですが、何かの仕様でしょうか?
#ちなみにESTABLISHED状態とかのソケットは1000以上でも表示される。

SnmpExtensionXXX()系のAPIを叩いてソケットの状態を表示するnetstatもどきを
作ってみたんですが、同じ結果になってしまいました。
0942デフォルトの名無しさんNGNG
レス数が900を超えています。1000を超えると表示できなくなるよ。
0943デフォルトの名無しさんNGNG
WndProc 内であるメッセージが来たら send するようなプログラムを作っています
ここで、send の呼ばれる間隔が短すぎると、
送信するデータが 1 つのパケットにまとめられてしまうのですが、
これを避ける方法はないでしょうか?

具体的には、
「4 バイトデータのパケット送信
-> 4 バイトデータのパケット送信
-> 4 バイトデータのパケット送信」
となって欲しいところが
「12 バイトデータのパケット送信」
となってしまいます

ブロッキングするようにすると、send の返り値にはちゃんと 4 が入るのですが、
パケットフィルタして確認すると、12 バイトなどにまとめられて送信されています

Java では flush という関数がありましたが、
WinSock には内部バッファを明示的に送信するような手段はないのでしょうか
どなたかご存知でしたら、ご教授よろしくお願いします
0944デフォルトの名無しさんNGNG
>>943
setsockopt(TCP_NODELAY)
0945デフォルトの名無しさんNGNG
でもストリームだと受け取る側から見たら変わらんのじゃないの?
4バイトだろうが12バイトにまとめられようが
0946943NGNG
>>944
おおおお!できました!ありがとうございます!
今日一日中悩んでたのに・・・、思いきって質問して良かったです
お礼にお団子どうぞ!
-○○○-

>>945
たしかにその通りなんですが・・・
タイミングが重要だったので、バッファに溜められると困るのです
0947デフォルトの名無しさんNGNG
次スレ立てておきました。

ネットワークプログラミング相談室 Port2
http://pc.2ch.net/test/read.cgi/tech/1006258198/
0948デフォルトの名無しさんNGNG
UDPプログラミングサンプル等が参照できるサイトを
教えていただきたいのですが。
0949Disca ◆NAfP6znE NGNG
>>948
http://www.ccad.sccs.chukyo-u.ac.jp/manualc/prgrm/dialogbase/media/network/
WSAStartupも知らなかったのに、見つけたYO。

すべてのログ見るのに疲れた(はぁ〜
0950foovarNGNG
すみませんが、どなたか教えてください。

select()を使わずに、ファイルディスクリプタの指すストリームが
ファイルなのかソケットなのかを判断する方法って無いですか。

ストリームからデータを読み出して加工するルーチンがあって、
内部でファイルディスクリプタがファイルを指す場合とソケットの
場合で分けたいのです。
で、最初からselect()を意識した作りではないので、select()を用
いた仕様に作りかえるのがわずらわしいのです。
0951デフォルトの名無しさんNGNG
getsockopt()
0952foovarNGNG
>>951
うひょー、有難うございます。
0953初心者NGNG
一つのパケットを送るとACKが返ってくると思いますが、
そのACKが返ってきたときの時刻が知りたい場合、どの
関数の戻り値を知ればいいでしょうか?
それとも他にいい方法があるでしょうか?
0954デフォルトの名無しさんNGNG
recvした直後に、time()で取るとか。
‥‥そういうことではなくて?
0955デフォルトの名無しさんNGNG
WinInetでmms://~のファイルを読むことはできますか?
っていうか、mmsとか関係ないですか?
0956デフォルトの名無しさんNGNG
新しいスレに移りましょう

ネットワークプログラミング相談室 Port2
http://pc.2ch.net/test/read.cgi/tech/1006258198/
レス数が950を超えています。1000を超えると書き込みができなくなります。