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/
42 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 08:16:28 ] >>41 ググるとほぼトップに来るが? www.forest.impress.co.jp/lib/inet/servernt/server/anhttpserver.html
43 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 09:37:55 ] >>42 杜かw
44 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:50:34 ] >>42 ありがとう。助かったよ。
45 名前:デフォルトの名無しさん [2007/08/26(日) 23:22:07 ] VB6.0のWinsockコントロールを使っているのですが、うまくいきません。 教えてgooでも質問してみたのでマルチポストになりますが、返事がこないので改めてこちらで質問させてください。 助言をどうかお願いします。もうAPIのWinSockの方を使った方がいいでしょうか? 以下が自分なりに纏めた今の状況です アンチウィルスソフトは導入していない。また、ファイアウォールを外している。 ルーターの設定で、ポート転送->使うポートの転送先を自PCのプライベートアドレスにしている。プロトコルはTCP/UDP。TCPのみにしても結果は変わらず。 ルーターで設定したポートでwww.cman.jp/network/support/port.html で検査するとホスト=***.**.**.*** ポート=***** にアクセスできました。と出る。 ルーターで設定していない他のポートで試したら失敗する。 また、検査したときにサーバー側ソフトでは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 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 23:28:34 ] ルータの内側から、ルータの外側用アドレスでアクセスしてみたってこと?
47 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 23:32:33 ] っwireshark あとルータのログも見とけ
48 名前:45 [2007/08/27(月) 00:50:11 ] >>46 そうです。もしかしてできないんですか? >>47 見てみます。
49 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 07:46:30 ] 中から来たパケットを逆納豆テーブル見て 折り返してくれるかどうかはルータによる。
50 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:59:15 ] ネバツイテ 折り返そうしても出てこないことあるよなぁ
51 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:24:10 ] あるある
52 名前:デフォルトの名無しさん [2007/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 [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:11:47 ] とにかくしね
56 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:39:25 ] >>54 recvをループさせるのはrecvが0を返すまででいいんじゃない?
57 名前:52 mailto:sage [2007/08/31(金) 01:14:50 ] >>54 ありがとうございます。大変勉強になります。 4の回答が少しわかりづらいのですが・・・^^; イベントオブジェクトをもう1つ用意して、WSASetEventでシグナルにするとか・・・? >>56 ありがとうございます。 recvからは0が戻るか、WSAEWOULDBLOCKが発生したらrecvを呼ぶのを中断して 再度WSAWaitForMultipleEventsで待てばよいでしょうか? 現状はそうしていますが、これで良いのか判断つかなかったので・・・。
58 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 02:37:49 ] つーかさ、1ソケットで1スレッドを占有するなら 本来、ブロッキングソケットで足りるんだよ。 イベントなんか用意する必要も無く。 もちろん、鯖がsendでブロックしている間にもデータが送られてくるような 作り(プロトコル)なら話は変わってくるがね。 で、それで済むところをわざわざEventを使ってるのに 終了シグナルと両方待たなくてどうするのさ。
59 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 03:16:58 ] ごめん。 56だけど、recvが0を返すまでってのはブロッキングソケットの終了待ちロジックだ。 ノンブロッキングソケットの場合、受信データがなければエラーになって WSAEWOULDBLOCKを示す。なので、0は基本的に返らないが、接続終了時には 0を返す場合がある。 なので、>>57 のようにループして両方判定しておけばOK。 ブロッキングソケットの場合は、受信データがなければ受信データがくるまで ブロックする。だから、ブロックしたくなくて、イベント処理をしているなら、 recvのループはまずくて、recv後は必ずFD_READを待たなければいけない。
60 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 11:53:08 ] メンテしやすい方法
62 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 13:01:07 ] キューにたまるのを待って send なんてしなくても、キューにためず直接 send しちゃっていいんじゃないかと思うけど。 あと、select は扱えるソケットが 64 個までとか変な制限がある場合があるので、いちおう確認したほうがいいかもしんない。
63 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 21:14:35 ] select自体は、あらかじめFD_SETSIZEを128とかに 定義すれば、その制限からは外れるみたいな。
64 名前:デフォルトの名無しさん mailto:60 [2007/08/31(金) 21:52:43 ] スレッドはソケットごとに2個づつ使うので、selectは1socketしか待たないのですよ なので、スレッドが大量にできるために、必要の無いスレッドはなるべく休止状態にしておきたいのです。 キューに入れるのは送信するのが10GBとかなのと、ヘッダをつけたりしているので、 send途中であふれた場合にどっかに取っておく必要があるのと、ある程度バッファに入れたら送信自体を停止する必要があるため。 スレッドを大量に作るのは定石とは違うのかも。
65 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 21:58:22 ] pollでひっぱれよ
66 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 22:04:35 ] FD_SETSIZEって変更できたっけ?
67 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 22:06:21 ] sendfileしてあとはシラネ、みたいな。
68 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 23:47:58 ] >>64 そんな設計なら普通にブロッキングモードにしとけば send は送信バッファが一杯になったら空くまでブロックしてくれるし recv は受信データが無ければ来るまでブロックしてくれる select も独自キューも使う意味なし
70 名前:デフォルトの名無しさん mailto:60 [2007/09/01(土) 02:08:54 ] >>69 スレッド・同期スレッドの場合には、sendはソケット内のバッファが開くまでブロックすることは期待しているけど、 送信するデータが無い場合にはブロックしようが無いので、送信データが来るまでビジーループにするわけにも行かないので、 キューを作ってそれが空じゃなくなるのをコンディションなどで待つ必要があると思うのですが。 受信側はそのとおりになってます。実際は受信データがきたら ヘッダを解析してまとまりごとにデータを纏めて メインスレッドにイベントを投げて受信したデータを処理しています。 現在4種類とも実装して、設定で切り替えられるようにしていましてどれも動いてはいるのです。 他にもWinsocksだと非同期IO(OverlapedIO/sendmsg)などで実装するなど色々サンプルはみているのですが 実際どれがいいのかは環境依存? スレッドを大量に立てると高負荷になるし、 タイマーでポーリングすると、タイマー内で処理をする量の制限を掛けるため、 性能がいまいちな場合もあります。 ちなみに、現在のキューは2つの同期制御付きキューを使って、 片方を処理データに、もう片方を未使用のメモリ用に使ってます。 これで、送信データを設定する場合に未使用のメモリの部分に直接ファイルなどから読み込むことにより、 キューへのコピー処理も起きないようにしています。 受信データは未使用メモリのキューから取ってきて、使用中のキューにヘッダ+データが来た時点で入れて処理しています。 最初は同期ソケット+スレッドか、非同期ソケット+非スレッドの2種類になるのかと思ってたのですが、 実際は>>60 に加えて受信、送信スレッドそれぞれスレッド無しかどうかも独立に扱えるようにはなっているのです。 でも、結局いろいろ作ってもどれでも変わらないのかも???
71 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 08:37:43 ] Windowsの場合、性能的にはIoCompletionPortを使うのがベストと聞いた。 IoCompletionPortは非同期ソケットをベースとするけど、 扱うソケットが増えてもイベントやスレッドの生成自体を少なくできる、らしい。
72 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 11:06:50 ] OVERLAPPEDを使うとSend/Recvで扱うバッファをユーザーが先に指定できるので データの送受信にコピーが要らない。(逆に言えばその辺の管理をこちらがやる) 更にIoCompletionPortでスレッドの管理をやらせると利用可能な最大スレッドも指定できる ・・・という認識だったけど。
73 名前:デフォルトの名無しさん [2007/09/01(土) 16:32:00 ] ネットワークケーブルで繋がったパソコンを遠隔起動させるプログラムを作りたいのですが、 そのために必要なマジックパケットがどのようなものでどのように送信するのかが分かりません どなたかご存じないでしょうか? やりたいこと自体は単純で、マックアドレス指定したパソコンの電源を入れるだけです (フリーソフトのWakeUpみたいな感じです) ちなみに自分が開発に使用している言語は純粋なC言語です
74 名前:デフォルトの名無しさん mailto:sage [2007/09/01(土) 16:48:35 ] >>73 wakeonlanでググレカス
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というのが使えるようになったらしいです。