[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 03/27 11:55 / Filesize : 263 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



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/


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

76 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 17:34:55 ]
>>74の優しさに全米が嫉妬

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


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

79 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 00:52:42 ]
それが極悪ならfgetcを繰り返すのも極悪になるぞ

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

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

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

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

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)が返ってくるんだけど。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<263KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef