ネットワークプログラ ..
[2ch|▼Menu]
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アドレス)
を指定して通信させたいのです。


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

4336日前に更新/263 KB
担当:undef