1 名前:ftp-data mailto:sage [2007/08/07(火) 01:47:35 ] 主にソケットに関しての質疑応答スレッドです。 Programming UNIX Socket FAQ (日本語訳) www.kt.rim.or.jp/~ksk/sock-faq/indexj.html Winsock Programmer's FAQ (日本語訳) www.kt.rim.or.jp/~ksk/wskfaq-ja/ 関連リンクは>>2-10 辺り 足りなかったら適当に付け足してね 前スレ ネットワークプログラミング相談室 Port19 pc10.2ch.net/test/read.cgi/tech/1159692799/ 関連スレ Java ネットワークプログラミング 【教えて!】 pc11.2ch.net/test/read.cgi/tech/1086238859/
82 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:34:56 ] >>79 > それが極悪ならfgetcを繰り返すのも極悪になるぞ 実装依存だろうけど, unix 系では通常 fgetc はライブラリ: システムコールのオーバヘッド小 recv はシステムコール: システムコールのオーバヘッド大 なので recv で 1 バイト読み込みループは極悪
83 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 13:44:46 ] recvで1コールするとUnix系だと KernelとUserでメモリコピー毎回発生するぞ?
84 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:36:15 ] selectを抜けた後呼び出して 中ではバッファリングしてるんだけど 特定の条件をクリアするまでは 読んだことにならないread?表現難しいな のスケルトンが欲しい。
85 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 14:42:20 ] >>84 条件とかかけよぼけが 頃すぞぁぁぁあ? 一人で読み書きするならそもそも 条件なんて勝手に決めろよぼけ ってはるだろうがーこの糞ピザ野郎が お前は1000回氏ね
86 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 15:20:26 ] >>85 条件なんて案件ごとに違うじゃん だからライブラリじゃなくてスケルトンって書いたんだってば 愛してるよ
87 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 15:53:53 ] 超初歩的な問題ですみませんが、どうしても判らないので教えてください。 p2pのネットゲームを作っていまして、 サーバになる方は、ポートを空けて接続を待つのは判るんですが、 空けるポート番号は、1024〜65535の間でしょうか? それとも、動的/プライベートポートの49152〜65535の間でしょうか? 0〜1023は一般的なポート番号で使わないほうがいいのは判りますし、 1024〜49151は、予約済みポートですから、 ユーザーが自由に使えるということで、49152〜65535を空けるようにしましたが、 たとえは「ひぐらしデイブレイク」では37564など、予約済みポートの範囲内で、 ポートを開放している場合があります。 またクライアント側に割り当てられるポート番号は動的/プライベートポートから 選ばれるみたいで、すでに別のソフトでクライアントとして、そのポートが使われていて、 いざp2pゲームでサーバとして、ポートを開放しようとしたら、空かないことがあるかも知れないですよね。 変な文章ですみませんが、ポートを開く約束事について、良くわかりませんので、 どうか教えてください。
88 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 16:59:55 ] >>87 0-1023は使わないほうが良いだろうけど、それ以降のポートが全て決められている わけでは無いし、星の数ほど存在するソフトが65535のポートで足りると思うか? 思いついたポート番号をググって使われてなさそうなら、使ってしまえ。 と適当な事を言ってみる。 使おうとしたポートをbindさせた時点で既に他のソフトで使われているようなら エラー出るし、問題無いだろ。
89 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 18:35:16 ] >>87 最悪、ユーザが自由に変更できるようにしとけば、ぶつかっても回避できる 参考までに www.iana.org/assignments/port-numbers
90 名前:87 mailto:sage [2007/09/07(金) 20:45:21 ] 早速の返答ありがとうございます。 説明不足でしたが、>>89 さんの言うような、ポート番号を入力できるメッセージボックスがあり、 ユーザーが開けたいポート番号を自由に決めれるようになっています。 ただ、そのポート番号を選択できる範囲が、1024〜65535の方がいいのか、 49152〜65535の方がいいのか、わかんないのです。恥ずかしい話・・・ 普通、自由に使えるプライベートポートというなら、みんな49152〜65535の範囲でポート開放するのに、 先の「ひぐらしデイブレイク」では37564の予約済みポートの範囲内でポートを開けるし、 あるp2pソフトの使用説明サイトでは、1024〜65535までの間で好きな数を選べると書かれています。 動的/プライベートポートがあるのに、わざわざかち合う可能性のある予約済みポートの範囲を使うのは、 ルーターを使用している環境での、ポート開放に有利になるんじゃないかと、勘ぐってしまいます。 ちなみに、私のネット環境はbフレッツで、回線終端装置から直にLAMケーブルでパソコンにつながっているので、 ルーターのポート開放をしたことが無く、ルーターについてよくわかりません。 あんまり、ポート番号について、気にする必要は無いのでしょうか?
91 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 20:50:59 ] もちろん気にした方がいい。 有名どころのポートや、 過去に問題があってセキュリティで睨まれているポートは避ける。
92 名前:デフォルトの名無しさん mailto:sage [2007/09/07(金) 22:10:03 ] 攻撃力高そうなケーブルだなLamケーブル
93 名前:87 mailto:sage [2007/09/08(土) 00:20:45 ] 返答ありがとうございます。 >>92 さん、すみません。LANケーブルでした。 あと、>>91 の書き込みで、 「有名どころのポートや、 過去に問題があってセキュリティで睨まれているポートは避ける。」 と、あるので、自由に使える動的/プライベートポートである49152〜65535の間で、 ユーザーに解放させるポート番号を選択させた方がよろしいでしょうか? そうなると、なぜ他のP2P通信のゲームやソフトは、予約済みポートの範囲内で、 ポートを開放しているのかがわかりません。自分が見たところ、動的/プライベートポートで 開放しているところより、予約済みポートの範囲で開放しているところが多い気がします。 問題のwinnyも、初期は7747をあけていましたし・・・。 このスレッドの皆さんには常識なのに、こんなことをしつこく聞いて申し訳ないと思いますが、 ユーザーに開放させるポートの選択範囲は、 1024〜65535の方がよろしいのか? 49152〜65535の方がよろしいのか? どうか教えてください。 本当にすみません。
94 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 00:23:51 ] >ただ、そのポート番号を選択できる範囲が、1024〜65535の方がいいのか、 >49152〜65535の方がいいのか、わかんないのです。 個人的には、そういう妙な縛りはイヤだ。 1〜65535を自由に選択できればいいと思う。 そのダイアログが毎回表示されて、ユーザにポートを選ばせるんなら、ちょっと鬱陶しいかもしんない。 適切なデフォルト値を用意しておいて、一般ユーザはそれに触らずに済むようにして、 わざわざ変更したいと思うパワーユーザだけ、設定画面を出して変えればいいと思う。 そういう人は、自分が何やってるか解ってるだろうから、任せとけばいいよ。
95 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 01:40:17 ] >>93 多くのアプリが1024〜49151ってのは、49152〜65535にすると、本当に動的に取得してる アプリやクライアントなどと競合する可能性があるからたまたまタイミングによってサービス が起動できない可能性を嫌っているんじゃないだろうか。 1024〜49151なら、少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラー は最小化できるし、それがたとえ定義済みのポートだったとしても、サービスの運営側と すれば、自分のマシンに競合アプリが入ってなければ実質的な問題は発生しないので 気にしなくて良い。 もっとも動的といっても、例えばクライアントの使用するポート番号(エフェメラル・ポート) はOSによって違い、FreeBSDなどは確かに49152〜65535だが、Windowsの場合、 1024-5000が使用されてるみたいなので、厳密な意味での競合回避できるかは分からないし、 心理的なものかもしれないが。 でも、そのような理由で例えばデフォルトは5001〜49151の範囲から定義済みでないものを 選ぶみたいな考えもあるかもしれない。 というわけで、ポートの選択は実際にサーバを立てる人の好みの問題や、 場合によってはファイアフォールなんかとの兼ね合いもあるので、一般にきつくするのは好まれない。 ただ初心者が使う前提のアプリなら推奨値の範囲で縛りを入れておいた 方が後々のトラブル回避点でメリットはあるので、あとはアプリしだいでは。
96 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 06:44:18 ] apacheを使わないWebDAVサーバって有ります?
97 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 11:46:28 ] 動的portとプライベートportが、49152〜65535ってのは決まりごとです。 >>95 は甚だしく不当な言明。無知蒙昧。 > 少なくともマシン/OS設定のチェックをキチンと行えば、実行時のエラーは最小化できるし、 に至っては言葉を失う。
98 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 11:47:53 ] >>96 www.webdav.org/projects/
99 名前:95 mailto:sage [2007/09/08(土) 18:26:23 ] >>97 申し訳ない。 以前サーバ開発のプロジェクトにいたとき、周りがみんな この程度の認識だったので、正直甘く考えていた。 これからは気をつける、もうそんな開発の機会もなさそうだけど。
100 名前:87 mailto:sage [2007/09/08(土) 22:47:55 ] 皆さん、ありがとうございます。これらの書き込みを、いろいろ参考にさせてもらいます。 最終的にポート番号の入力ですが、入力ボックスを用意しますが、 ゲームクライアントが最初にログイン画面を立ち上げた際、49152〜65535の間をランダムに、 番号を割り振るようにします。 そこで、IDネーム、パスワード、ポート番号を決定したら、それをログインデータとしてセーブし、 以後、ソフトが立ち上がるたびに、ログイン画面の入力ボックスには、ID、パスワード、ポート番号が、 すでに入力されているようにします。もちろん、この時点で入力ボックスの中身を変更して、ログインしたら、 ログインデータも新しい方に修正されます。 ランダムにポート番号を割り振る時は、49152〜65535の動的/プライベートポートの範囲ですが、 入力できる範囲は、予約済みポートを含めた、1024〜65535の範囲を選択出来るようにします。 こんなもんでどうでしょうか?
101 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 06:23:53 ] acceptする方のportは範囲を狭めておかないと、 firewallの設定を全部開けておく必要があることになる。
102 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 06:27:17 ] 登録範囲のportを使う場合も、未登録の範囲にしておいた方がいいのではないか? www.iana.org/assignments/port-numbers
103 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 13:21:24 ] そしてUPnP
104 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 13:39:27 ] 自分のパソコンにメールサーバを入れてそれを使ってメーラーのテストはできますか? 何か無償で取れるサーバーがあればいいのですが・・・
105 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:19:30 ] ttp://www.vector.co.jp/vpack/filearea/win/net/mail/server/
106 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:59:04 ] >>103 UPnP対応ルータとかの普及率ってどっかに統計ないかな?
107 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:12:09 ] それは知りたいな でもUPnP対応とか言ってても酷い実装もあるから当てにならなかったりするんだよな
108 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:02:44 ] pollで3つのfdを管理するさんぷる どっか墜ちてませんかね? selectが使えない組込みデバイスなので ちと困ってますw
109 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 02:15:45 ] >>108 24時間やる。こなたの得ろ画像を500枚用意しろ。 そいつと引き換えにオレがサンプルを渡してやる。
110 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 02:58:48 ] >>109 約束したぞ。
111 名前:デフォルトの名無しさん [2007/09/13(木) 06:52:35 ] Windowsソケットで struct sockaddr_inの最後のメンバにsin_zeroが有ります。 このメンバの値は何に使われるのですか?
112 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 07:20:17 ] パディング
113 名前:デフォルトの名無しさん [2007/09/13(木) 07:30:17 ] そうだけど、値は全く参照されない仕様なのかな?
114 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 08:20:05 ] はい。
115 名前:デフォルトの名無しさん [2007/09/13(木) 08:35:09 ] >>114 肝心な所は知らないんだな。お前は役立たずだ。 このスレを見ている人はこんなスレも見ています。(ver 0.20) 会社で使えない奴、それはワタシ/アイツ [プログラマー]
116 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 10:33:33 ] >>111 Windowsはどうなのか知らないが、アドレスをソケットにバインドする際、アドレス構造体を 各インタフェースの関連アドレスとバイナリ比較する実装があるらしい(sin_zeroが0であることを 前提としている)。 プロトコルスタックの内部処理で何か使われているかもしれないし、sockaddr_in全体を最初に0で 初期化して使えば問題ないんじゃないのかなあ。 まあ、>>115 の言っている「肝心な所」が何なのか、ちょっと気になるけどね。 俺も役立たずかもしれないな〜。つーか、教えてくれたって良いじゃない。
117 名前:デフォルトの名無しさん [2007/09/13(木) 10:42:18 ] やっぱりそうですね。 そんなわけで0にしようと思いましたが失敗しています。 8バイトほど0を入れたいのですが実行時エラーです。 大文字なのが原因かもしれません。 SOCKADDR_IN sa; memcpy(sa.sin_zero, 0, sizeof(sa.sin_zero));
118 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 10:57:01 ] >>117 memcpyはないだろう
119 名前:デフォルトの名無しさん [2007/09/13(木) 11:22:54 ] FARとか付いたりしてるからmemcopy()が使えないってことかな?
120 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:30:16 ] memcpyがどういう関数か調べろよー ってか、forループで書けば上手くいくはずだから、 memcpyを使うこと自体が間違いって気づきそうなものだけどな
121 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:32:55 ] memsetだろうなw
122 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:34:48 ] >>116 みたいな懸念があるなら、 (そういうのは狂っていると思うが) sockaddr_in全体を0 fillしとかないと駄目だろ。
123 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 11:34:50 ] memsetだ。オマイラえらいなー。
124 名前:デフォルトの名無しさん [2007/09/13(木) 12:05:37 ] PF_INETって古すぎる情報?Linuxのこと? 72.14.235.104/search?q=cache:m1pW63yIZlYJ:pc8.fujisawa.wide.ad.jp/soi/iw98/iw98_tut/slides/17/26.html+sockaddr_in&hl=ja&ct=clnk&cd=1&gl=jp&ie=UTF-8&inlang=ja
125 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 13:01:47 ] socketを作る時のtype指定に使うのがPF_*。 sockaddrはAF_*の方。
126 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 13:11:47 ] >>125 でもさ、「なんかもうそのへんどうでもいいよ」って socket関連のAPIの仕様書に書いてあるんだよね
127 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:12:34 ] どうでもいいってことはAとPを間違って書いても値が同じになるような 値が定義されているってことかな?
128 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:20:09 ] >>127 間違えそうなところはちゃんと同じ値になってる。
129 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 14:32:54 ] それならよし
130 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 00:24:28 ] nagleかな
132 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 01:29:28 ] なんとか解決できたみたいです。 作成したスレッドにてSendTo関数を実行していたのですが、スレッドの 優先度をあげてみたところ、1秒間に240回程度の速度が出るように なりました。 アドバイスありがとうございました。
133 名前:デフォルトの名無しさん mailto:sage [2007/09/15(土) 14:23:37 ] TCPだと、sendしてもすぐには送信されずに まとめて送れるモノが無いかどうか少し待つ 実装が多いよね。優先度低いと町が長くなる
134 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 02:34:38 ] bsdのzero_copyって なんでlinuxにないの? つーかこれじゃ何もできねーよw
135 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 08:54:45 ] > 何もできねー ほう
136 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 09:08:43 ] RDMA
137 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 11:06:58 ] RDMAなんていらねーよw マシン2台間での関係でそんなでかい もん使うなんてあほだ zero_copyあればいいのに Linuxは糞だな
138 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:34:28 ] 条件小出し方式ですな
139 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 13:08:01 ] はいはい。愚痴はいいからさっさと作れよ 納期過ぎてんだから。
140 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 13:15:54 ] boostにネットワークライブラリってありますか?
141 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:55:05 ] なぁなぁ頼むよ zero-copyする方法教えてくれよ
142 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:44:05 ] >>140 1.35よりboost::asioというのが使えるようになったらしいです。
143 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:49:42 ] お前ら粘着するぞゴラ アボーンできねぇから迷惑きわまりねぇぞ 速く教えろよコラ
144 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:52:20 ] >>142 ありがとうございます 早速試してみます
145 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:19:00 ] ttp://ml.tietew.jp/cppll/cppll/article/12641
146 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 22:58:11 ] >>143 こういうノリ久々にみた。個人的に好き。 やっぱり2chはおまいみたいなのがいないとつまらんよね、まぢで。
147 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 23:36:40 ] なにをするために、zerocopyにしたいの?
148 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 01:32:33 ] いなくなっちゃったね。 zerocopyくん。
149 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:00:41 ] linux板でもみたけど、 pc11.2ch.net/test/read.cgi/linux/1146235963/820
150 名前:マルチポストですみません mailto:sage [2007/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にも同じようなしておりますが、前より詳細を書いて再投稿いたしました。 以上、よろしくお願い致します。 ttp://oshiete1.goo.ne.jp/qa3364947.html こんな状態です。どなたかわかる方はいませんでしょうか?
151 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:11:59 ] サーバ側の accept を回す処理が追いつかなくてバックログがあふれたとか? listen をいくら大きくしても、あれただのヒントだった気がするが・・・
152 名前:150 mailto:sage [2007/09/22(土) 20:15:40 ] >>151 って事は、いくらOSのほうを対応しても、listenではじかれてしまうんですか。 SOMAXCONNを指定すれば対応できたりしますかね?
153 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 20:29:08 ] そのくらい、すぐ試してみれば? あとは、余計な処理を一切省いたacceptだけのループでなら接続できるのかどうかを実験してみるとか・・・例えば while(true){ accept(fd); } みたいな。 あるいは、accept するスレッドを複数立ち上げてみるとか。 それで無理なら無理っぽいな。 OS 変更も検討してみるべきかもね。
154 名前:150 mailto:sage [2007/09/22(土) 21:24:40 ] >>153 はい。ちょい試してきます。
155 名前:150 mailto:sage [2007/09/22(土) 22:30:36 ] >>153 SOMAXCONNを指定したら、逆に成功確率はかなり減りました。170回くらいでした。 ところで、サーバーの動作は非同期通信なので、ループ処理は無理でした。 あと、スレッドは立て方がわかりませんのでなんとも・・・。 forkはUNIXだし、その前に使えないし・・・。 無知ですみません;
156 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:05:25 ] 非同期なら、accept完了がわかった時点ですぐ閉じてみたら? スレッドは、beginthreadex。
157 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:06:23 ] 非同期って WSAAsyncSelect のやつかな シングルスレッドサーバだと他のソケットを read したり write したり データを処理したり色々構ってやってる間は当然 accept を呼べないから、 処理に時間がかかってるようなら、やっぱりその間に接続要求がたまりすぎて溢れるんじゃないかと
158 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:09:17 ] Winsock1.1+WSAAsyncSelectでハイパフォーマンスなサーバを書こうとするのも アレだが XP Home Editionというのも終わってるだろ。 何が悲しくてクライアント用のOSで1000のオーダーの同時接続数をさばかにゃ ならんのだ。 せめて2003サーバに汁。 ハードもそれなりにおごれや。 で、使うべきはIOCPな。 WSAAccept()をポストし続けるスレッドも専用で回せ。
159 名前:150 mailto:sage [2007/09/25(火) 02:08:20 ] >>156 とりあえず、やってみます。beginthreadexは調べておきます。 >>157 その線が一番怪しいんですが、TCP接続制限をBIOTで20000に設定して、 listenも20000にしているんで、溢れるという事が無いように思えるんですが・・・。 listenのバックログの最大数があるらしいんですが、まだ調べきれてなくて わからない状態です。 >>158 サーバーはまぁ、色々と事情が…; でも、論理的にはTCP接続制限をはずしているんで、そこでacceptが失敗するのは OS以外のことだと思うんです。 私が知らないだけかもしれませんが、XPと2003サーバってサーバーマシンとして 使用した際に何か違いってあるんでしょうか?
160 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 02:15:11 ] >>159 そう思うなら、Linux入れて同じハードでほぼ等価の コード作ってためせ たぶんおきねーからw
161 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 03:29:59 ] >>159 XP Homeで3000ソケット接続を試してみたけど、特に問題なく接続できたよ。 1,環境が良く分からない。サーバーはマルチプロセッサマシンなの? 2,クライアントでconnetを行うときにSleep関数を入れてconnectの接続間隔を長くしてみては?
162 名前:デフォルトの名無しさん mailto:sage [2007/09/25(火) 06:32:30 ] >>159 最小限のソース晒してくれ 時間の無駄だ
163 名前:デフォルトの名無しさん [2007/09/26(水) 09:14:56 ] 無線LANに接続しているPCの数を取得するにはどうすればよいのでしょう?
164 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 10:12:09 ] >>150 acceptの処理時間とか無関係。 サーバのOSでTIME_WAITでポートが枯渇してるだけ。 TIME_WAITについて深くしりたけりゃぐぐれ。 めんどくさけりゃSO_REUSEADDR。
165 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 10:15:56 ] >>163 a. 無線LANのWebからステータスを得る b. SNMP,MIBでぐぐーる
166 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:33:20 ] サーバ側のポートが枯渇するの? サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ?
167 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:43:38 ] ちゃんとした通信手順を踏めば即座にポートを解放してくれる 行儀の悪い通信をすると TIME_OUT まで待ってから解放される TCP/IP の仕様だから Linux でも Windows でも同じコードなら やっぱり通信数に制限が出るような気がする
168 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:53:21 ] >>164 > ポートが枯渇してるだけ。 馬鹿丸出し。
169 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:59:52 ] SO_REUSEADDRは再びbindするときの話だっけ。 >>150 とは関係なさそうだな。
170 名前:デフォルトの名無しさん [2007/09/26(水) 13:16:22 ] acceptを終了するにはどうしたらいいの? acceptで待機中の時に別スレッドからsocketcloseを呼び出したら WSAEINTR (10004) ? 意味 : 関数呼び出しに割り込みがありました。 ? 説明 : ブロック操作は WSACancelBlockingCall (Wsapiref_704y.asp) の呼び出しによって中断されました。 が呼ばれるんだけど、acceptの終了方法はこれであってるの? winsocket2.2
171 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 13:36:14 ] >>170 WinsockならそれでOKのはず
172 名前:デフォルトの名無しさん [2007/09/26(水) 14:01:34 ] >>171 そうなんだ ありがとう〜
173 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 15:53:48 ] >>166 >サーバ側のポートが枯渇するの? >サーバ側のポートはずっと同じで、クライアント側のポートが変わるだけじゃ? その通り、枯渇するのはクライアント側のポートだった。 ↓あたり。 ttp://www.softlab.ece.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7 ttp://mikilab.doshisha.ac.jp/dia/research/report/2002/0408/005/report20020408005.html ttp://d.hatena.ne.jp/Kazzz/20070207 ま、結論としてはSO_REUSEADDR。
174 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 16:42:19 ] ということはconnect内部のbindで失敗するとWSAECONNREFUSEDが返ってきちゃうのか。 原因に気づき辛そうで厄介だなあ。
175 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 20:06:08 ] >>173 クライアント側でユーザーポートが枯渇するとWSAENOBUFS (10055)が返ってくるんだけど。
176 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 00:13:10 ] おまえら, なんかトラブったときに TCP のステートダイアグラム 見ないでプログラム修正とかしてるのか?
177 名前:150 mailto:sage [2007/09/27(木) 10:53:38 ] 一向に解決しなかったけど、今の状態で妥協する形になりました。 助言くれたかたサンクスです。 >>176 TCP のステートダイアグラム とは?
178 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 11:12:53 ] www5d.biglobe.ne.jp/~stssk/rfc/rfc793j.html Figure 6. TCP Connection State Diagram
179 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:06:29 ] tools.ietf.org/html/rfc793#section-3.2 か、あるいは簡略化されているが↓のも見やすいよ www.atmarkit.co.jp/fwin2k/network/baswinlan016/baswinlan016_03.html
180 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 08:29:23 ] >>179 > 簡略化されているが あかんやん
181 名前:デフォルトの名無しさん [2007/09/30(日) 07:42:09 ] 複数あるNICのインタフェース(またはローカルIPアドレス)を指定してソケットを オープンしたいのですが、方法はありますか? Windows XP SP2
182 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:21:40 ] bind