ネットワークプログラミング相談室 Port20at TECH
ネットワークプログラミング相談室 Port20 - 暇つぶし2ch2:ftp-data
07/08/07 01:48:11
過去スレ:
Port18 スレリンク(tech板)
Port17 スレリンク(tech板)
Port16 スレリンク(tech板)
Port15 スレリンク(tech板)
Port14 スレリンク(tech板)
Port13 スレリンク(tech板)
Port12 スレリンク(tech板)
Port11 スレリンク(tech板)
Port10 スレリンク(tech板)
Port9 スレリンク(tech板)
Port8 スレリンク(tech板)
Port7 スレリンク(tech板) ★行方不明
Port6 URLリンク(pc5.2ch.net)
Port5 URLリンク(pc2.2ch.net)
Port4 URLリンク(pc3.2ch.net)
Port3 URLリンク(pc3.2ch.net)
Port2 URLリンク(pc.2ch.net)
Port1 URLリンク(pc.2ch.net)


3:ftp-data
07/08/07 01:50:30
図書コーナー:
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
 URLリンク(www.amazon.co.jp)
 そのソースコード
 URLリンク(www.unpbook.com)
詳解TCP/IP〈Vol.1〉プロトコル
 URLリンク(www.amazon.co.jp)
詳解TCP/IP〈Vol.2〉実装
 URLリンク(www.amazon.co.jp)
詳解TCP/IP〈Vol.3〉トランザクションTCP, HTTP, NNTP, UNIXドメインプロトコル
 URLリンク(www.amazon.co.jp)
TCP/IPによるネットワーク構築
 〈Vol.1〉原理・プロトコル・アーキテクチャ
  URLリンク(www.amazon.co.jp)
 〈Vol.3〉クライアント‐サーバプログラミングとアプリケーション
  URLリンク(www.amazon.co.jp)
  Linux/POSIXソケットバージョン
  URLリンク(www.amazon.co.jp)
  Windowsソケットバージョン
  URLリンク(www.amazon.co.jp)


4:ftp-data
07/08/07 01:51:49
マスタリングTCP/IP RTP編
 URLリンク(www.amazon.co.jp)
Linuxソケットプログラミング?ネットワークプログラミングにおける実践技法
 URLリンク(www.amazon.co.jp)
Webプロトコル詳解?HTTP/1.1、Webキャッシング、トラフィック特性分析
 URLリンク(www.amazon.co.jp)
WinSock2.0プログラミング
 URLリンク(www.amazon.co.jp)
猫でもわかるネットワークプログラミング
 URLリンク(www.amazon.co.jp)
IPv6ネットワークプログラミング
 URLリンク(www.amazon.co.jp)
Visual Basicではじめるネットワークプログラミング超入門
 URLリンク(www.amazon.co.jp)


5:ftp-data
07/08/07 01:54:23
URL抜粋:
★規格
RFC 日本語版リスト
 URLリンク(www5d.biglobe.ne.jp)
JPNIC RFC関連リンク集
 URLリンク(rfc-jp.nic.ad.jp)
RFC Editor
 URLリンク(www.rfc-editor.org)
HTMLなRFC (セクションを直に示すのに便利)
 URLリンク(www.freesoft.org)
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
 URLリンク(www.studyinghttp.net)
IANA Well known port numbers
 URLリンク(www.iana.org)


6:ftp-data
07/08/07 01:55:29
★プログラミング
C10K ヘヴィーロードサーバ
 URLリンク(www.kegel.com)
C10K ヘヴィーロードサーバ(日本語訳)
URLリンク(www.hyuki.com)
MSDN
 URLリンク(msdn.microsoft.com)
Raw IP Networking FAQ
 URLリンク(www.whitefang.com)
Java で packet capture
 URLリンク(netresearch.ics.uci.edu)
Randomness Recommendations for Security
 URLリンク(www.faqs.org)
BoostSocket
 URLリンク(www.crystalclearsoftware.com)
The Code Project - Internet & Network programming
 URLリンク(www.codeproject.com)
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
 URLリンク(X68000.q-e-d.net)


7:ftp-data
07/08/07 01:55:59
★ツール類
ethereal - URLリンク(www.ethereal.com)
Wireshark - URLリンク(www.wireshark.org)
tcpdump - URLリンク(www.tcpdump.org)
Windump - URLリンク(netgroup-serv.polito.it)
WinPcap - URLリンク(www.winpcap.org)
pathchar - fURLリンク(ftp.ee.lbl.gov)
pchar - URLリンク(www.employees.org)
Packetyzer - URLリンク(www.networkchemistry.com)
libevent - URLリンク(www.monkey.org)

★プロトコル
TTCP
 URLリンク(www.sean.de)
 URLリンク(www.kohala.com)
UDP Hole Punching
 URLリンク(homepage3.nifty.com)

★IP, TCP実装
URLリンク(www.iti.fi)
URLリンク(www.sics.se)
URLリンク(www.codeguru.com)
URLリンク(www.geocities.jp)


8:ftp-data
07/08/07 02:18:34
テンプレの変更点
・関連スレURLを記載(前スレ >>9 THX)
・RFC 2616 日本語訳URL更新(前スレ >>7 THX)
・C10K問題 日本語訳URL追加(前スレ >>483 THX)
・まとめサイトURL削除(makimo.to サービス終了のため)

上記以外は前スレと同じテンプレで立てさせてもらいました。
追加・補足等あったらよろしく。


9:デフォルトの名無しさん
07/08/07 22:18:48


10:デフォルトの名無しさん
07/08/08 16:24:26
ttcpを使って、UDPデータ(14M)をLANインターフェイスから送信してみたんですけど・・・
rtl8139D → 12Mbps
3Com 3c905c → 12Mbps
※いずれも送信側の数値

RTLは性能良くないとは聞いてたんですけど、3Comもこんなもんなの?(´Д`)
ifconfig 情報では、100baseTXって出てるのに・・・

11:デフォルトの名無しさん
07/08/08 23:00:33
もしその Mbps が mega bytes per second のことを言ってるんなら、ほぼ限界値じゃない?
100BaseTX って 100 mega bits per second だし
12 M bytes = 96 M bits

12:デフォルトの名無しさん
07/08/08 23:11:11
100メガショック!ネオジオといっても100bitsなのと一所だな

13:デフォルトの名無しさん
07/08/09 00:03:13
>>11
の言うとおりでした、申し訳ない。
ソース見ると、ttcpが計測した速度の単位は、byte per second でした。

14:デフォルトの名無しさん
07/08/09 23:41:01
> Visual Basicではじめるネットワークプログラミング超入門
> URLリンク(www.amazon.co.jp)
VBでSocketを使ったプログラミングを勉強したいのですが、
この本の代わりになるような本はないでしょうか。
どこも品切れで・・・。

15:14
07/08/11 22:54:17
隣町の本屋で見つけることができました。
どうも失礼しました。

16:デフォルトの名無しさん
07/08/13 22:59:49
MacAddress destMac = {0x00, 0x17, 0x9A, 0xB3, 0x9E, 0x16};
と設定したとき
struct sockaddr_ll destAddrには何を突っ込めばいいのですか?

流れは

1 socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)
2 以下を設定
destAddr.sll_family = htons(PF_PACKET);
destAddr.sll_protocol = htons(ETH_P_ALL);
destAddr.sll_halen = 6;
destAddr.sll_ifindex = 2; (ioctlで取得した値と仮定してください)

3. sendto()
この流れで基本基本的にL2でデータ流せますよね?



17:デフォルトの名無しさん
07/08/15 01:35:19
すみません、質問させてください。
不特定多数のアクセスがあるFTPサーバがあったとして、アクセスしてきたIPアドレス毎に、
例えば過去10分の間に何度サーバとのコネクションを張ったかだとか、同一のIPアドレスが
複数のコネクションを張っているか否かだとか、コネクションを張った時間と、
切断した時間を取得するようなことができるプログラムをCで組むようにいわれたのですが、
具体的にどのような手法でそれが実現できるのか皆目見当がつかず途方に暮れています・・。
大変申し訳ないのですが、何かアドバイスをいただけないでしょうか・・。
どうぞ皆様のお力をお貸しいただけますようお願いいたします。
(Fedora Core4でgccを使っています。)

18:デフォルトの名無しさん
07/08/15 01:43:17
>>17
パケットみれ

以上

19:デフォルトの名無しさん
07/08/15 01:56:19
>>17
まず、FTPサーバ自身の設定を調べ、アクセスログを出力してるか確認する。
出力してなければ、ログを出力するように適切に設定する。
あなたの作成するコマンドは、FTPサーバの出力するログを解析する。
ログはテキストファイル(たぶん)なので、あとはまあ威張る。

ログの情報には限りがあるし、要件を満たさなければ>>17のいうとおり
パケットをみるしかないけど自分で作るのはたいへん。
その場合でもパケット解析を行うオープンソースのアプリでも探してきて、
そいつから情報をもらうフロントエンドだけ書けばいいんじゃないかな?

アクセスログとかでググって調べてみれ。

20:デフォルトの名無しさん
07/08/15 01:58:20
失礼
×>>17のいうとおり
>>18のいうとおり


21:デフォルトの名無しさん
07/08/15 02:28:39
ログの情報が足りないなら、ftpd改造してもいいね

22:17
07/08/16 01:44:26
遅くなってすみません。皆様アドバイスありがとうございます。

>>18
きっとそれが究極なのでしょうけれど、残念ながら実装する為の知識と力量、そして時間が
間違いなく不足しています、ごめんなさいorz

>>19
なるほど。
おっしゃる通り、FTPサーバが常時吐き出すログをなんらかの方法でプログラム内で取得して、
そこから必要な情報をいただいて処理することで実現できるかもしれませんね。
具体的にFTPサーバがどのようなアクセスログを吐き出すのか、まずはそこから調べたいと思います。
どうしてもログの情報が足りなかったら、パケット解析ソフトからいただくか、21氏の提案してくださった
方法を検討してみたいと思います。本当にどうもありがとうございました。

>>21
ftpdの改造ですか。
私なんかの力量ではかなり難しいと思いますが、もしサーバの吐き出すログの情報が足りなければ、
ひとつの方法として考えてみたいと思います。
アドバイスありがとうございました。

23:デフォルトの名無しさん
07/08/16 01:53:04
>>22
簡単だろ、どうせエラーなんか気にしなくいいんだし
TCPとFTPのプロトコルだけ知ってりゃいいだけの
話だよな?

なぜやらんさっさとパケットみて好きなもの作れよ

これ以上何も作らないでここで質問したらお前は
ゴミとしてVIPPER未満のクソとして扱うぞ?

24:デフォルトの名無しさん
07/08/16 03:21:42
>>22 は多分パケット見る手段自体知らないと思うが

25:デフォルトの名無しさん
07/08/16 07:24:34
簡単だよ
URLリンク(homepage2.nifty.com)

26:デフォルトの名無しさん
07/08/17 07:08:57
>>17の質問内容から見て多分学生の宿題だろうから
(もしくは新人研修)
>>23のやり方が正解なんだろうね
問題提出者は>>25の手法で この後にftpのプロトコルの
勉強させるつもりなんだろうね。

>>17が 上司からFTPの設定を指示されてるのに
自分で作ろうとしているアホなら どうしよ・・・・・

27:デフォルトの名無しさん
07/08/17 09:03:57
最終的に、一定時間当たりの最大接続数や、最大接続時間に制限を加えたい
という要求があり、それら設定項目がftpdに備わっていないならば、
簡単なフィルタリング・プログラムを書く必要があるだろう。
そういう前提なら、パケット読み取るプログラムを書く。
しかし、>>17がほしがる情報は、ふつうのftpdならログで吐けるし、
>>17がほしがる情報を元にフィルタリングするような機能は、ふつうのftpdなら備えている。
「ログ解析による実装」か「パケット・フィルタを実装」か、出題者に相談した方がいいんじゃないの。

28:デフォルトの名無しさん
07/08/17 10:26:09
その方式の選択理由も含めての出題かも試練。

29:デフォルトの名無しさん
07/08/17 12:26:30
VC6のMFCを使ってチャットツール作ってるわけですが
通信の部分の実装でMFC使ってるんだから素直にMFCのCSocket使うべきか
普通のsocket使うべきか悩んでます。
皆さんならどうしますか?
なんかCSocketは評判悪げ。

30:デフォルトの名無しさん
07/08/17 12:54:53
URLリンク(anti.bne.jp)

31:デフォルトの名無しさん
07/08/17 13:02:49
>>29
Winsock2を直接叩いて頑張れ。>>4の本がよい。

32:デフォルトの名無しさん
07/08/19 10:49:09
MFC使ってるならわざわざ再開発する必要も無いだろ。
そもそもMFC使ってる時点で(ry

33:デフォルトの名無しさん
07/08/21 07:46:40
板違いかもしれないが、他に聞く場所が解らなかったんでここで聞かせてください。
epoll_ctl(2)のmanに、
EPOLLRDHUP (カーネル 2.6.17 以降)
ストリームソケットの他端が、コネクションの close 、またはコネクションの書き込み側の shutdown を行った。 (このフラグを使うと、エッジトリガの監視を行う場合に、通信のもう一端が閉じられたことを検知するコードを非常に簡潔に書くことができる。)
と書かれてるのですが、
2.6.17以降のカーネルのものを使っていても、この値が定義されてません。
誰かこの値を使ってる人いますか?


34:デフォルトの名無しさん
07/08/21 09:55:57
ディストリは何よ?
ヘッダファイルは別パッケージに分かれているんじゃないか?

35:デフォルトの名無しさん
07/08/21 13:38:16
>>29
CSocketは元々同期処理のソケットを非同期処理にし
それを更に同期処理を模倣している無駄な奴なので
それ使うぐらいなら普通のソケット使う方が良いだろう。
でも、非同期処理にしただけのCAsyncSocketならば使う価値はある。

36:デフォルトの名無しさん
07/08/21 15:32:12
>>34
ubuntu6.10使ってます

37:デフォルトの名無しさん
07/08/22 09:22:01
>>33
それは__USE_GNUの拡張ありでコンパイルされたカーネルじゃないとない。
POLLHUP使ってください。こっちのshutdownも検知する以外は一緒。

38:デフォルトの名無しさん
07/08/22 14:03:16
>>37
ありがとうございます。
>>__USE_GNUの拡張ありカーネルでないとつかえない
って知りませんでした。
POLLHUP使ってみます。

39:デフォルトの名無しさん
07/08/24 04:13:20
AN HTTPの最新版が欲しくて中田昭雄氏のサイト行ってみたけど見れない…
誰か最新版の投下お願いします…

40:デフォルトの名無しさん
07/08/24 04:44:46
vectorにあるぜ

41:デフォルトの名無しさん
07/08/24 04:53:42
vectorにあるのは古いverですね。(1.37b)
最新は中田氏サイトのgoogleキャッシュ見る限りだと1.42pみたいです。

42:デフォルトの名無しさん
07/08/24 08:16:28
>>41
ググるとほぼトップに来るが?
URLリンク(www.forest.impress.co.jp)

43:デフォルトの名無しさん
07/08/24 09:37:55
>>42
杜かw

44:デフォルトの名無しさん
07/08/24 11:50:34
>>42
ありがとう。助かったよ。

45:デフォルトの名無しさん
07/08/26 23:22:07
VB6.0のWinsockコントロールを使っているのですが、うまくいきません。
教えてgooでも質問してみたのでマルチポストになりますが、返事がこないので改めてこちらで質問させてください。

助言をどうかお願いします。もうAPIのWinSockの方を使った方がいいでしょうか?
以下が自分なりに纏めた今の状況です

アンチウィルスソフトは導入していない。また、ファイアウォールを外している。

ルーターの設定で、ポート転送->使うポートの転送先を自PCのプライベートアドレスにしている。プロトコルはTCP/UDP。TCPのみにしても結果は変わらず。
ルーターで設定したポートで​URLリンク(www.cman.jp)で検査するとホスト=***.**.**.*** ポート=***** にアクセスできました。と出る。
ルーターで設定していない他のポートで試したら失敗する。
また、検査したときにサーバー側ソフトではConnectionRequestイベントが発生した。

接続先のRemoteHostを127.0.0.1、プライベートIP、マシン名にすると繋がる。
グローバルIPを入れると、サーバー側プログラムを起動せずに上記の接続を試みたときのエラー番号と同じ、10061。意味は「接続が拒否されました。」

サーバー側でのWinsockプロパティの設定は
Winsock.Protocol = MSWinsockLib.ProtocolConstants.sckTCPProtocol
Winsock.LocalPort = *****
そして、待機状態にさせています。
Winsock.Listen()

クライアント側でのWinsockプロパティの設定は
Winsock.Protocol = MSWinsockLib.ProtocolConstants.sckTCPProtocol
Winsock.RemoteHost = ***.**.**.***
Winsock.RemotePort = *****
そして、接続要求をださせています。
Winsock.Connect()

46:デフォルトの名無しさん
07/08/26 23:28:34
ルータの内側から、ルータの外側用アドレスでアクセスしてみたってこと?

47:デフォルトの名無しさん
07/08/26 23:32:33
っwireshark
あとルータのログも見とけ

48:45
07/08/27 00:50:11
>>46
そうです。もしかしてできないんですか?
>>47
見てみます。

49:デフォルトの名無しさん
07/08/27 07:46:30
中から来たパケットを逆納豆テーブル見て
折り返してくれるかどうかはルータによる。

50:デフォルトの名無しさん
07/08/27 22:59:15
ネバツイテ
折り返そうしても出てこないことあるよなぁ

51:デフォルトの名無しさん
07/08/29 01:24:10
あるある

52:デフォルトの名無しさん
07/08/30 22:04:12
Winsockにてサーバアプリケーションを作成しています。
メインスレッドで、クライアントからの接続待受スレッド(スレッドA)を起動し、
クライアントからの接続ごとに送受信用スレッドを起動しています。

スレッドA:クライアントからの接続待受スレッド
 A-1.ソケットの作成、bindやらlistenやら
 A-2.WSAEventSelectでFD_ACCEPTを待つイベントをセット
 A-3.ループを開始し、この中でWSAWaitForMultipleEventsでイベント待ち
 A-4.FD_ACCEPTが来たらacceptしてスレッドBを起動し、接続待ちに戻る

スレッドB:1クライアントごとの送受信スレッド
 B-1.WSAEventSelectでFD_CLODE、FD_READを待つイベントをセット
 B-2.ループを開始し、この中でWSAWaitForMultipleEventsでイベント待ち
 B-3.FD_READが来たらrecvで受信し、電文の終端文字を受信したらレスポンスをsendで返す
   電文の終端文字が無ければループ先頭に戻り、次のFD_READを待つ
   recvでSOCKET_ERRORが返ったらループ終了
 B-4.FD_CLOSEが来たらソケットをクローズしてループ終了
 B-5.ループを抜けたらスレッドを終了

クライアント:
 C-1.ソケットを作成してコネクト
 C-2.sendしてレスポンスを待つ(recv)
 C-3.レスポンスを受信したら切断して終了



53:52
07/08/30 22:04:46
続きです。
>>52のような処理を組んでいます。
わからない点がいくつかあるのでご教授ください。特にB-3のあたり。

1.B-3にて、100byte受信したいが、recvで70byteまでしか受信できなかった場合、
  残りが受信可能になったらFD_READのイベントが再度発生してくれるのでしょうか?
  簡単な検証をしてみたら、発生しているようですが、
  場合によってはイベントが発生せず受信バッファにだけ溜まるということはあるのでしょうか?
2.B-3にて、recvでWSAEWOULDBLOCKとなった場合、次のFD_READを待つのが正解でしょうか?
3.B-3にて、レスポンスをsendで返すのはrecvの直後で行ってよいのでしょうか?
  それともFD_WRITEが来たら?FD_WRITEをどう使うのかよくわかりません・・・。
4.アプリ終了時にスレッドA,Bを終了させるのに一般的にはどうするのでしょうか?
  どちらもWSAWaitForMultipleEventsで待っているのですが、
  ここで適当なタイムアウトを設定して、アプリ終了フラグを見るとか・・・?

54:デフォルトの名無しさん
07/08/30 23:01:17
1.発生する
2.というか、WSAEWOULDBLOCKが帰ってくるまで
 recvをループで回すほうがいい
3.FD_WRITEは、sendがWSAEWOULDBLOCKを返したときに、
 送信を再開するために使う。つまり,1)recv直後にsend
 2)WSAEWOULDBLOCKがかえってきたら3)FD_WRITEを待って、
 ふたたびsend
4.同時に終了したいときにSetEventされるようはhEventをまつ

55:デフォルトの名無しさん
07/08/30 23:11:47
とにかくしね

56:デフォルトの名無しさん
07/08/30 23:39:25
>>54
recvをループさせるのはrecvが0を返すまででいいんじゃない?

57:52
07/08/31 01:14:50
>>54
ありがとうございます。大変勉強になります。

4の回答が少しわかりづらいのですが・・・^^;
イベントオブジェクトをもう1つ用意して、WSASetEventでシグナルにするとか・・・?

>>56
ありがとうございます。
recvからは0が戻るか、WSAEWOULDBLOCKが発生したらrecvを呼ぶのを中断して
再度WSAWaitForMultipleEventsで待てばよいでしょうか?
現状はそうしていますが、これで良いのか判断つかなかったので・・・。


58:デフォルトの名無しさん
07/08/31 02:37:49
つーかさ、1ソケットで1スレッドを占有するなら
本来、ブロッキングソケットで足りるんだよ。
イベントなんか用意する必要も無く。
もちろん、鯖がsendでブロックしている間にもデータが送られてくるような
作り(プロトコル)なら話は変わってくるがね。

で、それで済むところをわざわざEventを使ってるのに
終了シグナルと両方待たなくてどうするのさ。

59:デフォルトの名無しさん
07/08/31 03:16:58
ごめん。
56だけど、recvが0を返すまでってのはブロッキングソケットの終了待ちロジックだ。

ノンブロッキングソケットの場合、受信データがなければエラーになって
WSAEWOULDBLOCKを示す。なので、0は基本的に返らないが、接続終了時には
0を返す場合がある。
なので、>>57のようにループして両方判定しておけばOK。

ブロッキングソケットの場合は、受信データがなければ受信データがくるまで
ブロックする。だから、ブロックしたくなくて、イベント処理をしているなら、
recvのループはまずくて、recv後は必ずFD_READを待たなければいけない。

60:デフォルトの名無しさん
07/08/31 07:16:15
1ソケットごと送受信する以下の4種類のプログラムを作ってみたのですが
1. 2スレッドで同期ソケット
 送信スレッドはキューにたまるのをcondition/event等待ち、sendする
 受信スレッドはrecvで待ち
2. 2スレッドで非同期ソケット
 送信スレッドはキューにたまるのをcondition/event等待ち、sendする
 受信スレッドはselectで待ち、recvする
3. スレッド無しで同期ソケット
 タイマー、ソケットからのイベントなどで定期的にselectで確認して必要なソケットのrecvを行う
 タイマー、ソケットからのイベントなどでキューにたまっているソケットのsendをselectで確認後行う
4. スレッド無しで非同期ソケット
 タイマー、ソケットからのイベントなどで定期的に全てのソケットでrecvを試す
 タイマー、ソケットからのイベントなどでキューにたまっているソケットのsendを行う
Linux/Windowsそれぞれあまり性能差、負荷の差がありませんでした。
通常はどれがいいのでしょうか?
ソケット数は100ぐらいが限度で、メモリ、CPUは問題ない環境です。

61:デフォルトの名無しさん
07/08/31 11:53:08
メンテしやすい方法

62:デフォルトの名無しさん
07/08/31 13:01:07
キューにたまるのを待って send なんてしなくても、キューにためず直接 send しちゃっていいんじゃないかと思うけど。
あと、select は扱えるソケットが 64 個までとか変な制限がある場合があるので、いちおう確認したほうがいいかもしんない。

63:デフォルトの名無しさん
07/08/31 21:14:35
select自体は、あらかじめFD_SETSIZEを128とかに
定義すれば、その制限からは外れるみたいな。

64:デフォルトの名無しさん
07/08/31 21:52:43
スレッドはソケットごとに2個づつ使うので、selectは1socketしか待たないのですよ
なので、スレッドが大量にできるために、必要の無いスレッドはなるべく休止状態にしておきたいのです。

キューに入れるのは送信するのが10GBとかなのと、ヘッダをつけたりしているので、
send途中であふれた場合にどっかに取っておく必要があるのと、ある程度バッファに入れたら送信自体を停止する必要があるため。

スレッドを大量に作るのは定石とは違うのかも。

65:デフォルトの名無しさん
07/08/31 21:58:22
pollでひっぱれよ



66:デフォルトの名無しさん
07/08/31 22:04:35
FD_SETSIZEって変更できたっけ?

67:デフォルトの名無しさん
07/08/31 22:06:21
sendfileしてあとはシラネ、みたいな。

68:デフォルトの名無しさん
07/08/31 22:07:30
Winsock.hの42行から
/*
* Select uses arrays of SOCKETs. These macros manipulate such
* arrays. FD_SETSIZE may be defined by the user before including
* this file, but the default here should be >= 64.
*
* CAVEAT IMPLEMENTOR and USER: THESE MACROS AND TYPES MUST BE
* INCLUDED IN WINSOCK.H EXACTLY AS SHOWN HERE.
*/
#ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif /* FD_SETSIZE */

69:デフォルトの名無しさん
07/08/31 23:47:58
>>64
そんな設計なら普通にブロッキングモードにしとけば
send は送信バッファが一杯になったら空くまでブロックしてくれるし
recv は受信データが無ければ来るまでブロックしてくれる
select も独自キューも使う意味なし

70:デフォルトの名無しさん
07/09/01 02:08:54
>>69
スレッド・同期スレッドの場合には、sendはソケット内のバッファが開くまでブロックすることは期待しているけど、
送信するデータが無い場合にはブロックしようが無いので、送信データが来るまでビジーループにするわけにも行かないので、
キューを作ってそれが空じゃなくなるのをコンディションなどで待つ必要があると思うのですが。

受信側はそのとおりになってます。実際は受信データがきたら
ヘッダを解析してまとまりごとにデータを纏めて
メインスレッドにイベントを投げて受信したデータを処理しています。

現在4種類とも実装して、設定で切り替えられるようにしていましてどれも動いてはいるのです。
他にもWinsocksだと非同期IO(OverlapedIO/sendmsg)などで実装するなど色々サンプルはみているのですが
実際どれがいいのかは環境依存?

スレッドを大量に立てると高負荷になるし、
タイマーでポーリングすると、タイマー内で処理をする量の制限を掛けるため、
性能がいまいちな場合もあります。

ちなみに、現在のキューは2つの同期制御付きキューを使って、
片方を処理データに、もう片方を未使用のメモリ用に使ってます。
これで、送信データを設定する場合に未使用のメモリの部分に直接ファイルなどから読み込むことにより、
キューへのコピー処理も起きないようにしています。
受信データは未使用メモリのキューから取ってきて、使用中のキューにヘッダ+データが来た時点で入れて処理しています。

最初は同期ソケット+スレッドか、非同期ソケット+非スレッドの2種類になるのかと思ってたのですが、
実際は>>60に加えて受信、送信スレッドそれぞれスレッド無しかどうかも独立に扱えるようにはなっているのです。
でも、結局いろいろ作ってもどれでも変わらないのかも???

71:デフォルトの名無しさん
07/09/01 08:37:43
Windowsの場合、性能的にはIoCompletionPortを使うのがベストと聞いた。
IoCompletionPortは非同期ソケットをベースとするけど、
扱うソケットが増えてもイベントやスレッドの生成自体を少なくできる、らしい。

72:デフォルトの名無しさん
07/09/01 11:06:50
OVERLAPPEDを使うとSend/Recvで扱うバッファをユーザーが先に指定できるので
データの送受信にコピーが要らない。(逆に言えばその辺の管理をこちらがやる)
更にIoCompletionPortでスレッドの管理をやらせると利用可能な最大スレッドも指定できる
・・・という認識だったけど。

73:デフォルトの名無しさん
07/09/01 16:32:00
ネットワークケーブルで繋がったパソコンを遠隔起動させるプログラムを作りたいのですが、
そのために必要なマジックパケットがどのようなものでどのように送信するのかが分かりません
どなたかご存じないでしょうか?
やりたいこと自体は単純で、マックアドレス指定したパソコンの電源を入れるだけです
(フリーソフトのWakeUpみたいな感じです)
ちなみに自分が開発に使用している言語は純粋なC言語です

74:デフォルトの名無しさん
07/09/01 16:48:35
>>73
wakeonlanでググレカス

75:デフォルトの名無しさん
07/09/01 17:20:21
>>74
ありがとうございます!

76:デフォルトの名無しさん
07/09/01 17:34:55
>>74の優しさに全米が嫉妬

77:デフォルトの名無しさん
07/09/02 00:16:34
ところで、
みなさんrecvの最大受け取りバイト数を1にしてループ回すのは極悪だと思ってますか?
それともそれでもいいと思いますか。


78:デフォルトの名無しさん
07/09/02 00:32:49
世の中には実行効率なんかどうでもいい場面ってのがあるから、状況しだいでは別にいいんじゃね

79:デフォルトの名無しさん
07/09/02 00:52:42
それが極悪ならfgetcを繰り返すのも極悪になるぞ

80:デフォルトの名無しさん
07/09/02 01:57:38
>>79
理想的には、例えば'\n'が出てくるまで読む、という非常に1byte recvしたい処理においても
自分で管理のためのバッファを用意し、1byte recvする場合よりも格段に
複雑なバッファリング処理をするほうが正しいってことになってると思うぞ。
URLリンク(tangentsoft.net)
の22、Festering in a pool of lameness.ってなってる。
俺はドザじゃないが、昔ドザだったころにこれを見て以来それを頑に守ってきた。
どうでもいいテストプログラムとかを除いて。

>>79
違うぞ。例えば1byteずつ1000byteを読みだす場合、
fgetcを1000回読みだすのは、既にユーザ空間に適切バッファリングされたデータを読みだすので、
システムコールを叩くのは軽く1000回以下。環境依存だが、大抵はこれより
大幅に少ない、1回とか0回(すでに読まれてた)になると思う。
recvを1000回呼ぶのは、システムコールもきっちり1000回叩く。この差は大きい。

81:デフォルトの名無しさん
07/09/02 09:45:10
> recvを1000回呼ぶのは、システムコールもきっちり1000回叩く。

実装依存だろ。頭固いな。

82:デフォルトの名無しさん
07/09/02 13:34:56
>>79
> それが極悪ならfgetcを繰り返すのも極悪になるぞ
実装依存だろうけど, unix 系では通常
fgetc はライブラリ: システムコールのオーバヘッド小
recv はシステムコール: システムコールのオーバヘッド大
なので recv で 1 バイト読み込みループは極悪


83:デフォルトの名無しさん
07/09/02 13:44:46
recvで1コールするとUnix系だと
KernelとUserでメモリコピー毎回発生するぞ?

84:デフォルトの名無しさん
07/09/02 14:36:15
selectを抜けた後呼び出して
中ではバッファリングしてるんだけど
特定の条件をクリアするまでは
読んだことにならないread?表現難しいな
のスケルトンが欲しい。

85:デフォルトの名無しさん
07/09/02 14:42:20
>>84
条件とかかけよぼけが
頃すぞぁぁぁあ?

一人で読み書きするならそもそも
条件なんて勝手に決めろよぼけ
ってはるだろうがーこの糞ピザ野郎が

お前は1000回氏ね

86:デフォルトの名無しさん
07/09/02 15:20:26
>>85
条件なんて案件ごとに違うじゃん
だからライブラリじゃなくてスケルトンって書いたんだってば
愛してるよ

87:デフォルトの名無しさん
07/09/07 15:53:53
超初歩的な問題ですみませんが、どうしても判らないので教えてください。

p2pのネットゲームを作っていまして、
サーバになる方は、ポートを空けて接続を待つのは判るんですが、
空けるポート番号は、1024~65535の間でしょうか?
それとも、動的/プライベートポートの49152~65535の間でしょうか?

0~1023は一般的なポート番号で使わないほうがいいのは判りますし、
1024~49151は、予約済みポートですから、
ユーザーが自由に使えるということで、49152~65535を空けるようにしましたが、
たとえは「ひぐらしデイブレイク」では37564など、予約済みポートの範囲内で、
ポートを開放している場合があります。

またクライアント側に割り当てられるポート番号は動的/プライベートポートから
選ばれるみたいで、すでに別のソフトでクライアントとして、そのポートが使われていて、
いざp2pゲームでサーバとして、ポートを開放しようとしたら、空かないことがあるかも知れないですよね。

変な文章ですみませんが、ポートを開く約束事について、良くわかりませんので、
どうか教えてください。

88:デフォルトの名無しさん
07/09/07 16:59:55
>>87
0-1023は使わないほうが良いだろうけど、それ以降のポートが全て決められている
わけでは無いし、星の数ほど存在するソフトが65535のポートで足りると思うか?
思いついたポート番号をググって使われてなさそうなら、使ってしまえ。
と適当な事を言ってみる。

使おうとしたポートをbindさせた時点で既に他のソフトで使われているようなら
エラー出るし、問題無いだろ。


89:デフォルトの名無しさん
07/09/07 18:35:16
>>87
最悪、ユーザが自由に変更できるようにしとけば、ぶつかっても回避できる

参考までに
URLリンク(www.iana.org)

90:87
07/09/07 20:45:21
早速の返答ありがとうございます。

説明不足でしたが、>>89さんの言うような、ポート番号を入力できるメッセージボックスがあり、
ユーザーが開けたいポート番号を自由に決めれるようになっています。

ただ、そのポート番号を選択できる範囲が、1024~65535の方がいいのか、
49152~65535の方がいいのか、わかんないのです。恥ずかしい話・・・

普通、自由に使えるプライベートポートというなら、みんな49152~65535の範囲でポート開放するのに、
先の「ひぐらしデイブレイク」では37564の予約済みポートの範囲内でポートを開けるし、
あるp2pソフトの使用説明サイトでは、1024~65535までの間で好きな数を選べると書かれています。

動的/プライベートポートがあるのに、わざわざかち合う可能性のある予約済みポートの範囲を使うのは、
ルーターを使用している環境での、ポート開放に有利になるんじゃないかと、勘ぐってしまいます。
ちなみに、私のネット環境はbフレッツで、回線終端装置から直にLAMケーブルでパソコンにつながっているので、
ルーターのポート開放をしたことが無く、ルーターについてよくわかりません。

あんまり、ポート番号について、気にする必要は無いのでしょうか?

91:デフォルトの名無しさん
07/09/07 20:50:59
もちろん気にした方がいい。
有名どころのポートや、
過去に問題があってセキュリティで睨まれているポートは避ける。



92:デフォルトの名無しさん
07/09/07 22:10:03
攻撃力高そうなケーブルだなLamケーブル

93:87
07/09/08 00:20:45
返答ありがとうございます。

>>92さん、すみません。LANケーブルでした。

あと、>>91の書き込みで、
「有名どころのポートや、
過去に問題があってセキュリティで睨まれているポートは避ける。」
と、あるので、自由に使える動的/プライベートポートである49152~65535の間で、
ユーザーに解放させるポート番号を選択させた方がよろしいでしょうか?

そうなると、なぜ他のP2P通信のゲームやソフトは、予約済みポートの範囲内で、
ポートを開放しているのかがわかりません。自分が見たところ、動的/プライベートポートで
開放しているところより、予約済みポートの範囲で開放しているところが多い気がします。
問題のwinnyも、初期は7747をあけていましたし・・・。

このスレッドの皆さんには常識なのに、こんなことをしつこく聞いて申し訳ないと思いますが、
ユーザーに開放させるポートの選択範囲は、
1024~65535の方がよろしいのか?
49152~65535の方がよろしいのか?
どうか教えてください。
本当にすみません。

94:デフォルトの名無しさん
07/09/08 00:23:51
>ただ、そのポート番号を選択できる範囲が、1024~65535の方がいいのか、
>49152~65535の方がいいのか、わかんないのです。

個人的には、そういう妙な縛りはイヤだ。
1~65535を自由に選択できればいいと思う。

そのダイアログが毎回表示されて、ユーザにポートを選ばせるんなら、ちょっと鬱陶しいかもしんない。
適切なデフォルト値を用意しておいて、一般ユーザはそれに触らずに済むようにして、
わざわざ変更したいと思うパワーユーザだけ、設定画面を出して変えればいいと思う。
そういう人は、自分が何やってるか解ってるだろうから、任せとけばいいよ。

95:デフォルトの名無しさん
07/09/08 01:40:17
>>93
多くのアプリが1024~49151ってのは、49152~65535にすると、本当に動的に取得してる
アプリやクライアントなどと競合する可能性があるからたまたまタイミングによってサービス
が起動できない可能性を嫌っているんじゃないだろうか。

1024~49151なら、少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラー
は最小化できるし、それがたとえ定義済みのポートだったとしても、サービスの運営側と
すれば、自分のマシンに競合アプリが入ってなければ実質的な問題は発生しないので
気にしなくて良い。

もっとも動的といっても、例えばクライアントの使用するポート番号(エフェメラル・ポート)
はOSによって違い、FreeBSDなどは確かに49152~65535だが、Windowsの場合、
1024-5000が使用されてるみたいなので、厳密な意味での競合回避できるかは分からないし、
心理的なものかもしれないが。
でも、そのような理由で例えばデフォルトは5001~49151の範囲から定義済みでないものを
選ぶみたいな考えもあるかもしれない。

というわけで、ポートの選択は実際にサーバを立てる人の好みの問題や、
場合によってはファイアフォールなんかとの兼ね合いもあるので、一般にきつくするのは好まれない。
ただ初心者が使う前提のアプリなら推奨値の範囲で縛りを入れておいた
方が後々のトラブル回避点でメリットはあるので、あとはアプリしだいでは。

96:デフォルトの名無しさん
07/09/08 06:44:18
apacheを使わないWebDAVサーバって有ります?

97:デフォルトの名無しさん
07/09/08 11:46:28
動的portとプライベートportが、49152~65535ってのは決まりごとです。
>>95は甚だしく不当な言明。無知蒙昧。

> 少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラーは最小化できるし、

に至っては言葉を失う。

98:デフォルトの名無しさん
07/09/08 11:47:53
>>96
URLリンク(www.webdav.org)

99:95
07/09/08 18:26:23
>>97
申し訳ない。
以前サーバ開発のプロジェクトにいたとき、周りがみんな
この程度の認識だったので、正直甘く考えていた。

これからは気をつける、もうそんな開発の機会もなさそうだけど。

100:87
07/09/08 22:47:55
皆さん、ありがとうございます。これらの書き込みを、いろいろ参考にさせてもらいます。

最終的にポート番号の入力ですが、入力ボックスを用意しますが、
ゲームクライアントが最初にログイン画面を立ち上げた際、49152~65535の間をランダムに、
番号を割り振るようにします。
そこで、IDネーム、パスワード、ポート番号を決定したら、それをログインデータとしてセーブし、
以後、ソフトが立ち上がるたびに、ログイン画面の入力ボックスには、ID、パスワード、ポート番号が、
すでに入力されているようにします。もちろん、この時点で入力ボックスの中身を変更して、ログインしたら、
ログインデータも新しい方に修正されます。
ランダムにポート番号を割り振る時は、49152~65535の動的/プライベートポートの範囲ですが、
入力できる範囲は、予約済みポートを含めた、1024~65535の範囲を選択出来るようにします。

こんなもんでどうでしょうか?

101:デフォルトの名無しさん
07/09/09 06:23:53
acceptする方のportは範囲を狭めておかないと、
firewallの設定を全部開けておく必要があることになる。

102:デフォルトの名無しさん
07/09/09 06:27:17
登録範囲のportを使う場合も、未登録の範囲にしておいた方がいいのではないか?
URLリンク(www.iana.org)

103:デフォルトの名無しさん
07/09/09 13:21:24
そしてUPnP

104:デフォルトの名無しさん
07/09/11 13:39:27
自分のパソコンにメールサーバを入れてそれを使ってメーラーのテストはできますか?

何か無償で取れるサーバーがあればいいのですが・・・

105:デフォルトの名無しさん
07/09/11 21:19:30
URLリンク(www.vector.co.jp)


106:デフォルトの名無しさん
07/09/11 22:59:04
>>103
UPnP対応ルータとかの普及率ってどっかに統計ないかな?



107:デフォルトの名無しさん
07/09/11 23:12:09
それは知りたいな
でもUPnP対応とか言ってても酷い実装もあるから当てにならなかったりするんだよな

108:デフォルトの名無しさん
07/09/12 01:02:44
pollで3つのfdを管理するさんぷる
どっか墜ちてませんかね?

selectが使えない組込みデバイスなので
ちと困ってますw


109:デフォルトの名無しさん
07/09/12 02:15:45
>>108
24時間やる。こなたの得ろ画像を500枚用意しろ。
そいつと引き換えにオレがサンプルを渡してやる。

110:デフォルトの名無しさん
07/09/12 02:58:48
>>109
約束したぞ。

111:デフォルトの名無しさん
07/09/13 06:52:35
Windowsソケットで
struct sockaddr_inの最後のメンバにsin_zeroが有ります。
このメンバの値は何に使われるのですか?

112:デフォルトの名無しさん
07/09/13 07:20:17
パディング

113:デフォルトの名無しさん
07/09/13 07:30:17
そうだけど、値は全く参照されない仕様なのかな?

114:デフォルトの名無しさん
07/09/13 08:20:05
はい。

115:デフォルトの名無しさん
07/09/13 08:35:09
>>114
肝心な所は知らないんだな。お前は役立たずだ。

このスレを見ている人はこんなスレも見ています。(ver 0.20)
会社で使えない奴、それはワタシ/アイツ [プログラマー]

116:デフォルトの名無しさん
07/09/13 10:33:33
>>111
Windowsはどうなのか知らないが、アドレスをソケットにバインドする際、アドレス構造体を
各インタフェースの関連アドレスとバイナリ比較する実装があるらしい(sin_zeroが0であることを
前提としている)。
プロトコルスタックの内部処理で何か使われているかもしれないし、sockaddr_in全体を最初に0で
初期化して使えば問題ないんじゃないのかなあ。

まあ、>>115の言っている「肝心な所」が何なのか、ちょっと気になるけどね。
俺も役立たずかもしれないな~。つーか、教えてくれたって良いじゃない。

117:デフォルトの名無しさん
07/09/13 10:42:18
やっぱりそうですね。
そんなわけで0にしようと思いましたが失敗しています。
8バイトほど0を入れたいのですが実行時エラーです。
大文字なのが原因かもしれません。
SOCKADDR_IN sa;
memcpy(sa.sin_zero, 0, sizeof(sa.sin_zero));

118:デフォルトの名無しさん
07/09/13 10:57:01
>>117
memcpyはないだろう

119:デフォルトの名無しさん
07/09/13 11:22:54
FARとか付いたりしてるからmemcopy()が使えないってことかな?

120:デフォルトの名無しさん
07/09/13 11:30:16
memcpyがどういう関数か調べろよー
ってか、forループで書けば上手くいくはずだから、
memcpyを使うこと自体が間違いって気づきそうなものだけどな

121:デフォルトの名無しさん
07/09/13 11:32:55
memsetだろうなw

122:デフォルトの名無しさん
07/09/13 11:34:48
>>116みたいな懸念があるなら、
(そういうのは狂っていると思うが)
sockaddr_in全体を0 fillしとかないと駄目だろ。

123:デフォルトの名無しさん
07/09/13 11:34:50
memsetだ。オマイラえらいなー。

124:デフォルトの名無しさん
07/09/13 12:05:37
PF_INETって古すぎる情報?Linuxのこと?
URLリンク(72.14.235.104)

125:デフォルトの名無しさん
07/09/13 13:01:47
socketを作る時のtype指定に使うのがPF_*。
sockaddrはAF_*の方。

126:デフォルトの名無しさん
07/09/13 13:11:47
>>125
でもさ、「なんかもうそのへんどうでもいいよ」って
socket関連のAPIの仕様書に書いてあるんだよね


127:デフォルトの名無しさん
07/09/13 14:12:34
どうでもいいってことはAとPを間違って書いても値が同じになるような
値が定義されているってことかな?

128:デフォルトの名無しさん
07/09/13 14:20:09
>>127
間違えそうなところはちゃんと同じ値になってる。

129:デフォルトの名無しさん
07/09/13 14:32:54
それならよし

130:デフォルトの名無しさん
07/09/15 00:02:24
オンラインの格闘ゲームを作りたいのですが、ローカルで通信のテストを
してみたところ、1秒間に40バイトのデータを17回程度しか
やりとりが出来ません。

pingだと1ms程度でるので、もっと通信の頻度が高くても良いと思うの
ですが、大体こんな程度なのでしょうか?

通信にはDirectPlayを使っています。転送処理の行はこんな感じです。
(WinSockだと早くなったりするのでしょうか?)

HRESULT hr = Get_DPlay()->SendTo( this->dpnid, &dpnbuffer,
1,
60000,//タイムアウトまでの時間
NULL,NULL,DPNSEND_SYNC );

131:デフォルトの名無しさん
07/09/15 00:24:28
nagleかな

132:デフォルトの名無しさん
07/09/15 01:29:28
なんとか解決できたみたいです。

作成したスレッドにてSendTo関数を実行していたのですが、スレッドの
優先度をあげてみたところ、1秒間に240回程度の速度が出るように
なりました。
アドバイスありがとうございました。

133:デフォルトの名無しさん
07/09/15 14:23:37
TCPだと、sendしてもすぐには送信されずに
まとめて送れるモノが無いかどうか少し待つ
実装が多いよね。優先度低いと町が長くなる

134:デフォルトの名無しさん
07/09/17 02:34:38
bsdのzero_copyって
なんでlinuxにないの?

つーかこれじゃ何もできねーよw

135:デフォルトの名無しさん
07/09/17 08:54:45
> 何もできねー

ほう

136:デフォルトの名無しさん
07/09/17 09:08:43
RDMA

137:デフォルトの名無しさん
07/09/17 11:06:58
RDMAなんていらねーよw

マシン2台間での関係でそんなでかい
もん使うなんてあほだ

zero_copyあればいいのに
Linuxは糞だな

138:デフォルトの名無しさん
07/09/17 12:34:28
条件小出し方式ですな

139:デフォルトの名無しさん
07/09/17 13:08:01
はいはい。愚痴はいいからさっさと作れよ
納期過ぎてんだから。

140:デフォルトの名無しさん
07/09/17 13:15:54
boostにネットワークライブラリってありますか?

141:デフォルトの名無しさん
07/09/17 15:55:05
なぁなぁ頼むよ
zero-copyする方法教えてくれよ

142:デフォルトの名無しさん
07/09/17 16:44:05
>>140
1.35よりboost::asioというのが使えるようになったらしいです。

143:デフォルトの名無しさん
07/09/17 16:49:42
お前ら粘着するぞゴラ
アボーンできねぇから迷惑きわまりねぇぞ

速く教えろよコラ

144:デフォルトの名無しさん
07/09/17 16:52:20
>>142
ありがとうございます
早速試してみます

145:デフォルトの名無しさん
07/09/17 17:19:00
URLリンク(ml.tietew.jp)


146:デフォルトの名無しさん
07/09/17 22:58:11
>>143
こういうノリ久々にみた。個人的に好き。
やっぱり2chはおまいみたいなのがいないとつまらんよね、まぢで。

147:デフォルトの名無しさん
07/09/17 23:36:40
なにをするために、zerocopyにしたいの?

148:デフォルトの名無しさん
07/09/22 01:32:33
いなくなっちゃったね。
zerocopyくん。

149:デフォルトの名無しさん
07/09/22 11:00:41
linux板でもみたけど、
スレリンク(linux板:820番)

150:マルチポストですみません
07/09/22 18:32:04
以下コピペ

現在、Windowsソケットプログラム(winsock1.1)により、P2Pでの非同期のTCP通信プログラムを組んでます。
そこで、クライアントからサーバーへの同時接続のチェックをするために以下のような処理を行っています。
#関係ありそうな情報のみ載せます。足りなければご質問下さい。

OSはWindowsXP HomeEditionです。
なお、OSによる同時接続制限はBiotというツールにより20000というふうに設定しております。
・クライアント
1.ソケット3000個用意
2.for文ループ処理によりソケット数分Connectを実行

・サーバー
1.listenの同時接続最大数は20000に設定

毎回Connect実行時、大体2000回目辺りからエラーが出てきます。
その後、イベントが返って来た時のエラーチェックでも、WSAECONNREFUSED(10061)で「サーバーにより接続が拒否された。」というエラーが検出されます。
結局、接続成功は500~700回ぐらいでした。

この現象に対する対処法や解決法はないでしょうか?
現状では、全てのConnect要求を成功できるようにしたいと思っております。
子プロセスを作成するような方法は時間が無いので考えておりません。
9/18にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。
以上、よろしくお願い致します。

URLリンク(oshiete1.goo.ne.jp)

こんな状態です。どなたかわかる方はいませんでしょうか?

151:デフォルトの名無しさん
07/09/22 20:11:59
サーバ側の accept を回す処理が追いつかなくてバックログがあふれたとか?
listen をいくら大きくしても、あれただのヒントだった気がするが・・・

152:150
07/09/22 20:15:40
>>151
って事は、いくらOSのほうを対応しても、listenではじかれてしまうんですか。
SOMAXCONNを指定すれば対応できたりしますかね?

153:デフォルトの名無しさん
07/09/22 20:29:08
そのくらい、すぐ試してみれば?

あとは、余計な処理を一切省いたacceptだけのループでなら接続できるのかどうかを実験してみるとか・・・例えば
while(true){
accept(fd);
}
みたいな。 あるいは、accept するスレッドを複数立ち上げてみるとか。
それで無理なら無理っぽいな。
OS 変更も検討してみるべきかもね。

154:150
07/09/22 21:24:40
>>153
はい。ちょい試してきます。


155:150
07/09/22 22:30:36
>>153
SOMAXCONNを指定したら、逆に成功確率はかなり減りました。170回くらいでした。

ところで、サーバーの動作は非同期通信なので、ループ処理は無理でした。
あと、スレッドは立て方がわかりませんのでなんとも・・・。
forkはUNIXだし、その前に使えないし・・・。

無知ですみません;

156:デフォルトの名無しさん
07/09/22 23:05:25
非同期なら、accept完了がわかった時点ですぐ閉じてみたら?
スレッドは、beginthreadex。

157:デフォルトの名無しさん
07/09/22 23:06:23
非同期って WSAAsyncSelect のやつかな
シングルスレッドサーバだと他のソケットを read したり write したり
データを処理したり色々構ってやってる間は当然 accept を呼べないから、
処理に時間がかかってるようなら、やっぱりその間に接続要求がたまりすぎて溢れるんじゃないかと

158:デフォルトの名無しさん
07/09/23 00:09:17
Winsock1.1+WSAAsyncSelectでハイパフォーマンスなサーバを書こうとするのも
アレだが
XP Home Editionというのも終わってるだろ。
何が悲しくてクライアント用のOSで1000のオーダーの同時接続数をさばかにゃ
ならんのだ。
せめて2003サーバに汁。
ハードもそれなりにおごれや。

で、使うべきはIOCPな。
WSAAccept()をポストし続けるスレッドも専用で回せ。

159:150
07/09/25 02:08:20
>>156
とりあえず、やってみます。beginthreadexは調べておきます。

>>157
その線が一番怪しいんですが、TCP接続制限をBIOTで20000に設定して、
listenも20000にしているんで、溢れるという事が無いように思えるんですが・・・。
listenのバックログの最大数があるらしいんですが、まだ調べきれてなくて
わからない状態です。

>>158
サーバーはまぁ、色々と事情が…;
でも、論理的にはTCP接続制限をはずしているんで、そこでacceptが失敗するのは
OS以外のことだと思うんです。
私が知らないだけかもしれませんが、XPと2003サーバってサーバーマシンとして
使用した際に何か違いってあるんでしょうか?

160:デフォルトの名無しさん
07/09/25 02:15:11
>>159
そう思うなら、Linux入れて同じハードでほぼ等価の
コード作ってためせ

たぶんおきねーからw



161:デフォルトの名無しさん
07/09/25 03:29:59
>>159
XP Homeで3000ソケット接続を試してみたけど、特に問題なく接続できたよ。
1,環境が良く分からない。サーバーはマルチプロセッサマシンなの?
2,クライアントでconnetを行うときにSleep関数を入れてconnectの接続間隔を長くしてみては?

162:デフォルトの名無しさん
07/09/25 06:32:30
>>159
最小限のソース晒してくれ
時間の無駄だ

163:デフォルトの名無しさん
07/09/26 09:14:56
無線LANに接続しているPCの数を取得するにはどうすればよいのでしょう?

164:デフォルトの名無しさん
07/09/26 10:12:09
>>150
acceptの処理時間とか無関係。
サーバのOSでTIME_WAITでポートが枯渇してるだけ。
TIME_WAITについて深くしりたけりゃぐぐれ。
めんどくさけりゃSO_REUSEADDR。


165:デフォルトの名無しさん
07/09/26 10:15:56
>>163
a. 無線LANのWebからステータスを得る
b. SNMP,MIBでぐぐーる


166:デフォルトの名無しさん
07/09/26 11:33:20
サーバ側のポートが枯渇するの?
サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?

167:デフォルトの名無しさん
07/09/26 11:43:38
ちゃんとした通信手順を踏めば即座にポートを解放してくれる
行儀の悪い通信をすると TIME_OUT まで待ってから解放される
TCP/IP の仕様だから Linux でも Windows でも同じコードなら
やっぱり通信数に制限が出るような気がする

168:デフォルトの名無しさん
07/09/26 11:53:21
>>164
> ポートが枯渇してるだけ。

馬鹿丸出し。


169:デフォルトの名無しさん
07/09/26 11:59:52
SO_REUSEADDRは再びbindするときの話だっけ。
>>150とは関係なさそうだな。

170:デフォルトの名無しさん
07/09/26 13:16:22
acceptを終了するにはどうしたらいいの?
acceptで待機中の時に別スレッドからsocketcloseを呼び出したら
WSAEINTR (10004)
? 意味 : 関数呼び出しに割り込みがありました。
? 説明 : ブロック操作は WSACancelBlockingCall (Wsapiref_704y.asp) の呼び出しによって中断されました。
が呼ばれるんだけど、acceptの終了方法はこれであってるの?

winsocket2.2

171:デフォルトの名無しさん
07/09/26 13:36:14
>>170
WinsockならそれでOKのはず

172:デフォルトの名無しさん
07/09/26 14:01:34
>>171
そうなんだ
ありがとう~

173:デフォルトの名無しさん
07/09/26 15:53:48
>>166
>サーバ側のポートが枯渇するの?
>サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?

その通り、枯渇するのはクライアント側のポートだった。
↓あたり。
URLリンク(www.softlab.ece.ntua.gr)
URLリンク(mikilab.doshisha.ac.jp)
URLリンク(d.hatena.ne.jp)

ま、結論としてはSO_REUSEADDR。


174:デフォルトの名無しさん
07/09/26 16:42:19
ということはconnect内部のbindで失敗するとWSAECONNREFUSEDが返ってきちゃうのか。
原因に気づき辛そうで厄介だなあ。

175:デフォルトの名無しさん
07/09/26 20:06:08
>>173
クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。

176:デフォルトの名無しさん
07/09/27 00:13:10
おまえら, なんかトラブったときに TCP のステートダイアグラム
見ないでプログラム修正とかしてるのか?


177:150
07/09/27 10:53:38
一向に解決しなかったけど、今の状態で妥協する形になりました。
助言くれたかたサンクスです。

>>176
TCP のステートダイアグラム
とは?

178:デフォルトの名無しさん
07/09/27 11:12:53
URLリンク(www5d.biglobe.ne.jp)
Figure 6. TCP Connection State Diagram


179:デフォルトの名無しさん
07/09/28 00:06:29
URLリンク(tools.ietf.org)
か、あるいは簡略化されているが↓のも見やすいよ
URLリンク(www.atmarkit.co.jp)


180:デフォルトの名無しさん
07/09/28 08:29:23
>>179
> 簡略化されているが

あかんやん


181:デフォルトの名無しさん
07/09/30 07:42:09
複数あるNICのインタフェース(またはローカルIPアドレス)を指定してソケットを
オープンしたいのですが、方法はありますか?

Windows XP SP2

182:デフォルトの名無しさん
07/09/30 08:21:40
bind

183:デフォルトの名無しさん
07/09/30 10:03:51
すいませんclient側の話なんです。
bindってサーバ側ですよね。

NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
を指定して通信させたいのです。

184:デフォルトの名無しさん
07/09/30 10:07:03
特定のNICのIPアドレスを使ってconnectしたいという事ですね。

185:デフォルトの名無しさん
07/09/30 10:40:39
>NICが2枚刺さってるPCがありまして、片方のNIC(あるいはIPアドレス)
>を指定して通信させたいのです。

それもbindでできたと思うけど。ローカルホスト側のsocket endpointを明示的に指定する処理は
全部bind。

186:デフォルトの名無しさん
07/09/30 10:41:32
>>183は思い込み激しす

187:デフォルトの名無しさん
07/09/30 10:47:51
初学者は誰だって勘違いすることがある。
めげずにがんばれ。

188:デフォルトの名無しさん
07/09/30 10:52:24
才能内から真だ
ほうがいいと思うけどね
こんなのもしマジでプロジェクトに
混じってたらすげーこえーしw



189:デフォルトの名無しさん
07/09/30 10:59:37
>>188
あんたの部下は死にまくりだな

190:デフォルトの名無しさん
07/09/30 11:24:52
bindできました!

191:デフォルトの名無しさん
07/09/30 16:05:22
ム板でプロジェクトうんぬん云ってるDQNはマ板に逝け

192:デフォルトの名無しさん
07/09/30 18:36:43
>>188
お前の部下になりたくない。

193:デフォルトの名無しさん
07/10/01 02:24:15
>>1のFAQが404のためweb archiveのキャッシュのアドレスを張り。
リンク先を開くときはエンコード種類としてISO-2022-JPを選択する。
URLリンク(web.archive.org)
URLリンク(web.archive.org)

194:デフォルトの名無しさん
07/10/01 23:26:27
質問があるのですが、友達の家から私の家まで通信実験を行いたいと思っています。
家はADSLでプライベートIPではなく、グローバルIPを得たいのですが、方法が分かりません。
どういった方法があるのでしょうか。質問よろしくお願いします。

195:デフォルトの名無しさん
07/10/01 23:41:12
お使いのプロバイダに訊け

196:デフォルトの名無しさん
07/10/02 00:12:02
使ってるプロバイダとかあなたの家や友達の家のネットワーク構成によるけれど、
自宅までグローバルIPが割り当てられてる可能性は高いと思う
家がプライベートIP云々言ってるが、家じゃなくて 「自分のPCが」 の間違いだろう
たぶんルータを挟んでるんじゃないかね
ルータにはグローバルIPが割り当てられてるかもしれんよ
ルータの設定画面かなんかで確認してみ

197:デフォルトの名無しさん
07/10/02 00:32:22
>>195-196
意地悪だなぁ。ちゃんと質問してやれよ。

198:デフォルトの名無しさん
07/10/02 00:35:47
>>194
板違い

199:デフォルトの名無しさん
07/10/02 00:39:06
>>194
実験ならば どこかのCGIを読むようにするのが一番楽だよ
ちなみにどんな実験? 速度の検証とか?
接続確認のテストならばテストになってないが??

200:デフォルトの名無しさん
07/10/02 00:46:01
ちょいと教えて
接続するクライアントソケットは
データーの種類によって分けた方が良い?

たとえば データーと制御データーがあった場合
1) ポートも分ける
2) ポートは同一だけどソケットを別にする
   (受信・送信バッファを個別に取られる事を期待)
3) ポートもソケットも同一で2つのデーターをプロトコルで分ける
   (ソケット別にしても内部的には同じ信号で扱われるから 1,2は
    効果なし)



201:デフォルトの名無しさん
07/10/02 00:51:31
あと関連して もう1つごめん
2つのデーターは

A,Bの2つのデーターが有った場合
1)大きなデーターAをそのまま送ると Bのデーターは
  Aが処理されるので MTUを参考に分割してBのデーターを
  混ぜて送る
2)極端な例で無い限りオーバーヘッドが大きくなるので
  気にしない

これはケースバイケースですが考え方としては?

202:デフォルトの名無しさん
07/10/02 00:53:47
ごめん タイプミス
1)大きなデーターAをそのまま送ると Bのデーターは
  Aが処理されるので MTUを参考に分割してBのデーターを
  混ぜて送る

                   ↓

1)・・ Bのデーターは Aが処理されるまで待たされるので・・


203:デフォルトの名無しさん
07/10/02 00:54:04
理学部ktkr
まず目的を書け。
それと質問を推敲しろ。

204:200
07/10/02 01:15:38
ごめん分りにくかったね
通信の効率化をしたいわけなんだけど
早い話

内容の違うデーターを そのまま送受信するか
ある程度切って送るかです

たしか内部的には以下の処理を行っているはずですので
なにも考えずに送っても ある程度は効率化しているはずですが
みなさんはどうしてます?

■小さいデーターは優先されて送信する(ルーター依存?)
■送信データーはMTU値に切断され送信される


205:デフォルトの名無しさん
07/10/02 01:23:15
実際に効率上の問題に直面してから考えればいいと思われ

206:デフォルトの名無しさん
07/10/02 01:26:30
>>204
> ■小さいデーターは優先されて送信する(ルーター依存?)

どこの星の話ですか?


207:デフォルトの名無しさん
07/10/02 01:27:30
まずはタイミングの門をくぐって
セキュリティ地獄に逝くのじゃ。


208:デフォルトの名無しさん
07/10/02 01:27:18
>>204
0x20以上で構成してSTXとETXではさむ。

209:200
07/10/02 01:36:26
>>205まあ実際はそうなんだけど・・・・
正直 通信よりもアプリの見直しの方が効果あるだろうし
ちょっと例を書いてみます

データーA
WM_MOUSEMOVEからのデーターを送信する
8Byte程度のデーターを1秒間に100個ほど送る
(内部的に遅延されるので実際は2K程度)
リアルタイム性重視

データーB
1秒間に1度画面をキャプチャーして送る
1027 X 768 X 3バイト

この場合はどうする?
当然 差分を送るとか根本的な事は無しで

1)Socketを分ける・分けない ← 私的には意味無いと思ってる
2)データーをMTU毎(または適当なサイズ)に切って
  A,Bを混ぜて送信


210:200
07/10/02 01:39:03
>>206どこかで読んだ事あるんだけど
どこの星の話かは忘れた
Yahoo,OCNとかだと IPフォンのパケットは優先されてる
らしいから それと勘違いかな?

211:デフォルトの名無しさん
07/10/02 01:59:17
>>193
復活してるみたい。


212:デフォルトの名無しさん
07/10/02 02:16:57
>>210
そりゃQoSだな。

213:デフォルトの名無しさん
07/10/02 09:20:09
>>209
なぜかTCP前提で考えてるようだけど、そんなに効率気にするならUDPの方がいいんじゃない
そういった多少のデータロスが許容されるリアルタイムデータにTCPは効率悪い

ところで、それなんてスパイウェア?

214:デフォルトの名無しさん
07/10/02 10:34:05
新手のwinny用黴菌つくってんのかも

215:デフォルトの名無しさん
07/10/02 11:05:45
劣化VNC

216:200
07/10/02 12:02:31
>>213
だからあくまでも例だって・・・・
そもそも通信効率以前の問題だし
劣化 VNC画面・マウスの送る方向違うし
>>212 にあるような仕組みを自前で実装してるのか
聞きたかった



217:デフォルトの名無しさん
07/10/02 12:13:16
>>216 失せろ厨房

218:デフォルトの名無しさん
07/10/02 12:50:02
>>216
やりたいことは2つのストリームをシリアルな通信経路に多重化することだろ。
後は、多重化を自前でやるかTCP/IPスタックにやらせるか。

>1)Socketを分ける・分けない ← 私的には意味無いと思ってる
意味無くない。
>2)データーをMTU毎(または適当なサイズ)に切って
>  A,Bを混ぜて送信
この程度でMTUなんか無関係。

小賢しいこと考える前に手を動かせ。
他人の知識を借りたいのなら、自分が無知であることを認識しろ。謙虚になれ。

219:デフォルトの名無しさん
07/10/02 13:21:23
VNCやRDPを調べればいい。

220:デフォルトの名無しさん
07/10/02 23:30:42
>>216
簡単に高速かする方法あるよ?

FPGAで作ればいいんだよw

221:デフォルトの名無しさん
07/10/03 00:26:23
鯖よりボードの方が高いw

222:デフォルトの名無しさん
07/10/03 03:58:44
> (内部的に遅延されるので実際は2K程度)

よくわからんけど Nagle を止めれば済む話?


223:デフォルトの名無しさん
07/10/03 12:18:04
その手の通信ってトンネリンングさせるかも知らんし、
生パケットがどう飛ぶかなんて議論は意味ない気がする。
画面データはアイドル状態待ってから飛ばせばいいし、
移動系メッセージなら100命令飛ばすんじゃなくて
1命令にまとめる事でも考えた方が。
pcAnywhereは反応重かったな。

224:デフォルトの名無しさん
07/10/03 19:44:50
ネットワークプログラミング初学者です。
サーバーサイドプログラムとクライアントサイドプログラムのふたつを作成した場合、
通信実験のデバッグを簡単に行える方法ないですか?
今、サーバプログラムをメインPCに。クライアントプログラムをUSBメモリに移してノートPCへ。
といった面倒なデバッグ方法です。><
よろしくお願いします。

225:デフォルトの名無しさん
07/10/03 19:47:49
両方ともメインPCで動かす

226:デフォルトの名無しさん
07/10/03 21:23:41
VMware/VirtualPC/Paralles/VirtualBoxで仮想PCを用意する。

227:デフォルトの名無しさん
07/10/03 21:32:58
ネットワーク上繋がってるPCなのにUSBメモリでコピーって意味わからん

228:デフォルトの名無しさん
07/10/04 13:46:58
ネットワークの共有も知らんでネットワークプログラミングとか大丈夫?

229:デフォルトの名無しさん
07/10/04 16:55:35
C#.NETでストリーミングデータの受信のプログラムを
作成しているのですが、Socket.Selectが思った通りに動作していません…

ストリーミングのデータ形式は
ヘッダ2バイト
サイズ2バイト
以下データ
このような形式なのですが、受信をしていくうちに、サーバー側の
送信に追いついてしまい、サイズ2バイトで指定されたデータが
読めない状態になってます

Socket.Select( SocketList. null, null, 100 );
でリードできることは確認しているのですが、
sock.Receiveでデータの部分が数バイトしか読めない状態です
ソケットはブロッキングで別スレッドで読み込みをしています

PerlやWinsockのSelectとは動作が違うのでしょうか?
基本的な質問で申し訳ないですが、よろしくお願いします


230:デフォルトの名無しさん
07/10/04 17:05:16
>>229
selectはあくまで「データがあるかどうか」を調べるだけ。
何バイトあるかなんて知らん。

・データがあれば読み込んでローカルのバッファに溜める
・バッファにデータひとかたまり(ヘッダ+長さ+データ)があれば処理開始

を独立に行えばいい。
複数データが一度にreadできてしまうこともちゃんと考えとけよ。

231:デフォルトの名無しさん
07/10/04 17:12:55
>>229
ストリームソケットは区切りのないただのバイト列なので、例えば100バイトを3回送信しても、1バイトずつ300回受信するかもしれないし、300バイトを1回受信するだけかもしれない。
そういう前提で扱う必要がある。
100バイトずつ処理したければ、100バイト溜まるまで繰り返しrecvを呼ぶ。

232:デフォルトの名無しさん
07/10/04 20:39:37
>>230 >>231
ありがとうございました。そのように実装したいと思います

233:デフォルトの名無しさん
07/10/04 23:26:47
すれ違いかもしれませんがネットワークに詳しい皆さんに質問を、、、
TELNETを使用しHTTPの勉強をしております
Yahooファイナンスから企業の情報を集めたいと思っています。

URLリンク(charge.quote.yahoo.co.jp) の情報を見たいとき
telnet charge.quote.yahoo.co.jp 80
Trying 124.83.147.185...
Connected to charge.quote.yahoo.co.jp.
Escape character is '^]'.
GET /q?s=1301&d=t
The document has moved <A HREF="URLリンク(quote.yahoo.co.jp)
<P>Additionally, a 302 Found
error was encountered while trying to use an ErrorDocument to handle the request.
となってしまい情報を見ることができないでいます
302なので/q?s=1301&d=t ←ここではないほかのURLに情報がありそうなのですが
URLリンク(charge.quote.yahoo.co.jp) の中の情報が書かれているのか真のURLがどこなのか判断する方法があったら教えていただけないでしょうか

234:デフォルトの名無しさん
07/10/04 23:41:13
>>233
URLリンク(quote.yahoo.co.jp)

レスポンスに書いてるじゃん。
このドキュメントはURLリンク(quote)~~にうつってますよ、って。

235:デフォルトの名無しさん
07/10/05 00:07:57
>>234
ありがとうございます
恥ずかしい、、、、、申し訳ないです

236:デフォルトの名無しさん
07/10/05 01:19:53
てゆーかさ、GETをHTTP/0.9でやってるから
レスポンスヘッダが付かなくて
302なレスポンスであってもLocation等で判断できないんだけど
わかってるのかね。

237:デフォルトの名無しさん
07/10/05 23:31:07
FORMのPOSTをGETでアクセスできない事があるんですが?

238:デフォルトの名無しさん
07/10/06 00:15:33
そうですか。

239:デフォルトの名無しさん
07/10/06 02:43:09
URLリンク(www.premiumtv.12gbfree.com)

240:デフォルトの名無しさん
07/10/07 00:22:02
ノンブロックなソケットディスクリプタでサーバにコネクトするときに
そのコネクトがコンプリートしたかのステータスをゲットしたい。
ミーは何をドゥーすればいいの?

241:240
07/10/07 00:23:57
ミーがユーズしてるOSはLinuxです

242:デフォルトの名無しさん
07/10/07 00:24:10
たしかselectで書き込み可能が帰ってきたらコネクト完了

243:240
07/10/07 00:27:21
>>242
ハリーなアンサー サンキューです。

バット、ノンブロックなソケットだとオルレディでキャンライトみたいです。
ワンモアトライしてみます。

244:デフォルトの名無しさん
07/10/07 06:18:17
getpeername(2)がENOTCONを返さなくなった時がcomplete

245:デフォルトの名無しさん
07/10/07 06:46:13
write(send)でFD_WRITEを指定してselect(WSAEventSelect)待ちするケースって
非同期モードですか?

環境はWindows 2000 XPです。

246:デフォルトの名無しさん
07/10/07 06:52:08
というか、FD_WRITEを指定してselectってどういう時に使うのかわかりません。
「ソケットの送信バッファに空きができたことを通知」とのことですが、
一度もwrite(send)せず、いきなりselectしても検出してくれるのでしょうか。

247:デフォルトの名無しさん
07/10/07 07:20:42
>>246
接続確立時に一回だけFD_WRITEの通知がきた気がする
その後は、バッファに空きのない状態→空きのできた状態、になったとき、
つまりsendしてWSAEWOULDBLOCKが返ったあとにバッファに空きができたら通知される。

248:デフォルトの名無しさん
07/10/07 08:49:42
納得いきました。
ありがとうございます。

249:デフォルトの名無しさん
07/10/07 16:39:49
lingerがよくわからないんだけど

今の理解は
・最後に送信する側(closesocketを呼び出す前にsendを呼び出す側)の送信が正常に行われたかを判断するために使用すると思ってます。

そこで質問は
・最後に受信する側(closesocketを呼び出す前にrecvを呼び出す側)はlingerの必要はない?
・closesocketでlingerのタイムアウトエラーが返ってきた時は、最後の送信が正常に完了していないと判断し、エラーとするまたはリトライする

と言うのであってるんですかね?


250:デフォルトの名無しさん
07/10/07 17:43:11
タイムアウトが起きると送信放棄。shutdownのabortが起きる。
その他はまあそういうこと。

MSDN
Network Protocols
Windows Sockets 2
About Winsock
Winsock Programming Considerations
Graceful Shutdown, Linger Options, and Socket Closure

251:デフォルトの名無しさん
07/10/12 16:12:26
日本信号の改札機はなぜ起動しなかったのでしょうか?

252:デフォルトの名無しさん
07/10/12 17:48:09
スレ違いだったらすみません。

DirectShowで動画再生するソフトを作ったんですけど
現在は再生する動画はローカルにある動画のみなので
これをストリーミングに対応させたいと思っています。

ストリーミングについてRTPなどのプロトコルも調べたんですが
Winsockを用いての実装手順がいまいち分かりません。

RTPのパケットを自分で実装して、データを入れる領域に
動画のフレーム、音声データを入れる形でしょうか。

動画ファイル自体をバイナリデータとして送り、ファイル出力された
動画ファイルを再生することなら出来るんですけど、ストリーミング
の実装は実際にはどのような手順で行えばよいでしょうか。

253:デフォルトの名無しさん
07/10/12 18:15:36
動画ファイルの種類に寄る。
動画を映像と音声に分離して、さらにそれを一定量に分割出来なければ、難しいと思う。
AVIファイルをストリーミングさせるってのはナシな。

254:デフォルトの名無しさん
07/10/13 14:05:15
>>252
ファイル出力が完了しなくても再生をはじめれば?

255:デフォルトの名無しさん
07/10/14 22:58:38
YahooファイナンスってKeep-Alive使えないんですかね

毎回接続し直すの面倒なんですけど…

256:デフォルトの名無しさん
07/10/15 06:32:25


257:デフォルトの名無しさん
07/10/19 09:02:36
TCPで非同期(WSAAsyncSelect)を使ってプログラミングをしています。
非同期において送信する場合どのように設計すればいいのかイマイチわかりません。
やりたいことは、接続要求があったらacceptしてファイルを送信するといった内容です。

ファイルの送信要求メッセージを受信
ファイルをバイナリモードでオープン
4096バイトずつ読み込んでsend()
ファイルをクローズ

ファイルを送信した後も継続して通信は行います。
sendもノンブロッキングになってるため、

while(ファイル読み込みが終わるまで){
  send()
}

だと上手くいかないのかなと思います。調べてみると非ブロッキングにおいて連続してsend()を行おうとすると
WOULDBLOCKという現象が起こって送信できない事があるとの事です。
FD_WRITEのメッセージも別に自分が送信したいタイミングで来るわけでもないのでイマイチ有効な活用方法がわかりません。
どなたかご教授願いますm(_ _)m

258:デフォルトの名無しさん
07/10/19 09:23:05
>>257
WOULDBLOCKならあとで続きを送信する

259:デフォルトの名無しさん
07/10/20 00:07:00
>>257
sendも非同期ですべてやればOK。
自分が、acceptまちなのかsendまちなのか。sendまちであれば、現在
何バイト送ったのか全部管理しる。

260:デフォルトの名無しさん
07/10/20 00:09:54
Linuxネットワークプログラミングを勉強したいのですけど、このページの下で紹介されている本でいいのでしょうか。
URLリンク(www.geekpage.jp)

もっといい本があったら紹介していただけないでしょうか

261:デフォルトの名無しさん
07/10/20 04:31:18
>>258-259
えっと、同期ならこんな感じの送信です。

while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send(sock, sendbuf, read_byte, 0);
  memset(sendbuf, NULL, sizeof(sendbuf));
}

WOULDBLOCKなら後で続きを送信するというのはこういう事でしょうか?

while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

あまり非同期っぽい書き方じゃないですが・・・。>>259さんのはちょっと理解が出来ないです。
send待ちとはどういう状況の事を言うのでしょうか?

262:デフォルトの名無しさん
07/10/20 05:32:52
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
これは間違いなく良書だけど、はじめて学ぶ人にはお勧めできない
Linux以外の他のUnixでの実装や、実装される過程(歴史)まで乗っていて
総じて詳しすぎる。もちろん分厚い。初心者はどこが重要化取捨選択するのが
難しいので2冊目の本として考えておいた方がよいとおもいます

言語がCなら、TCP/IPソケットプログラミング オーム社(ISBN4-274-06519-7)
がオススメ。これ一通り読んでサンプル実行してみれば基礎は十分に理解できる。
内容もわかりやすく、本も薄めなので挫折する心配も少ない。

263:デフォルトの名無しさん
07/10/20 08:34:53
>>261
同期非同期に関わらずsendの戻り値はチェックしよう(送信したバイト数)
非同期に関してはWOULDBLOCKが返ってきたら、FD_WRITEが来るまで待つ。

264:デフォルトの名無しさん
07/10/20 08:47:52
>>263
てことは、送信は別のスレッドで行って、FD_WRITEに関してはフラグで処理するといった感じになるんですか?

// 送信可能フラグをたてる
case FD_WRITE:
  send_flag = TRUE;
  return 0;

// ファイル送信スレッド
while( read_byte = fread(sendbuf, sizeof(char), MAX_BUFSIZE, fp) ){
  send_flag = FALSE;
  if( send(sock, sendbuf, read_byte, 0)==SOCKET_ERROR ){
    while( WSAGetLastError()==WOULDBLOCK ){
      while( send_flag == FALSE ) Sleep(100);
      send(sock, sendbuf, read_byte, 0);
    }
  }
  memset(sendbuf, NULL, sizeof(sendbuf));
}

こんな感じでいいのかな・・・?

265:デフォルトの名無しさん
07/10/20 08:59:55
>>264
何か本でもプログラムのソースでも良いから読んで、非同期について整理した方が良い。

WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミングのすべて
URLリンク(www.amazon.co.jp)

猫でもわかるネットワークプログラミング 第2版
URLリンク(www.amazon.co.jp)

266:デフォルトの名無しさん
07/10/20 09:03:16
>>264
それじゃ、下のwhileループ群が同期になってしまうよー

慣れないうちは送信用のキューを用意すると良いかも。
キューに追加するのは自分の好きなタイミングで行い、
実際のsendやFD_WRITEの処理部分と分ける。

>>265も書いてる通り、適当なサンプル眺めれば見えてくるかもね。

267:デフォルトの名無しさん
07/10/20 09:47:26
e1000の改造について詳しいドキュメントちょうだい

268:デフォルトの名無しさん
07/10/20 09:56:35
>>265
ん~書籍を買うのに金銭的余裕が・・・。
月曜日に学校の図書館に行ってWinsockの本がないかどうか見てきます。

>>266
色々と調べてはいるのですが、いまいちFD_WRITEの使い方が理解しにくいです。
FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。
キューを実装するということは、こういう感じで実装するということですかね・・・

while( fread(buf) ){
  push(buf);
}
PostMessage(,,FD_WRITE,);

FD_WRITE:
  if( キューにメッセージがあれば ){
    sendbuf = pup();
    send(sock, sendbuf, sizeof(sendbuf), 0);
  }
  return 0;

269:デフォルトの名無しさん
07/10/20 09:57:20
pushとかpopとかこれじゃスタックっぽいですね。
脳内でキューに変換してくださいm(_ _)m

270:デフォルトの名無しさん
07/10/20 10:04:25
>>268
FD_WRITEはWOULDBLOCKになってから初めてバッファに空きができたら送られるくるもの。
(自分でPostするものではない)
つまり、キューが空になるか、WOULDBLOCKが返ってくるまでsendを繰り返す。
キューへのpushは好きなようにすればい。

サンプルもネットに転がってるはずだから調べよう。

271:260
07/10/20 10:15:22
>>262
情報ありがとうございました。探してみます

272:デフォルトの名無しさん
07/10/20 13:36:48
>>262
横からサンクス。図書館で適当に借りてきたらソレだったので頑張ってやってみっかな。

273:デフォルトの名無しさん
07/10/20 13:57:44
>>268
>FD_WRITEメッセージが来たら具体的にどういう処理をすればいいのでしょうか?
>FD_WRITEメッセージは自分が送信したいタイミングで来るわけでもないんですよね。

「自分の送信したいタイミングで送信する」 という考えを捨てて、「FD_WRITEが来たときに送信する」 ようにしる。
send で WOULDBLOCK が返ってきたら、残りのデータはその場で送信するのはいったん諦めて、どこか別の場所に覚えておく。
FD_WRITE が来たら、覚えておいたデータを改めて送信する。
そのときも、送りきれないと WOULDBLOCK が返ってくるので、再び FD_WRITE が来るまで残りのデータをどこかに覚えておく。

ファイルを読み込んで送るだけなら、データを丸ごと覚えなくてもファイルの現在位置を覚えるだけで充分かもしれないが。

あと、send は渡したデータをすべて送信できる保証はない。
例えば send(sock, buf, 100, 0) とやっても、1バイトしか送信できない場合もある。
何バイト送信できたか戻り値が返ってくるので、送れなかった残りのデータはもう一度送り直す必要がある。

274:デフォルトの名無しさん
07/10/20 14:52:02
なぜそんなに面倒なんですか
バカみたいですね

275:デフォルトの名無しさん
07/10/20 15:04:36
なぜって、非同期だからさ
バカみたいだろ?
おとなしく同期ソケット使っとけ

276:デフォルトの名無しさん
07/10/20 15:29:06
>>274
イベントドリブン式/非同期プログラミングの方法はどれも似たり寄ったりだぞ。
キーワードは「継続」だ。
まあ、この程度なら別にコルーチンを使うまでもないがな。

277:デフォルトの名無しさん
07/10/20 17:12:58
サーバ終了させるのってlistenしてるソケットを閉じればいいんだよね?
それとも終了する関数があるの?

278:デフォルトの名無しさん
07/10/20 18:08:48
すいません。
初心者のくだらない質問を受けてください。

javascriptをHTMLの中に記述して様々なことができるのは、何となく
わかりましたが、第三者に見られてはいけないプログラムはどうやって行って
いるのでしょうか?

つまり表示画面からソースを選択すれば、ソースが見れてjavascriptが
定義されていて、命令されているのはわかりますが、googleで例えると
肝心要の検索プログラムなんかは、絶対にソースなんか秘密で自社サーバー
の厳重な管理の中で動いているわけですよね?

それが見れないのは当然でわかっているのですが、HTMLのソースに記述
するjavascriptやphpなどから外部プログラムへのリンク命令?みたいな部分は
記述しないのでしょうか?

またgoogleの検索プログラムもやはりjavaやphpなんですか?
それともC言語系とかなんでしょうか?

何が言いたいのか自分でもわからなくなりましたが、どなたか教えて
ください。




279:デフォルトの名無しさん
07/10/20 18:13:07
>>278
WebProg板へいってこい

280:デフォルトの名無しさん
07/10/20 18:30:30
>>278
PHPのプログラムはサーバ側で動くのでブラウザからは見れない
JavaScriptのプログラムはクライアント側で動くのでブラウザから見れる
もまいの要求はブラウザから見れないプログラムなのだから
WebProg板へいってこい

281:デフォルトの名無しさん
07/10/20 18:50:18
>>280
ありがとうございました。
そういうことでしたか。



282:デフォルトの名無しさん
07/10/21 22:56:16
サーバとクライアント2台のマシンでメモリ上のデータを交換し
ます。また交換したデータはサーバのディスクんき保存すると
いうことをします。

この時、サーバにデータ保存する保証方法なんか
みんなどうしていますか?RAID以外にどんな技術
組み合わせる?

283:デフォルトの名無しさん
07/10/22 01:01:25
信頼性を高めるのか?それなら単純にバックアップもするだけでいいと思うぞ
まあ、板違いだけどな

データが改ざんされてないか調べるならハッシュ関数つかうけどな

284:デフォルトの名無しさん
07/10/23 10:49:11
winsockなんだけど
WSASendとかで引数でWSABUFを設定するところなんだけど
int WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

サンプルを見るとdwBufferCountに1を指定しているのを見るんだけど
複数データを送信する時はlpBuffers配列で送信するほうが効率がいいの?

例えば10レコードのデータを送信する時など
ループで10回実行するか、1回だけ実行するかで効率が変わるのかな?

OSが勝手に送信バッファをいい具合に設定してくれる?

言ってる意味がわからんかったら言ってくれ、もうちょっと詳しく書く

285:デフォルトの名無しさん
07/10/23 11:34:53
>>284
それはいわゆるVectored I/O, scatter-read/gather-writeでしょう。
Unixでいうwritev()。

そうできるんなら、配列使ったほうが効率はいいはずだ。
writev()なら効率がいい上にatomicだが、WSASendがどうだかは知らない。
MSDNのヘルプをちらっと読んだけど、あんまその辺に触れられてないね。

286:デフォルトの名無しさん
07/10/23 20:54:22
0バイトのデータをsendする方法はありますか?

287:デフォルトの名無しさん
07/10/23 22:32:07
0バイトのデータをsendすることに何の意味が?

288:デフォルトの名無しさん
07/10/23 22:32:57
ping代わり?

289:デフォルトの名無しさん
07/10/23 23:16:08
connectをノンブロックで行い官僚をselectで待って
write可能になったときにsendして成功するか確認
したいの・・・

290:デフォルトの名無しさん
07/10/24 02:31:33
0byte送って確認するのか。
斬新なアイディアだ。

291:デフォルトの名無しさん
07/10/24 03:19:40
いや、select()のない時代のUNIXはそうやったよ。
ノンブロックにして0byte write()。networkに限らず。


292:デフォルトの名無しさん
07/10/24 03:51:28
>>289
connectでwrite可能になったというのは3way handshakeがとりあえず
成功した訳だから改めて接続を確認する必要もないんじゃない?

>>290
tcp keepalive


293:デフォルトの名無しさん
07/10/24 05:02:20
>>292
write可能であっても成功したとは限らないの・・・

294:デフォルトの名無しさん
07/10/24 08:58:35
>>293
connect時の最後のackが届かなかった場合?
最初のsendでエラー処理をするんじゃダメなんだろうか?

295:デフォルトの名無しさん
07/10/24 09:48:51
そもそもsendが成功したら受信側にデータが届くって事が保証されてるの?

296:デフォルトの名無しさん
07/10/24 09:52:08
そんなことは聞く前にソケットFAQ読め。

297:292
07/10/24 10:14:48
>>293
あっそうか、SYN,ACKを受け取ったらwrite可能になるか。


298:デフォルトの名無しさん
07/10/24 10:59:21
FAQくらい理解してから、人にアドバイスしよう。
URLリンク(www.kt.rim.or.jp)
3.3 なぜ、サーバが accept() する前に connect() が成功するのですか?

299:デフォルトの名無しさん
07/10/24 11:05:01
>>298
それってpassive openでしかも単にソケットをuser landにacceptで渡す
タイミングの話しでしょ? 289の質問はactive openだから全然話しが違う。


300:デフォルトの名無しさん
07/10/25 00:56:29
サーバー用のソケットは
socketでソケット作成
bindでポート番号とかに結びつける
listenで聞く???
acceptでクライアント接続を待ちの後
交信用ソケットにクライアント対応を任せ新しいクライアント接続待ち
みたいな感じだと思うのですがlistenの必要性?がいまいちわかりません

listenの引数をみてもソケットと最大コネクション数という感じであまりいい仕事?してるようには見えません
どーしても必要ならsocketかacceptで最大コネクション数とやらを指定するようにすればよかったんじゃないのかなーと思ってしまいます

listenがlistenとして独立していて幸せと感じるのはどのようなときなのでしょうか?

301:デフォルトの名無しさん
07/10/25 06:54:40
ソケットを接続待ちの状態にするためにlistenは必要。
第二引数は最大コネクション数ではなくて、キューの数だった気がする・・・
要は一気に接続要求が来たときに待ってもらう数な。

302:デフォルトの名無しさん
07/10/25 10:23:58
データを送信した時に全データが送られないってことがあるじゃないですか。

これを明示的に起こさせる、起こしやすくするには、どうしたらいいですか?
どんな設定をしたらいいですかね?

setsockoption関数?で送信バッファを1に変えても変化なかったんですよね・・・

全データ遅れなかった時の動作が確認できないんです・・・

303:デフォルトの名無しさん
07/10/25 11:47:12
>>300
listen で実際にサーバのポートを開く。
socket -> bind -> connect っていう手順もありうるので、bind だけではまだポートが開いてない。

304:デフォルトの名無しさん
07/10/25 11:50:48
>>302
受信側の受信バッファも小さくしてみたら?
あと、受信側が recv しなければ、そのうちバッファが一杯になって送れなくなる。
1秒に1バイトずつちまちま recv するようにしてみるとか、どうかな。

305:デフォルトの名無しさん
07/10/25 11:52:46
>>304
回答ありがとうございます

ちょうど今自己解決しました

送信データを1バイトずつSendしたらなりました

306:デフォルトの名無しさん
07/10/25 15:37:11
nagleを切ればいいだろ

307:デフォルトの名無しさん
07/10/25 21:17:23
>>306
やっぱり、全然無理でした。
どうやったらできるんだろ?
カーネルの送信バッファとsetsockoptで設定するバッファって同じことを指してるんでしょ?

送信バッファ 30バイト、送信データ100バイトとした時
send関数を使うと、戻り値が30と返ってくるって思ってるんだけど間違ってる?

308:デフォルトの名無しさん
07/10/25 21:19:18
ちなみに
サーバをIOCPで実装しています。WSASend, WSARecvを実行しています

309:デフォルトの名無しさん
07/10/25 21:19:54
だから正確にはsend関数は使ってません

310:デフォルトの名無しさん
07/10/25 23:37:18
TCPのチェックサムって計算

仮想ヘッダ+TCPヘッダ+ペイロードだよね?

仮想ヘッダとTCPヘッダはいいけど
ペイロードってどこまでなの?

HTTPとかTCPの下になんかプロトコル付く場合
だけ計算みする



311:デフォルトの名無しさん
07/10/25 23:45:01
>>310
> ペイロードってどこまでなの?

全部(もしデータが奇数だったら1バイトの0x00を付加)


312:デフォルトの名無しさん
07/10/26 03:14:59
>>307
TCP/IP の下の NDIS (パケットドライバ)あたりが、パケットの非同期送信を
また別んとこのメモリの許す限りキューイングしてくれるから、そこいらへんは
あんまりあてにならない。

313:デフォルトの名無しさん
07/11/02 15:00:24
winsockでTCPでプログラミングをしているのですが、
たまに接続が上手くいかない時があります。
connect()を実行しても、タイムアウトになってしまいます。
一度プログラムを終了して、再度connect()したら普通に接続できます。
上手く行く時とそうでない時があるのですが、どのような事が原因として考えられるでしょうか?

314:デフォルトの名無しさん
07/11/02 15:07:17
たまたまサーバや回線が混雑してて繋がらなかったとかじゃないか
WSAGetLastErrorでエラーの詳細を確認しる

315:デフォルトの名無しさん
07/11/02 15:16:06
>>314
connect()のエラーは10060でした。
多分タイムアウトだと思うのですが・・・。

while(SOKET_ERROR){
  connect();
}

のような感じにしていて、常に10060が返って来ます。
ネットは色んなHPを見て回れるので混雑してるとかではないと思います。
↑のループをずっと繰り返している間に、新しくクライアントのプログラムを作ってサーバに接続を試みたところ、
普通に接続が出来たので、サーバが原因ではない事は分かってます。

316:デフォルトの名無しさん
07/11/02 15:31:53
connectに失敗した場合、closesocketをして、再度ソケットを作成、サーバのアドレスの設定等を行い、
その後またconnect()を実行する事で、サーバに接続する事は出来ました。
しかし最初にconnect()に失敗する前のsocket()関数は正常に終了しており、sockaddr_in構造体の設定も間違ってません。
connect()が失敗した際に行う再設定は、全く同じ内容のものなのですが・・・

一体何が原因なのでしょうか・・・。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch