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/
577 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 09:06:14 ] IEだったら↓に自動構成スクリプトのアドレスが入ってる HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\AutoConfigURL 後は普通に読めばいいんでないの
578 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 16:42:41 ] ProxyServerは?
579 名前:570 mailto:sage [2007/12/05(水) 21:43:43 ] 返答遅くなってすみません。 また、いろいろアドバイスしていただきありがとうございます。 SSlですが、自分のCGI参考書ではグラフィックカウンターを作る説明しかなく、 これでどう暗号化するか分かりません。 RadiusもWikipediaで調べましたが、自分の頭ではチンプンカンプンでした。 ゲーム自体は、クライアント同士をP2P通信でつなげて遊ぶもので、 ipとport番号のやり取りのマッチング部分だけ、webサーバ上の cgiで、C/Sで行います。 p2p通信で、しかも、マッチングにCGIを使うので、クライアントにも、 webサーバにもIPやport番号は知られるのは当然なんですが、 よく「iPとport番号は知られるとまずい」とか、 「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、 webサーバから相手のIPとport番号の受け渡しのさい、暗号化する必要が あるんじゃないかと思ったのです。 開放するport番号はプライベートport番号の間でなら各クライアントが 好きな番号を開放するようになっているので、49151番以前のportは 開くことはありません。>>575 さんがいうように、 IPとport番号をそのまま受け渡しても、心配する必要は無いんでしょうか? なんか文章が変ですみません。
580 名前:デフォルトの名無しさん mailto:age [2007/12/05(水) 22:21:21 ] なんでNULLが返されるんだぁああぁぁ!!!! ひぇぇぇぇうぇぇええ!!!! すみませんでした。 もういくら考えてもわかりません。 お願いします。この通りです!!!
581 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 22:38:20 ] SSI と SSL は違うよっ
582 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 23:18:57 ] 暗号化する価値はほとんど無いな。 その手の奴がパケットの中身を見るまでもなく、 セキュリティソフト(ファイアウォール)が警告を出したりするから 一般人にだってIPとPortが分かるぞ。
583 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 00:06:44 ] というか、誰でもそのCGIを叩いたらIP:PORTがわかるわけで、 通信路を暗号化する価値がないような。
584 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 09:21:22 ] プロクシーサーバを作るとしたら、RFCの何番読めばいいんだっけ?
585 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 09:40:04 ] つ HTTP 1.1
586 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 14:27:33 ] >>584 rfc2616
587 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 05:05:39 ] Cで分割ダウンロードってどう実装すればおk? わざわざパケット操作まで階層下らなきゃいけないのだろうか…。
588 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 05:45:37 ] WinならwinmmのHttpQueryReauestでも使ってろタコ それ以外の環境ならsocket一手
589 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 05:45:59 ] wininetだたorz
590 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 07:49:23 ] >>588 > それ以外の環境ならsocket一手 libhttp, libcurl, libneon, libsoup 好きなのをどうぞ
591 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 11:31:31 ] >>590 UNIXだぜ。 socketをどうすればいいのか知りたいのだ>< ん?ひょっとしてlseekが効くのか…?試してないが…。 >588 libhttpにはそんな便利なAPIがあるのか…ぐぐってみるわ。 でもどうやって実装してるんだ?かなり低階層まで降りてそうだ。
592 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 13:00:47 ] httpの分割ダウンロードってrange指定したrequest並列に投げるだけだろ…
593 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 22:19:25 ] TCPのcwndとssthreshの値をみる方法ってない? 環境はfreebsdです
594 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 22:49:17 ] >>577 あんがと。だけどスクリプトの場合 Javascriptで 条件式とか入ってる場合があるから困る。 今はsocketでデーター出してるけど 素直に、NETかIEコンポのライブラリ経由でデーター 出した方がいいんだろうか・・・
595 名前:デフォルトの名無しさん mailto:sage [2007/12/09(日) 22:55:02 ] >>579 >よく「iPとport番号は知られるとまずい」とか、 >「ネットゲームの通信は暗号化しとけ」みたいなことが書かれるので、 うちは、こんな事言ってる奴が多いので実害がなくても 簡単なスクランブルかけてる。少なくともテキストが読めない程度の。
596 名前:デフォルトの名無しさん [2007/12/09(日) 23:17:21 ] できあいの物を利用したお手軽マッチングサーバー〜〜 用意する物 ■ WEBサーバー そこらのHP公開できるレンタルでOK ■ FTPクライアントライブラリ、MFC.デルファイでもOKです 1)ログイン時 自分のIDをファイル名にしたテキストファイルをFTPでアップします テキストの内容は自分のIPとポート番号です 自分のグローバルは確認君系のCGIで調べます 好みにより書き込むテキストは適当にスクランブルしましょう 2)接続時 接続したいIDの名前のテキストファイルをダウンロードします。 NotFoundの場合は「該当するIDは・・・」とか適当に出します 追記 余裕があれば UPnPで使用ポートをオープンしましょう UPnPはXML+Socketで行えばSP2のチェックマークを無視します 上級偏としてStunもありますが昨今使えませんので ゲーム程度ですとSkypeを使うのも吉です 結論 SkypeP2P使え!!
597 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 23:29:14 ] va_argsってスレッドセーフ?
598 名前:デフォルトの名無しさん mailto:sage [2007/12/12(水) 23:41:40 ] 実質自動変数(引数)へのポインタという意味合いの代物だから、 スレッドセーフ。もちろん、そのまま他のスレッドに持って行ってはいけない。 で、どこがネットワークプログラミングなんだろ。
599 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 00:05:27 ] ポートを解放しないとできないことっていったい何なんですか?
600 名前:599 mailto:sage [2007/12/13(木) 00:28:07 ] なんか曖昧ですね。すいません。 例えば、htmlサーバーではポート80番は常に両方向解放されていて、 (他の問題がなければ)クライアントからのコネクションに成功しますよね。 クライアントのWAN→クライアント自身方向へのアクセスは許されていませんが、 サーバーにリクエストを送ることもその結果を処理しブラウザで表示することもできるわけです。 そこで質問なのですが、クライアントのWAN→クライアント自身方向への アクセス解放(ポート解放)をしないとできないことというはいったい何なのでしょうか?
601 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 01:29:06 ] >ポートを解放しないとできないこと LAN内のPCのポートとルータのWAN側ポートが関連付けられてないから WAN側からの接続を受け付けられない
602 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 05:39:29 ] >>600 FTPのPORTモードとか
603 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 09:35:00 ] ってか自分で言ってるじゃねえか ポートが開いてないとApatch起動しても外からアクセスできない
604 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 09:57:50 ] Apacheはサーバーなので質問の主旨とは外れます
605 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 10:39:33 ] >>600 クライアントのWAN→クライアント自身方向への接続ができない
606 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 16:14:08 ] >>601-605 TCPならクライアントへのconnectに失敗、 UDPだとsendに失敗(?)ということですか。 サンクスです。
607 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:25:34 ] ちげえええええええええええええええええええ connectすんのはクライアント側だ サーバはacceptだ UDPならrecvfromだ 根本的にソケット関係のマニュアル読み直した方がいい
608 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:49:39 ] たぶんクライアントの定義が違うんだよ
609 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:50:56 ] >>607 「クライアントがWAN側からの接続を受け付けられない」ということは、 サーバーがクライアントに対してconnectするときに失敗するという意味ではないのですか?
610 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 18:53:38 ] OK。落ち着け ネットワークプログラミングにおいて 「クライアント」は「接続しに行く側」 「サーバ」は「接続を受け付ける側」 だから
611 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 21:02:51 ] >>609 あなたのサーバとクライアントの定義をききたいよ
612 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 02:26:33 ] UDP は受け取る側がクライアント、というプロトコルも多いな・・ RTP とか
613 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 08:29:38 ] >>611 俺は>>609 ではないが、 ・LAN内のPC → クライアント ・WAN側のPC → サーバー だったりしてな。
614 名前:デフォルトの名無しさん mailto:sage [2007/12/14(金) 16:44:41 ] >>610 ,611,613 自分の解釈では ・サーバーはサービスを提供する側 ・クライアントはサービスを享受する側 ですね。 ただ元の質問は、 「サーバーのポートが解放されていてクライアントがポート0の場合、何かできないことがあるのか?」 というものなので、ここではこの文脈にそって言葉を使っています。
615 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 00:42:20 ] 元の質問ってそんなのだっけか? というかクライアントなのに自分でポートを開けておく必要なんて無いよな サービスを提供するためにポートを開けておくわけだし
616 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 23:39:10 ] クライアントからport80で接続されているときに そのconnectionを使って逆にサーバー側から クライアントに突撃する方法を聞いてるんじゃない?
617 名前:デフォルトの名無しさん mailto:sage [2007/12/16(日) 22:15:21 ] たんにP2Pの存在をしらないんじゃ?
618 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 04:14:29 ] sshでトンネル作ってport forwardingしたらなんでもやり放題だお
619 名前:デフォルトの名無しさん [2007/12/19(水) 10:14:58 ] netstatなんかで見れるような ソケットの 現在のステータス(ESTABLISHEDとかTIME_WAITとか) って、getsockoptでどうやって取得するの?
620 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:58:25 ] >>619 connectしてるかどうかくらいはわかるけど、普通見れない。 netstatは(setuidされていて)kmem見てたり、/proc/net/ 見てたりしてるだけ。
621 名前:デフォルトの名無しさん [2007/12/19(水) 22:00:37 ] epollやkqueueはなぜ高速なのか、レガシなAPIとの比較で3行で教えてください。 特にepollに興味があります。
622 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:58:25 ] /dev/poll を忘れんなよ
623 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:21:11 ] 要するに状態を監視したいソケット連中ってのは、selectの呼び出し毎に 大きくかわったりはしない。なら、引数でソケット全部を毎回渡すよりも、 ハンドル経由で差分更新したほうが、処理は高速になるって話。
624 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:23:20 ] 計算量で語ってほしい
625 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:15:53 ] selectなら o(n) epolなら o(1) ってことだろおうぉあ
626 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:22:49 ] 実際は、イベント発生頻度Mにも比例するから、 selectはO(N*M)になる、のかなー? epoll系はO(M)で。
627 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:23:27 ] >>623 621とは別人です。 10行になっても良いので馬鹿にもわかるようにお願いしますm(_ _)m 「大きくかわる(大きい?小さい?)」「ハンドル経由(ハンドル?)」がわかりません
628 名前:デフォルトの名無しさん [2007/12/20(木) 00:27:48 ] klabという会社の勉強会資料が読みやすかったような記憶。 /dev/pollってなんだ?
629 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 00:29:30 ] そらりすのやつじゃねーの。/dev/poll。 だいたいこのペーパー読めばいいんでね。まあ、英語読めないオチだろうけど。 people.freebsd.org/~jlemon/papers/kqueue.pdf
630 名前:デフォルトの名無しさん mailto:sage [2007/12/20(木) 01:27:08 ] >>626 それMは定数扱いでいいですやん
631 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 02:23:52 ] 京急の特急に乗ればいいことが解った
632 名前:デフォルトの名無しさん [2007/12/22(土) 23:54:42 ] winsock2.org/samples/Ch09/GETHTTP2/gethttp2.cpp ローカルホスト上のデータを最大で16000byteずつしか読み取れないんですが、これはなぜですかね?
633 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:07:42 ] >>632 たぶんTransfer-Encoding: chunked
634 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:23:33 ] HTTPじゃないから、chunkedは関係ない。 どっちかってーと、MTUの話。 というか、ローカルだろうと、TCP経由で 一度に全部読めると思うのが間違い。
635 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:26:04 ] なんだそうか
636 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:16:30 ] 頭痛いわ
637 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 04:25:19 ] つ バファリン
638 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:33:52 ] 股間が疼くわ
639 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 11:40:07 ] つ クラビット
640 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 20:44:13 ] Winsockを使い ttp://localhost/1.html ttp://localhost/2.html 一つのアプリケーションが この二つのURLのダウンロードを並列に処理する事は可能ですか?
641 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 21:03:34 ] 可能です マルチスレッドとかノンブロッキングとかIOCPとか調べるよろし
642 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 21:46:05 ] ありがとうございます。
643 名前:デフォルトの名無しさん [2007/12/24(月) 00:35:48 ] 非同期モードと非ブロッキングモードはどう違うのですか?
644 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 00:51:00 ] まずお前がその二つをどう理解しているかを述べよ
645 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 01:17:50 ] たとえば読み込み指令を出して、そのときには読むべきデータが無かったとしたら、 ノンブロッキングはすぐに諦めて帰ってくる。 非同期は何かが読めるまでバックグランドでがんばってくれる みたいな違い。
646 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 01:37:02 ] その理解でいいんじゃない? 順序としては ブロッキング → ノンブロッキング → 非同期I/O と進んできたんだけど これ以上詳しく知りたければ実装を調べるしかないのではないかと
647 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 07:03:17 ] リクエストとリプライが同時でない=同期的でないのが非同期。 リクエストを出した後、リプライは後から別の手段で得る。 一対一に対応してないこともある。リプライが続々とやってくるなど。 ノンブロッキングは同期的だけど、データ取得を諦めることがある。 その時でも「データねーよ」とのリプライが同期的に得られる。 非同期はそうではない。
648 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 11:57:28 ] 使い分けで 同期-ブロッキング 多重化-ノンブロッキング(select or poll) 非同期-シグナル駆動I/O or 非同期I/O とあったのですが、 これで合っていますでしょうか?
649 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 12:05:17 ] >>648 > 非同期-シグナル駆動I/O or 非同期I/O も多重化出来るだろ。
650 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 15:49:15 ] たじゅーか! と書くとほほえましいな
651 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:32:06 ] Linuxでクライアント書いてるんだけど closeが完全に終わるまで待つにはどうしたらいいかわかんないので 誰か教えれ
652 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:45:11 ] shutdownで半クローズ → 相手にEOFが届く → 相手がソケットを閉じる → EOFが来る → こっちも閉じる とかじゃだめなん?
653 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:30:05 ] >>652 だめじゃない!だめじゃないぞ!いける!
654 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:43:09 ] それはさ、こっちの最後の送信結果が、closeしちゃうと判らなくなるからで、 別にこっちが送信してないなら勝手にcloseして終わりにしたらいいじゃん。
655 名前:デフォルトの名無しさん [2007/12/25(火) 14:18:46 ] 非同期モード、非同期イベントを利用して localhost上のバイナリファイルをダウンロードしようとしているのですが、 ブロッキングを起こしてしまいます。 非同期モードを解説したサイト等ありましたら、 教えてほしいです。
656 名前:デフォルトの名無しさん [2007/12/25(火) 14:54:45 ] DNA.TV⇒デジネイション.テレビジョン⇒ステージ.オン.エアー <IE7テストバージョン> dnatv.atspace.com/?S&1912501&166?S&1966612&280?S&1928546&28@HiSpeedVisionStageOnAir
657 名前:デフォルトの名無しさん [2007/12/25(火) 18:23:18 ] WSAAsyncSelectでググったらいくらでも出てくるじゃねぇか
658 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:24:13 BE:295671825-2BP(312)] ここは書き込めるようだな
659 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 18:26:49 ] というか、その「ブロックを起こす」コードを晒してみたら?
660 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:31:54 ] 自己解決しました。 ありがとうございます!!
661 名前:デフォルトの名無しさん mailto:sage [2007/12/25(火) 19:45:33 ] どういたしまして
662 名前:デフォルトの名無しさん [2007/12/25(火) 23:27:54 ] ARCNETは、スレ違いですか?
663 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 00:02:00 ] いいや、違わない なんなら422でもCANでも構わない
664 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 16:02:49 ] winsock2.org/samples/Ch04/ChekMail.c このような非同期通知を利用して、アプリケーションを作成しているのですが、 こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、 どのようにしたらできますでしょうか?
665 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 16:47:16 ] >>664 >こちらからサーバにデータをPOSTする処理をfor文を使い連続でしたいのですが、 できません。それが非同期処理。 キューなりリストにPOSTするデータを入れておいて、 FD_WRITEが取れたら書き込む。エラー処理も忘れずに。 どうしてもforでまわしたいなら、 スレッド分けて、WSAGETSELECTEVENTするスレッドで、FD_WRITEがきたら、 イベントをセットし、POSTするスレッドのfor内でそのイベントをWaitForSingleObjectするとか。 でも、それなら最初から同期処理で良い。
666 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 21:10:08 ] とりあえず、-1がもどってくるまでは無条件に書き込めばいいんでないの。
667 名前:デフォルトの名無しさん [2007/12/31(月) 15:59:49 ] 教えてください。 サーバソケットでTCPの10〜100バイトの可変長データを受信する際、 そのデータのレングスが先頭2バイトにある識別子で判断できる場合って ・まず先頭2バイトをrecvする。 ・識別子を判断して残りのバイト数をrecvする というのが一般的なのでしょうか? recvの第3引数に1500バイトくらいの十分余裕な値を指定すると 勝手に1データの終わりを検出してリターンしてくれるものなのでしょうか? 要は連続してデータが飛んでくる場合に 1データの区切りをrecv1回で済むのか、2回に分けないといけないのかが 知りたいです。 Linux環境です。
668 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 16:42:47 ] 読みたいなら読めばいい。場合によっては、区切りを検出してくれることもある。 ただ、「1500バイトrecvをかけて、1400バイト読んだ。ヘッダのレングスは500バイトだったよ〜」 ってときもあるから、500処理したあとに次のヘッダ処置にいかないとダメだし、 その逆の、「ヘッダは500バイトあるっていったけど、recvで戻ってきたのは200バイトだった」 って言う場合の処置もいる。
669 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:01:45 ] >>668 レスどうもです。 頭悪くていまいち理解できてないんですが、受信バッファに +---------- |ABCD・・・・ +---------- と入っていて A=50バイト B=60バイト C=70バイト D=80バイト だった場合、1500バイトでrecvかけたら ABCDいっぺんに読めてしまうってことですよね?
670 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:23:50 ] >>669 >>668 じゃないけど、recvの第三引数に1500を指定するって事だよね? それならABCD全部読めるかもしれないし、読めないかもしれない。 もしかしたら、Aの最初の5バイトしか読まないで返ってくるかもしれない。 完全に運の世界。 まあ受信バッファに本当にABCDが全部入ってるんなら全部1度に読めるけど、 プログラム側から受信バッファの内容を知る事はできないからやっぱり運。 だから普通は指定したバイト数読むまでrecvを何回も呼んできちんと読むような関数を作る。
671 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 23:30:50 ] >>669 面倒だから、fdopenしてストリーム入力使いなよ。
672 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:39:53 ] >>670 レスありがとうございます。 recvするたびにA、B・・・とデータの区切りごとにリターンしてくれる ということでは無いんですね(そう都合よくはいかないか・・・)。 >>671 別の方法もあるということですか。 勉強してみます。ありがとうございました。
673 名前:デフォルトの名無しさん [2008/01/03(木) 17:15:51 ] WindowsでIPヘルパを使っています。 複数のネットワークカードが刺さっている場合の取得順序について。 GetInterfaceInfo()での取得順序は何に依存するのでしょうか? バスの位置でしょうか?
674 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 18:45:06 ] select をつかって TCP 23ポートを開いてATコマンドを処理するプログラムを書こうとしている初心者ですが select の動作がいまいち理解できなくて難儀しています。 サーバープログラムの場合 listen したファイルディスクリプタを readfds 集合に入れて select を実行した場合、 select が戻った時に readfds に listen 用 FD があると、ちょうどクライアント側が connect したタイミングなので その場合accept してあげれば良い。のは大体分かりました。 で accept した FD を即座に select の readfds集合 と writefds集合 にいれているのですが、この場合 select が戻った時に readfds に accept した FD がある場合は、受信準備OKな状態で、この時に read すれば 受信データを得ることができて、 writefds に accept した FD がある場合は、送信準備ができた状態で、 write してあげればデータを送信ができるんでしょうか?この時、実際受信したデータがないか、送信するデータがな い場合もあると思うのですが、そういう場合は速やかに再度 select すれば問題ないですよね。。 このように理解しているのですが、何分うまくいかないのでどこか間違ってそうなのです。
675 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 19:11:44 ] selectのwritefdsというのは、「現在送信バッファに追記出来る状態ですよ」って のに近い。(まあ、connectの結果を見るのにも使えるけど。) 普通は、readfdsだけ仕掛けておいて、戻ってきたらrecv発行->受信処理。 なにか書きたくなったら、すぐsend。-1(EWOULDBLOCK)が戻ってきたら、 続きを送信するためにwritefdを仕掛けて待機。writefdが立てば続きを送信。
676 名前:デフォルトの名無しさん mailto:sage [2008/01/08(火) 19:48:51 ] >>674 受信準備OKなものは、受信データがないってことはあんまりないと思うけど。 送信準備OKなものは、送信するものがなければ writefds から外すべき。 送信可能(送信バッファに空きがある)である限り、常に反応し続ける(selectが即座に返る)。
677 名前:674 mailto:sage [2008/01/08(火) 20:58:49 ] なるほどサンクスです。write は失敗した時だけ writefds にいれとけばいいのですね。 ずっと select が返る状態だと、使う意味がなくなりますもんね。。
678 名前:674 mailto:sage [2008/01/09(水) 18:52:35 ] 連投すいません。 考えたのですが write( send ) はやりたい時に行い、失敗したら送れな かったデータをバッファに置き次回 select で writefds をセットする。。。 。とすると、write を行ったのが select を行っているスレッドであれば、se lect が戻った後に write なのでいいのですが、別スレッドで write すると select しているスレッドは受信データがない限り戻らないので、即座に続 き送信できませんよね。 select はタイムアウト設定できるようなので、タイムアウト1秒として、 送信するデータがあれば writefds をセットし select で戻れば送信として は駄目なんでしょうか、、そういうソース見たことありませんが。。
679 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 19:06:45 ] select使ってるのに、何でスレッドが分かれてるの? まー、IPC用にソケット1本確保して、同時にselectで見張る手もあるけど、 writeが競合するとか嫌な事態になりそうだなー。
680 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 19:59:29 ] 適当なシグナルを発生させてやればEINTRで帰ってくるんじゃないかね だめだったら679のようにselect起こす用のsocketpairかpipeかなんかを作って一緒に待たせておけばいい writeはまぁmutexするしかないだろ
681 名前:デフォルトの名無しさん mailto:sage [2008/01/09(水) 22:29:12 ] おお、シグナルやパイプを使えばうまくいきそうですね。select使ったコードを探していた時に見たことあります。 いろいろ教えてもらったいまなら、理解できそうです。。 いろいろ、ありがとうございました。
682 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 14:54:36 ] WinsockでWSAAsyncGetHostByName以外に非同期で 名前解決をする方法があれば教えて下さい。 コンソコールアプリからだと使いにくいです。。。
683 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 15:53:40 ] >>674 はtelnetプロトコル(rfc854)の存在を知っているのだろうか? 結構面倒なネゴシエーションが必要。
684 名前:デフォルトの名無しさん [2008/01/12(土) 16:46:36 ] 何が使いにくいん?
685 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 16:51:39 ] httpしか繋げたことないから難しく見えるんじゃね
686 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 17:27:19 ] >>682 スレッド起こして解決できたらイベントで通知
687 名前:682 mailto:sage [2008/01/12(土) 18:07:52 ] >686 書き忘れていましたが複数のスレッドで同時に解決できるようにしたいんです。 でもgethostbynameだと同時に使えないから1つずつ解決することになって、 それはちょっと嫌だなあと。タイムアウトするまで次の解決ができないって状況は避けたい。
688 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 18:10:27 ] gethostbyname2_rとかなかったっけ?
689 名前:デフォルトの名無しさん mailto:sage [2008/01/12(土) 19:48:04 ] たとえばadns使うとか。 NetBIOS系の名前解決はしてくれないけど
690 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:01:33 ] クライアント・サーバ間を共通鍵で暗号通信をしたいのですが, 通常のクライアント・サーバシステムにおいて,あるクライアントとの 共通鍵の関連付けはどのように行うのですか クライアントから通信を開始するとどの共通鍵で復号すれば良いかわからないと 思うのですが・・・
691 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:08:37 ] クライアント識別子みたいなのと鍵を1:1にしてサーバで保持しておけばどうかな?
692 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:09:16 ] 使っていいのが共通鍵暗号のみなら 最初はユーザー名をそのまま送るしかないんじゃないの? パスワードは暗号化して
693 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 02:12:31 ] もしくは鍵からハッシュ値でも生成して最初の通信の時に付けておけば
694 名前:690 mailto:sage [2008/01/14(月) 14:07:03 ] ありがとうございます >>691 クライアントには,ユーザIDが与えられているので,それと関連付ける方法ができそうです. ハッシュ値を使う方法もいけそうなので検討してみます.
695 名前:デフォルトの名無しさん [2008/01/14(月) 17:00:13 ] zoomtv.web.fc2.com/?1xd04@VisualAirForce zoomtv.web.fc2.com/?1xcvk@ParadiseCityTV zoomtv.web.fc2.com/?1xcz8@DancingDuoMiku
696 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 22:25:39 ] 鍵交換方式使えばいいと思うけどね まあ、どの程度の暗号強度を求めるのかで適当に決めればいいよ
697 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 03:48:31 ] ハッシュ関数って勝手に使ってライセンスって問題ないのかな? MD5とかSHA-1とか
698 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 04:28:58 ] アルゴリズム自体には無いけどライブラリは別なんで気をつけないといかん 嫌なら自分で書け
699 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 05:28:48 ] Javaならデフォでついてるけどな
700 名前:674 mailto:sage [2008/01/15(火) 12:02:02 ] >>684 4-5年前 NetBSDの teldx だったかな、telnet サーバーのソースは見たことあります。 しかし、コードがトリッキーなのがはいってて理解不能でした。 teldx に限らず、while ループが何百行もつづいてたり、マクロがぐちゃぐちゃはいって たりして読みずらい。。
701 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 13:15:06 ] >>694 OpenSSLは/etc/ssl/certsに証明書が置いてあるよ。 もちろん証明書の中には公開鍵が入ってる。 openssl dgstコマンドでハッシュつくって、 そのハッシュが名前になったシンボリックリンクが本体へ向けてある。 WindowsでもOpenSSLならC:\etc〜になるだけで同じ。
702 名前:デフォルトの名無しさん [2008/01/15(火) 18:32:21 ] マルチスレッドで以下のような構成です。 ・UI スレッド(main スレッド) ・作業スレッド(Winsock1.1 初期化/後処理 + データの送受信) この場合はWinsockのデータベース関数をどちらのスレッドで使用するべきですか?
703 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 18:35:21 ] >>702 何がいいたいのかわからないのだけど… >Winsockのデータベース関数 ってなにかな?
704 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 19:03:30 ] gethostby〜とか
705 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 19:05:43 ] netdb.h
706 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:28:42 ] >>702 今時 Winsock 1.1 もどうかと思うが、どっちにせよ Winsock の初期化/後処理 (Cleanup のことかな?) を作業スレッドで やるなら、Winsock 関連の処理は作業スレッドでやった方が いいと思う。
707 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 01:43:38 ] 新たに名前引き用スレッドプールを新設するのが好み。
708 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 11:02:38 ] 結果のコンシューマもマルチスレッディドになってないと意味ないけどね。
709 名前:デフォルトの名無しさん [2008/01/16(水) 16:51:22 ] 作業スレッド内でWinsockの処理を行うとして、 データベース関数はWSAAsyncGetHostByName等、非同期を用いるべきでしょうか?
710 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:59:30 ] それは、君のやりたいこと次第だからなんとも言えないけど、 WSAAsyncGetHostByName() は、ウィンドハンドルを要するから 作業スレッドでは使いにくいよ。 ぶっちゃけ WSAAsyncGetHostByName() は、スレッド使わない 人向けだよ。
711 名前:デフォルトの名無しさん [2008/01/19(土) 15:19:46 ] TCP最高や! UDPなんか最初からいらんかったんや!
712 名前:デフォルトの名無しさん [2008/01/19(土) 22:03:37 ] WSAAsyncGetHostByName()を使わないとすると スレッド内でデータベース関数がブロッキングを起こさないようにするにはどうしたらいいですか?
713 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:13:38 ] 別のスレッドを起動してそれにやらせる
714 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:14:28 ] ダイアログに貼付けたエディットの中の文字列をGetDlItemTextで取得し gethostbyname関数を使うとNULLが返されるんですが、 NULLが返される原因としては、どんなものがありますか?
715 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:39:47 ] プラットフォームがよくわからんけど、なんで errno とか GetLastError() とかを見ないんだ?
716 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:41:25 ] 一番の原因として考えられるのは 渡した文字列を確認したりWSAGetLastErrorを見たりという簡単なことすら やろうとしない人間がコードを書いていること
717 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 02:41:16 ] ネットワークプログラミングとは関係ないし WindowsAPIとも関係ないな
718 名前:デフォルトの名無しさん [2008/01/20(日) 23:45:31 ] WSAStartupはWinMain側でしか出来ませんか?
719 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:01:24 ] 試した方が速くね?
720 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:37:06 ] 試して出来ませんでした。
721 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:48:30 ] ということは出来ないってことだね 解決して何よりです。
722 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:32:41 ] ソケット通信について質問します。 サーバー win-XP JAVAアプリ クライアント Linux gccアプリ コネクション成立後に、クライアント側から close → open する場合、 close後にopenするまでの待ち時間はどのくらいとればいいのでしょうか?
723 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:35:19 ] 別に待たなくて良い
724 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 17:02:38 ] >>723 サーバー側で時々クライアントのソケット断検出がうまくいかない時があったものですから。 アプリケーションの不具合みたいです。 すみませんでした。
725 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:20:47 ] 生ソケ開いて Macアドレスと IPとポートでフィルタしようと 思うのですが、効率のいいアルゴリズム 知らないでしょうか?
726 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:02:29 ] 受信がうまくいかないのですが、 //送信 char szBuffer[1024]; char lpFileName[1024] = "/case.html"; sprintf(szBuffer, "GET %s HTTP/1.0\r\n\r\n",lpFileName); nRet = send(Socket, szBuffer, (int)strlen(szBuffer), 0); if (nRet == SOCKET_ERROR) { SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\ EM_REPLACESEL,0,(LPARAM)"sendに失敗"); closesocket(Socket); } //受信 while(1) { nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0); if (nRet == SOCKET_ERROR) { SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\ EM_REPLACESEL,0,(LPARAM)"recvに失敗"); closesocket(Socket); break; } if (nRet == 0) break; sprintf(szBuffer,"%s",szBuffer); SendMessage(GetDlgItem(pval->hWndMain,IDC_EDIT2),\ EM_REPLACESEL,0,(LPARAM)(LPCTSTR)szBuffer); }
727 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:15:55 ] > sprintf(szBuffer,"%s",szBuffer); ( ゚д゚) !?
728 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 00:30:53 ] >>725 bitmaskするだけだろ
729 名前:デフォルトの名無しさん [2008/01/22(火) 01:17:46 ] 動画にアクセスしたらzoomeのDQNは早い 70Mbpsぐらい出たよ インターネットなら 透過スピードに近いのではないだろうか? www.lunascape.jp/community/ Lunascape Core Version 4.5.2.1 / ANSI Operating System Version 6.0.6000 Internet Explorer Version 7.0.6000.
730 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 05:08:26 ] bitmask?よくわからん?
731 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 20:55:45 ] あきらめたほうがいいね
732 名前:デフォルトの名無しさん [2008/01/22(火) 21:06:04 ] ソケットでの通信を行うときのバッファサイズについてなのですが、 イーサネットのフレームは最大1518バイトらしいので バッファは1600バイト程度取っておけばいいんでしょうか?
733 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:15:05 ] >>732 TCPのウィンドウバッファはもっと大きいよ。
734 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 17:41:26 ] どのくらい取っておくのが普通?
735 名前:デフォルトの名無しさん [2008/01/23(水) 18:27:41 ] >>734 TCPとかイーサネットとかの仕様は考えなくて良い。 自分で設計したプロトコルに基づいてバッファを決めるのが普通。 どうせ、recvでまとめて受信したり、分割して受信したりするんだから。
736 名前:デフォルトの名無しさん [2008/01/24(木) 14:50:24 ] 質問す。 ソケット繋がった状態で、LANケーブル抜いて、すぐ差し直して、まだソケット繋がったまま。 何故切断されない?
737 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:55:48 ] TCPは送ったパケットが届かなくても何度か再試行するから、そのときに届けば問題なし
738 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:05:32 ] >>736 そもそも下のレイヤの信頼性を補うためのプロトコルがTCPだ…
739 名前:736 mailto:sage [2008/01/24(木) 15:12:29 ] >>737 >>738 あー、そっか・・・いいこという。
740 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 15:28:30 ] WindowsでLANケーブル抜くと断線扱いで まさに>>736 のときネットワークが落とされるんだが これはどうしたらいいかね
741 名前:736 mailto:sage [2008/01/24(木) 15:40:46 ] >>740 それは回線切断を検知したというか、 LANケーブルが抜けたことを検知した、ってことかな。
742 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:19:21 ] >>740 Windows で TCP/IP のメディア検出機能を無効にする方法 support.microsoft.com/kb/239924/ja
743 名前:デフォルトの名無しさん [2008/01/27(日) 15:31:55 ] accept関数の宣言は /include/sys/socket.hでされてるのは分かったのですが externされてて中身がどこで表記されてるのかが分かりませんでした。 どこに表記されているか教えてもらえないでしょうか…。
744 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:46:25 ] UNIX系統なら、acceptの中身はシステムコール叩いてるだけだから、 カーネルに実体がある、といった方が良いのかな。
745 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:53:00 ] 詳解TCP/IP Vol.2だと、uipc_syscalls.cを見てるね。
746 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 08:04:18 ] チャットプログラムを作ろうとしているんだけど 同時に複数のデータを送りたい場合はどういうやり方が常道なんだろう 具体的には発言者、発言内容、文字色のデータがあるとして 適当にカンマ区切りとかにして一回で送信するか それぞれで三回送信した方がいいのか
747 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 12:03:48 ] TCPなら3回に分けて送信したって区切りの代わりにはならんぞ 10バイトを3回送信しても30バイト一度に受信するかもしれんし1バイトずつ30回受信するかもしれんし 区切り文字でもいいけどデータサイズを前に付ける方がたぶん楽 カンマ区切りにするなら発言内容にカンマ含んでるときのことも忘れずに
748 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 12:38:43 ] isprint()な文字しか投稿不可能なんだろうから、 ヌル終端に決めといて、最大サイズ制限あり。 発言者\0発言内容\0文字色\0 が簡単と思う。 送られたデータサイズは疑う必要があるから、 (分散システムでは、完全性の仮定レベルをかなり低くする必要がある) データサイズが送られても、結局は同じ様なコードになる。 バッファ管理とか、タイムアウト処理とか。
749 名前:デフォルトの名無しさん [2008/01/28(月) 12:53:24 ] 質問なんですが、 select使って多重処理のサーバ作ってるのですが、 A、Bという二つのクライアントがサーバに繋がってるとして Aから送った文字列に対してのレスポンスをAだけでなくBにも返す時ってどうすればいいんですか? アドバイスだけでもお願いしますorz
750 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 13:02:15 ] AとBの両方に同じものをsendすれば?
751 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:07:13 ] ある装置で、クライアントで接続するTCPポートxxxxxと、サーバーで接続するTCPポートxxxxx + 1があって 装置から接続先に送るものを、クライアントとして接続したポートで送信し、接続先から装置に対して受信 するものをサーバーとして接続したポートで受信する仕様で通信しているのですが。 種類と発生タイミングの違う複数のデータに対して同じポートで送受信しないといけません。 送信するデータは応答を返すのですが、送信するポートと別のポートで応答を受信するような感じです。 糞仕様にしか思えないのですが、こういうのもありなんでしょうか?
752 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:44:57 ] SYNパケットはどんな目的で使われるものですか?
753 名前:デフォルトの名無しさん [2008/01/28(月) 19:46:26 ] TCP3ウェイハンドシェイク
754 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:49:05 ] >>751 日本語でおk
755 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:54:22 ] >>751 読みづらい…。
756 名前:デフォルトの名無しさん [2008/01/28(月) 20:05:24 ] とんでもなく勘違いしているのかもしれんが Winsockってacceptで処理がとまりませんか? どうしてもこれが気に入らないのですが、どうにかならないですか?
757 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:12:33 ] ノンブロッキングにすれば止まらない
758 名前:デフォルトの名無しさん [2008/01/28(月) 20:20:17 ] ありがとうございます!
759 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 20:44:28 ] 非同期にしても止まらない
760 名前:751 mailto:sage [2008/01/28(月) 21:40:17 ] 装置A→装置Bに(Aから見た)送信専用ソケットと、受信専用ソケットを2つ開いてデータのやりとりをする形式についてです。 @が装置Aから装置Bに送信するデータ Aが装置Bから装置Aに送信するデータ 装置A 装置B ソケット1 ソケット2 ソケット1’ ソケット2’ | | @ | | | +------------>| | | | @の応答 | | |<-------------------------------+ | | | | | | A | | |<-------------------------------+ | | Aの応答 | | | +------------> | データはいろいろな形式があって、それを送受信用ソケットでまとめて送る感じです。 Telnet, FTP 等のサービスを送受信用ソケットでやりとりするみたいなものは、どうなんだろうかと。。
761 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:40:54 ] ごめんずれちゃった。。
762 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:50:37 ] >>760 だれか解読ヨロシク。
763 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:53:03 ] 頭悪いPLC屋とか相手だと、TCP2コネクションで送受信回線が〜 とか言い出すな。
764 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:55:56 ] 俺は、これが気になる。 > Telnet, FTP 等のサービスを送受信用ソケットでやりとりする なんか、すごいこと考えてそうな予感... んなわけねーか。(w
765 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:58:00 ] Winsockを使ってSYNパケットを送信する事は可能ですか?
766 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:04:10 ] connect発行するんじゃなくて、生に「SYNだけ」送信する、 という話なら、おとなしくWinPCapとか入れて叩いた方がいいとおもう。
767 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:29:54 ] とりあえず効率や生産性を無視して動くものを作ってみろと言いたい
768 名前:デフォルトの名無しさん [2008/01/29(火) 02:11:03 ] sendで任意のホストに文字列を送信したいんですが どうも上手くいきません。 アクセプトしたときのsockaddrinのIPとポートを弄るだけでは駄目なんでしょうか? どうすれば送れるのでしょうか
769 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 02:45:16 ] いいからソース出せや
770 名前:デフォルトの名無しさん [2008/01/29(火) 03:03:22 ] とりあえずhost1から来た文をhost1,2に返すような感じのコードで あらかじめfrom2にhost2のIPポートを入れておいて socket() bind() listen() while(1) { switch(select()) case -1:エラー処理 case 0:タイムアウト default: accept( struct sockaddr * &from) recv() send() if(fromがhost1の情報だったら){ from = from2 send()
771 名前:768 [2008/01/29(火) 03:09:06 ] >>769 あ・・途中でShift Enterで書き込んじゃいましたゴメンナサイorz コード的には>>770 のような感じです。 後はクライアントが打ち込んだ文字列をそのままオウム返しするような感じです。 これで動かすとhost1で例えばAAABBBと打ち込むと host2には届かずに、host1だけにAAABBBと帰ってきます。 次にCCCDDDと打ち込んだ時に host1だけにもう一度AAABBBが帰ってきます。 次にEEEFFFと打ち込んだときに host1だけにCCCDDDが帰ってきます。 何かhost2に届かないばかりかワンテンポ遅れる+ダブって帰ってきてしまいます。
772 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 04:10:18 ] × 〜のような感じです × 基本を無視 × 環境を書かない
773 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 05:14:02 ] AAABBBが2度返ってくる時点で、どう見ても自分のコードのバグだろうに。 ところで、一番重要な、acceptの返り値はどうしてるんだい?
774 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:58:05 ] tteいうか、 >from = from2 >send() まさかこれで from2 のどこかのポートに何か送れると思ってる?
775 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:02:08 ] 768は、TCPの「コネクション」というものについてもう一度考え直すように。 acceptの戻りのソケットは、そのIP:port専用で、from_addrを 書き換えたからと言ってもどうにもならない。
776 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 16:30:55 ] 気になったんですが、 WinPCap等はどうやって作られているんですか?
777 名前:760 mailto:sage [2008/01/29(火) 16:50:24 ] >>763 えーとPLC屋です。いわれてる通り、送信のみ、受信のみのコネクションをそれぞれもつ感じです。 Telnet, FTP というのは例えで、ネットワークの階層構造を考えたときに、トランスポート層のTCPとその上のサービスが 1:1じゃない実装になるのですが、ありなのかなと。
778 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:12:45 ] ありもなにも、TCP2回線つかって、TCPをもう一段建て増しに するような真似は止めとけとしか言いようがない。
779 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:49:48 ] >>776 はいどーぞ、そういうときはドキュメント読んでね ttp://dog.tele.jp/winpcap/html/main.html
780 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 02:01:22 ] >>776 たんにドライバに渡されるEthernetパケットのコピーを横取りしてるだけ。
781 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 14:03:09 ] TCPのTIME_WAIT状態に関してRFCでは2MSL時間とあり、OSの実装によって 30〜240 秒取られているのですが。 a.2MSLまたないで同じポートを使用した場合、ルーター等で貯めこんでいた以前のパ ケットを受信することで、シーケンスの順序がおかしくなりRSTフラグが飛び交う。 なのでTIME_WAITは必要? b.TIME_WAITはクライアント側に必要で、サーバー側は無視してよい。通信用とは別の Listen用ソケットを使用するとしても、通信用でTIME_WAITは無視してよい。 c.TIME_WAITと比較してごく短い間隔で接続を繰り返すアプリがあると、利用できないポ ートが増え続けいずれ通信できない状態になる。こういう時TIME_WAITは短くして良い? それともアプリが間違っている?
782 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:22:22 ] >>781 TIME_WAIT は TCP パケットの順序解決を保証するもの。 同一 IP/port 同士が一度コネクションを切り、新たに コネクションを貼ったときにネットワーク内に同じシー ケンスIDが登場しないことを保証している(新旧のパケッ トが混ざらないことを保証している)。 要するに世界中のネットワークから通信に使ったパケッ トが消えてなくなるのに 2MSL 待てばまぁいいんじゃね? ということ。 たとえば、サーバ側で過去 2MSL 間に接続した相手の IP/port のリストをローカルな port 毎に管理していて、 接続要求に来たクライアントの IP/port がリスト内に 無ければ 2MSL 待たずに接続して良い(似たような話が RFC にあったはず)。
783 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:15:06 ] アプリケーション層でプロトコルの設計、送受信処理の仕方を 勉強したいのですが、おすすめの書籍やサイトはないでしょうか? やっぱり、RFCやオープンソースのコード読むのが一番?
784 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:53:01 ] ミドルウェアの解説本読んでみたら?
785 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 01:41:45 ] >>781 クライアントとかサーバとかじゃなくて、TIME_WAITは基本的に「先にcloseを発行」 したほうに生じる。んで、TIME_WAITが必要な理由は、教科書に書いてある通り。 a.TIME_WAITは必要だが、どの程度にするかは実装依存 b.最初に書いたとおり、クライアントかサーバは関係ない c.アプリは間違っていない。TIME_WAIT時間を減らすか、HW資源を増やすかはアナタしだい
786 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:05:23 ] >>783 ここはどうかな? 「ネットワークプログラミングの基礎知識」 ttp://x68000.q-e-d.net/~68user/net/ サンプルコードがあって解りやすかった。
787 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:06:19 ] >>786 いい加減にしろ!
788 名前:デフォルトの名無しさん [2008/01/31(木) 21:09:16 ] 教えてください。 VC++ WinSock でサーバプログラムをしているのですが、複数クライアントからのデータ受信で難航しております。 仮に、サーバAがポート3000で待ちうけ状態の時、クライアントB及びCと接続、B、Cから同時にデータが送信された時、Aのrecvプロセスでデータがごちゃごちゃになります。 クライアントに対してのrecvはそれぞれスレッドで処理をしてるのですが、Bの受信イベントでCのデータも受信されてしまいます。 同一ポートでもacceptしたそれぞれのソケットで送受信できないのでしょうか? 考え方自体間違っていますか? お願いいたします。
789 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:31:55 ] >>788 >recvプロセスでデータがごちゃごちゃになります ありえない動作だから、あなたのプログラムがバグってる。 acceptって書いてるし、たぶんTCPの話だよな? ソースみせてみ。
790 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:36:41 ] >Bの受信イベントでCのデータも受信されてしまいます。 TCPだろ、そんな訳あるか。acceptで戻ってきたソケットは、 そのピア専用になるに決まってるだろ。 あるいはひょっとして電波が届いたけど、acceptの戻りを上書きして、 スレッドB.CでどっちもソケットCを待ってるとかいうオチじゃないだろうな。
791 名前:788 mailto:sage [2008/01/31(木) 22:00:11 ] はいTCPです。ざっとですが、こんな感じです。 通信ソケットはクラス化しています。 CServerSock{ SOCKET m_Sock; recvfunc(); }; CServerSock SvSock[2]; AcceptFunc() { int cnt = 0; while( 1 ){ socket = accept(litensock,...); SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て CreateThread(〜)で各m_Sock用のrecvスレッド(recvfunc)を生成。 } } CServerSock::recvfunc() { char buf[2048]; while( 1 ){ ret = recive( m_Sock, buf, len, 0 ); // このrecive後のbufの内容がB,Cごっちゃになります。 if( ret == 0 || ret == SOCKET_ERROR ) break; ::SendMessage( m_hWnd, m_wMsg, (WPARAM)len, (LPARAM)buf ); 親ウインドウへ通知 } } わかりずらいかもしれませんがよろしくお願いします。
792 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:08:22 ] > CServerSock SvSock[2]; > SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て 普通、コンパイルエラーになるだろ。 (そもそも、private なメンバ変数 m_Sock にアクセスできないし...。) C++ じゃない、俺の知らない言語かも知れんが。
793 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:09:06 ] あれ? それってひょっとして、デバッガでブレークして確認したとかいわないよな?
794 名前:788 mailto:sage [2008/01/31(木) 22:12:51 ] >>789 >>790 そうですよね。 基本的にBが送信A処理、Cが送信A処理の順番だときっちりBのスレッド、Cのスレッドで処理が行われるので・・・。 >>792 すいません。publicメンバです。書き忘れました。 >>793 ブレークとm_Sockの番号等で確認しましたが・・・。
795 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:18:33 ] ネタだろこいつら かまってほしいだけだよ
796 名前:788 mailto:sage [2008/01/31(木) 22:59:26 ] >>795 残念ながらネタではないんですよ。 とりあえず、同一ポートでacceptした個々のSocketで送受信は問題なさそうなので、他でアホなことしてないかもう一度見直してみます。 すみません&ありがとうございました。
797 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:16:34 ] AcceptFuncのwhileでSvSock.m_Sock[cnt++] = socketのようにせず、 CServerSockのコンストラクタでsocketを受け取るようにしてみては? Socketの受け渡しが面倒だけど、オレはそうやって処理してる。
798 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:31:49 ] >>794 > すいません。publicメンバです。書き忘れました。 public でも、 > SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て は通らんだろ。(SvSock[cnt++].m_Sock = socket; ならわかるが。) ネタじゃないなら、情報細切れに出さずに、ソースをそのまま載せるなり、 どっかにアップしろよ。
799 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 10:56:19 ] なにをもってごっちゃと判断してるの?
800 名前:781 mailto:sage [2008/02/01(金) 10:59:33 ] >>782 ,785 なるほど、大変参考になりました。 ついでに、もう一つ質問・・ クライアント側で TIME-WAIT を発生させないようにする為、サーバー側は待ちうけ用の listen ソケットを用意し、クライアント側から切断する時はサーバーに切断用の制御電文 を送信し、必ずサーバー側から Close を発行するのは大丈夫でしょうか?
801 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:12:48 ] 待ちうけ用のlistenソケットを用意って、すでにあるacceptしてるやつとは別に?なんのために?
802 名前:781 mailto:801 [2008/02/01(金) 12:37:36 ] えーと、listen で待つソケットと accept したソケットが同一の場合の実装もあると考えて、そうではないという意味で書きました。
803 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:53:21 ] そんなのあるのか?
804 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 18:23:08 ] 今、UPnPを使いポートマッピングを行うプログラムを組んでいるんですが、 はじめはポートマッピングに成功するんですが、突然成功しなくなります。 それについて、どういった理由が挙げられるでしょうか。 どなたかご教授下さい。
805 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 18:32:20 ] >>791 >SvSock.m_Sock[cnt++] = socket; // B及びCのソケットを割り当て cntはローカル変数なんだし、acceptされるたびに'SvSock.m_Sock[1]' になるのでは?
806 名前:デフォルトの名無しさん mailto:age [2008/02/01(金) 18:57:24 ] あげ
807 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:08:31 ] ローカルだけど、while(1)でその関数抜けないならずっと生きてるんじゃないの。
808 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:18:41 ] Winsockでhtmlファイルを1024パイトずつ取得し、 calloc等により動的に記憶域を確保 そこに全て入れてからURLを抽出する、 という方法を考えているんですが、 何か、良い方法はありますか?
809 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:21:17 ] 良い方法、というのは、たとえば、Perlでも使っとけ、みたいな話?
810 名前:デフォルトの名無しさん mailto:age [2008/02/01(金) 19:22:22 ] >>807 確かによく見たらbreak処理が無いな。 え。無限ループって事は配列オーバーしないかい? あと、Acceptfunc()が呼ばれるタイミングもいまいちわかんないね。FD_ACCEPT直下?
811 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:27:03 ] それもスレッドから呼ばれるんじゃないの?知らないけど。 Main,Accept, 送受信スレッド連中、みたいな。
812 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:36:32 ] >>809 効率の良い方法、です。
813 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:37:58 ] マルチスレッド使ったことなす;・ω・) ポートマッピングに詳しい人。 >>804 をたのみます。
814 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:16:33 ] >>800 サーバからCloseを発行して、クライアント側ではrecvで0が返ったことを 確認してcloseすればクライアントはTIME_WAITには入らないから大丈夫。 ただし正常系はそれでいいが、例えばサーバが無応答になった場合など、 クライアントから切断せざるをえない場合も発生するよ。 切断用の電文は、>>801 のいうように切断したい接続上でやりとりすれば いいと俺も思う。バイナリを大量に転送中で中断が難しいような場合だと、 転送用の接続と、コマンド用の接続を分けるというのも確かにやるけど(FTPみたいに)。
815 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:36:51 ] >>804 理由はあまりに多すぎて、いちいちあげる気にならない。 パケットログか、ソースをアップしてくれ。
816 名前:デフォルトの名無しさん mailto:age [2008/02/01(金) 21:54:53 ] >>815 プログラムはほぼ www.bosuke.mine.nu/neta/upnp.shtml を参考にしました。ってか、ここのサンプルでもあけられないです。 処理ではWANIPを取得する際に失敗するようです。 ちなみに、二重ルータなんですが、ルータのIPは192.168.xxx.1ではなかったです。 '1'の部分が百いくつだったはず…ここでミスってるんですかね? ソースはサンプルプログラムのinvoke関数です。 XMLとかわかんないんであまりうまく調べられて無いような感じです。
817 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:19:14 ] >>816 >'1'の部分が百いくつだったはず…ここでミスってるんですかね? UPnPは、IPアドレス情報も含めてプロトコル上でやり取りして、自動設定してくれる。 だから、ここは関係ない(はず)。
818 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:22:00 ] >>816 とりあえずinvoke関数の中のどこでエラーが返ってるかログしこむなりして、 調べれ。
819 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:22:05 ] 二重ルータ?
820 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:36:01 ] >>817 なるほど >>819 モデム(ルータ機能付き)>ルータ>★自分&他複数PC ________________>ルータ>複数PC こんな感じです。 とりあえず、環境と離れるんで invoke関数の調査は週明けにでもやります。
821 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:39:37 ] UPnPはエラーならエラーコードがわかるはず
822 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:49:50 ] >>820 ルータ(1)>ルータ(2)>設定を実行するPC という環境であるとして、設定したいルータが「ルータ(1)」ならそもそも できない可能性がある。UPnPはマルチキャストを使ってるのだが、 ルータ(2)がマルチキャストルータでないと、PCで発行した マルチキャストパケットは、ルータ(2)を超えられない。 で、個人用の安価なルータがマルチキャストルータということは まずない。 ルータ(2)がマルチキャストルータで、マルチキャストパケットが ルータ(1)まで届いたとしても、同一ネットワークからじゃないと UPnPのSOAPリクエストにたいして応答を返さないようなルータっ ていうのは存在する。 でも、「出来るときと、出来ないときがある。」って書いてあるから、 ちがうのかもだが。
823 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:52:52 ] あーそれからルータをこえてマルチキャストパケットを届けたいなら、 IGMPメッセージを発行する必要がある。これはUDPソケットに対して、 IGMP_JOINなどをAPI経由で発行する。 やってるかもしれんが。
824 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:53:50 ] マルチキャストはルータ発見時しか使わないから、 そこをたとえば手動で設定すれば良いんじゃないかな。 ルータ1と2で同じポートを開けないとイケナイのがアレだけど。
825 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:03:41 ] >>824 おまえアタマイイナ
826 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:05:02 ] でもなーんか、UPnP使う意味がない気がしてきたな。。。w
827 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 23:09:02 ] 余談だが、これ気をつけろよ。 「Flashを悪用してUPnP経由でルータの設定を変更する攻撃は、これまでに報告 されたルータ攻撃方法に比べて何百倍も危険性が高いとSymantec。」 www.itmedia.co.jp/news/articles/0801/22/news075.html
828 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:09:07 ] recvで1024ずつ一つのhtmlファイルを取得する場合 htmlファイル合計バイト分の記憶域を確保するためにはどうすればいいですかね?
829 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:20:50 ] 最初に1024バイトのバッファを用意してそこに書いていって、足りなくなったら reallocすればいいやん。
830 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:48:07 ] C++なもので
831 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:57:16 ] >>827 それは 1 UPnPでルーターに穴をあける。 2 ルーターのWEB/IFをWAN側からアクセスする。 って事でいいのか?
832 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:08:07 ] >>830 resizeとかreserveとか
833 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:11:19 ] >>831 DNSサーバアドレス書き換えて、フィッシングサイトにとばすとかもできるんじゃね。
834 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:20:23 ] >>833 残念ながら、UPnPにはDNSサーバーを設定するという機能はないのだよ。
835 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:43:42 ] >>831 ができれば書き換えられるんじゃね。
836 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:54:58 ] char *buf; buf = (char *)calloc(1024,sizeof(char)); で記憶域を確保して、 確保した領域の大きさを変更する場合をどのように判断したらよいですかね?
837 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:01:21 ] >>836 ネットワークのスレじゃなくて、プログラミング初心者のとこで聞いてこいよ。
838 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:01:38 ] 日本語でお願いします。
839 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:05:36 ] >>836 recvの返り値で読み込んだバイト数が分かるから、whileやforでカウントすれば?
840 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:42:55 ] まぁreallocとか時間かかるから、ある程度大きいバイト数を1ブロックとして、 ブロックごとで領域を確保していった方がいいと思う。いちいちrecvの返り値分だけreallocしていくよりはね。 HTMLファイルだけが対象ならアレだけど・・・。
841 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 10:39:49 ] ブロックごとに領域を確保していくっていうのがよくわかりません。
842 名前:デフォルトの名無しさん mailto:age [2008/02/03(日) 12:02:17 ] age
843 名前:デフォルトの名無しさん mailto:age [2008/02/03(日) 12:10:08 ] ガジェットの作り方? www.nifty.com/labs/gadget/
844 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:42:26 ] ブロックごとで領域を確保していく コードで示して下さるとありがたいのですが、 駄目ですかね?
845 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:00:48 ] Un*xのsendfileやWindowsのTransmitFileって効果が大きいですか? boost::asio使おうと思ったんだけどsocketの完全なラッパーなのでsendfileが使えなくてどうしようかなと
846 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:04:55 ] 使われる環境で全然違うから、評価環境つくって測定しなきゃ意味ねー。
847 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:04:06 ] Webダウンローダーの仕組みってどうなってるんですか? htmlやjpg等の拡張子判別とか、html内のリンク抽出とか 重複I/O等使っているんでしょうか?
848 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:39:51 ] 一行目と二行目の違いに愕然とした
849 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:25:39 ] もしかして wget の中身を知りたいの?
850 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:09:30 ] ちまちま数バイトずつ確保していくよりも、 ドーンと確保して足りなくなったらまたドーンと確保するって事だろ。 コードを示してもらうほどでもない。あと、スレチになりつつある。
851 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:19:01 ] >>844 ブロックごとでなくても良いから、一回自分で考えて作ってみたら どうだろう?
852 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:15:39 ] >>851 に一票 正解を探し回るより、とりあえず動くものを作る方がいろいろ理解できるよ。 そもそも、最近のマシンだと、ちまちまメモリー確保してもそれなりに動くし。
853 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:35:23 ] てかメモリ確保くらいならサンプルコード腐るほど落ちてる。
854 名前:デフォルトの名無しさん [2008/02/04(月) 21:44:58 ] こんにちは。 winsockでネットゲームを作っているのですが、 サーバーを介さないで4人のクライアント同士で通信し合いたい(peer to peer)場合、 各々が相手3人のクライアントのソケットを持ってる必要があるのですが、 どうやってクライアント側のソケットを取得するのでしょうか? (ホストのは取得出来ます)
855 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:14:19 ] TCP?UDP?
856 名前:デフォルトの名無しさん [2008/02/04(月) 22:27:53 ] TCPです。 単純に4人共がlistenして全員が相手3人にconectし合えばいいのかな と思ったりしましたが、もっと良い方法はありますか?
857 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:32:49 ] 普通のご家庭にはルータがあってNATの向こうにPCがあるもんだが その環境だと互いにtcpでつなぐのはしんどいぞ どういうのを想定?
858 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:48:37 ] >>856 別にそれでいいんじゃない? >>857 ネットゲーム作ろうかと言う奴なんだから、バーチャルサーバとか ぐらいは知ってるんじゃないかな。
859 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:56:10 ] バーチャルサーバ?
860 名前:854 [2008/02/04(月) 23:15:42 ] マッチングサーバーを作ってそこで4人組み合わせて後はpeer to peerでと考えています。 接続時に指定するポート番号っていうのはホスト側のアプリケーション識別番号で クライアント側は自動的に空いてるポートが使用される。。。 という考え方で合っていますか? 4人共がlistenして全員が相手3人にconectし合う場合、 4人共がポート2000の同一番号でlistenしてても問題ないでしょうか?
861 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:22:38 ] グダグダ考えずに一台をサーバにすればいいじゃないか
862 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:05:32 ] >>860 問題ない。 て言うか、まずは二台でお互いにコネクション張って実験してみな。
863 名前:854 [2008/02/05(火) 00:15:44 ] >>861 その通りなのですが、何故かそういう仕様になっているのです。 何のメリットがあるのか全くもって分かりません(泣 >>862 はい、やってみます。ありがとうございます。
864 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:21:25 ] 1時間で仕様が決まったのかwww
865 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:29:37 ] 仕様を作った馬鹿に質問するなり文句言えばいいのに
866 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:23:39 ] ハイブリッドP2Pって事か。 NAT越えが出来なくて泣いちゃいそうだな。 かくいう俺も出来ないわけだが。
867 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 22:34:15 ] >>863 リアルタイム系のゲームなら、いちいちサーバーを介してデータの やり取りなんかしてられないので、P2P は別におかしくない。 まあ、それなら TCP と言うのがちょっと疑問だが。
868 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 03:07:14 ] P2Pだと同期制御が課題になってくるけどな
869 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 12:20:11 ] TCPってダメなの? 俺は、UDPは送信データの欠如があるとかであんまり信用して無いんだが。
870 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 12:35:35 ] 両方つかえばいいんじゃないか? UDP -> リアルタイムに反映したいもの ( キー入力、キャラクターの移動ベクトル ) TCP -> 正確にやりとりしたいもの ( 同期取るPCからのデータとか )
871 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 12:41:26 ] >>869 TCPは信用しているということなら、 TCPスタックは信用しているって事なので、 アプリの要求から観て、信頼できるかどうかは、 中間層にかかっているのでは? だからUDPで書いても、アプリに必要なレベルの信頼は保てる。
872 名前:デフォルトの名無しさん [2008/02/07(木) 13:33:44 ] VS2005で Winsockを使っていてSD-BOTHが定義されていない、と出るのですが、 何でですかね?
873 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 13:36:01 ] SD-BOTHが定義されていないから
874 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 13:48:14 ] >>873 どうしたら解決出来ますかね?
875 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 14:39:42 ] SD-BOTHが定義されていない、と出ないようにする
876 名前:デフォルトの名無しさん [2008/02/07(木) 15:41:01 ] ソケットを閉じるときに いきなりclosesocketでも問題はないが、 shutdown(socket,SD_BOTH); とすることがある。 これは送信、受信ともに通信を切断する意味だったと思う。
877 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 16:22:53 ] shutdown(s, SHUT_WR);
878 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 17:36:53 ] >>814 いろいろと、ありがとうございます。 切断したい時はサーバーからCloseしてもらえば問題なく、また 相手がいなくなった時に自分から Close する場合は 1.相手応答ないので Close。 2.TIME_WAIT 状態になる。 3.TIME_WAIT 満了前に再接続する 4.local port +1 して(空きポートで)即 Connect する。 5.相手いないので Connect 失敗でエラーが返る。 6.エラーなので Close する。 と、接続状態から切断の遷移にならないので、TIME_WAITにはなりませんでした。 ということで、TIME_WAIT状態のソケットが溢れるとしたら、それは、 接続後に自分から切断しまた接続する動作をしてるって事ですね。
879 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:20:46 ] >>878 相手が存在しない場合、closeの発行ではFINの再送状態になる わけだからTIME_WAIT状態にはならない。だがサーバがコマンド に応答しない場合でも、FINに対しては(recvで0が返ったら) close処理を行う場合、クライアントはTIME_WAIT状態に入る。 そこら辺まで行くと、ちゃんと書籍を横においてTCPの挙動理解 するようにしながら、プログラム造ったほうがいいと思うよ。 リチャード・スティーブンスのTCP/IPvol1一冊あればいい。
880 名前: ◆TCP/IPzk8E [2008/02/08(金) 23:44:57 ] test
881 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:20:13 ] 素晴らしい
882 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:09:17 ] ほほう
883 名前:デフォルトの名無しさん [2008/02/10(日) 07:51:52 ] 質問です。 オンラインのアクションゲームを作りたいのですが、 プレイヤー間の同期を取る方法について詳しく知りたいです。
884 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 12:30:24 ] 同期なんか取りません ネットワークの遅延は避けられません いかに結果の辻褄を合わせて上手く誤魔化すかに注力した方が良いかと思います
885 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 16:29:09 ] >>883 相対時間ではなく、絶対時間で動作させる。
886 名前:デフォルトの名無しさん [2008/02/11(月) 00:25:12 ] >>884 推測航法?とかいうので移動を予測するとかいうのは聞いたことがあります。 >>885 クライアント側から「時刻XXXまでに○○へ移動」みたいなものを送る感じでしょうか。 時刻をサーバとクライアントで同期させる必要がありそうですね。 リアルタイム性のあるゲームに利用できるかもいまいちわかりませんが。 というか、クライアント→サーバ間でどのくらい時間かかるかためしたことありませんでした。。 pingとかではかってみます。
887 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:10:55 ] >>886 最終的にクライアントに戻すんだからクライアント→サーバー→クライアントの時間を考えた方が
888 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:15:24 ] 一定時間ごとにサーバがスナップショット送って同期をとるのが基本 LAN限定にするならそうシビアになることもないけどな ちなみに演算はサーバ側で行うのが基本 同期とりやすいし、不正もある程度は防げる
889 名前:デフォルトの名無しさん [2008/02/11(月) 13:18:35 ] 失礼します。 現在、クライアント←→サーバー型のチャットを作ろうとしています。 ですがネットワークプログラミング自体が今回初めてで、 猫でもわかる〜の本を読んでいるのですが何から手をつければいいか分かりません。 どなたか基本的な作り方(?)、もしくは参考になるサイトをご存知の方がいましたら返答お願いいたします。 ちなみに言語はCで考えていますが、C++の方が比較的分かりやすい等あれば変更する予定です。
890 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:51:41 ] >>889 ソケットプログラミングでググレ ほとんどは題材がチャットC/S 関数がわからなかったら関数名でググレ
891 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 13:53:15 ] >>889 チャットくらいなら、CとかじゃなくてPerl,Ruby,Pythonのようなスクリプト言語 がいいよ。 プログラムの初心者で、オブジェクト指向になじみがなければ、Perl使って みるといいんじゃないかな。ブラウザ使ってのチャットならPerlでCGIを作る 方法を解説した本が一冊あったほうがいいんじゃない。
892 名前:デフォルトの名無しさん [2008/02/11(月) 14:01:57 ] お早いレスサンクスです >>890 すいません、素でググるの忘れてました・・・本当に大抵がチャットC/Sのものばかりのようで参考になります。 感謝です >>891 最終的には3Dのネトゲを作ろうとしているので、Perlなんかで作ってしまうと色々問題が。 そのあたりの事もあるので、C言語で作ろうとしてまして・・・。
893 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:02:00 ] >>890 , 891 TCP のモデル知らずに組んで.... って落ちか? client より先に server 落したら server 再起動時に address in use とかエラー帰ってくるとか... ... ...
894 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:11:02 ] >>892 うーん・・・3Dのネトゲつくりたいなら、TCP/IPの基礎から抑えておく 必要があると思うよ・・・。 入門で以下の本くらいはひとまず読んでみるとか ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06584-7 何冊か入門本読んだら、リチャード・スティーヴンスの本をそろえて 読む必要があるんじゃない。
895 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 14:42:13 ] >>892 > 最終的には3Dのネトゲを作ろうとしているので、 > Perlなんかで作ってしまうと色々問題が。 まずは、ネットワークプログラミングに慣れろと言うことだと思うが。 C 言語がめちゃめちゃ得意でケアレスミスなんて俺には関係ネェとか 言うなら最初から C でもいいけどさ。 # そんな奴は、>>889 みたいな質問はしないだろうし、 # 全角で Perl と書いたりもしないだろうな...。
896 名前:デフォルトの名無しさん [2008/02/11(月) 16:16:38 ] >>895 あぁなるほど、そういう事でしたか・・・失礼しました。 以前多少かじった程度なのでこの際に少し弄ってみることにします。
897 名前:デフォルトの名無しさん [2008/02/11(月) 16:25:57 ] >>896 少し弄るとbitですw
898 名前:デフォルトの名無しさん [2008/02/11(月) 16:31:28 ] P2Pテレビ www.getmiro.com/ (ミロ) www.v2p.jp/video/ (キーホールテレビ) www.joost.com/ (ジュースト) www.pplive.com/ (ピーピーライブ) www.ppmate.com/ (ピーピーメイト) www.ppstream.cn/ (ピーピーストリーム) www.sopcast.org/ (ソープキャスト) tvants.en.softonic.com/download (テレビの蟻) www.tvunetworks.com/ (TVUプレーヤー) zattoo.com/ (ザトゥー) www.veoh.com/ (ベオテレビ) その他 tv.uhuru.co.jp/index.html (取説) cowscorpion.com/ (フリーウェア)
899 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:42:49 ] とりあえずは>>1-のリンクを見るといいんだ
900 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:16:36 ] | ____ | | | / / / _____/ / | / _/ |  ̄ _| \ | / / \ / ̄| ̄ヽ  ̄ ̄| ̄ ̄ /‐┬┐\ |. ‐┼‐ | / |  ̄ ̄| ̄ ̄ ││ │ __| ヽノ ノ │ _/___| し(_丿\ _____________ | | | |``'''‐- 、 | | l ∩ `、 | | | |│ | │ | | |│ ! | | _,.ィ| | _.ニ=´‐--、 | | ,、‐' ´_,.ィ| |>‐'' ⊃ ,) | | ( ⊂ -<! L.r '"´>''´ | | `''ー---‐''- 、.l>'''´ | | P l a y S t a t i o n | |_______________| __ __ __ / " / " =|= / / ヽ _フ ( ( (_ ( ヽ / o)
901 名前:デフォルトの名無しさん [2008/02/12(火) 14:59:55 ] コンシューマ機でネトゲーつくったことある人いる?
902 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 17:22:46 ] ゲーム製作板行けよ
903 名前:デフォルトの名無しさん mailto:sage [2008/02/13(水) 04:03:56 ] >>901 ありますよ
904 名前:デフォルトの名無しさん [2008/02/15(金) 15:14:01 ] 今、TCP転送実験をしているのですが、間違いの原因が分かる方おられませんか? 環境はVC.NET + SDKで勉強してます TCPでクライアントとサーバプログラムを作成し、ファイル転送実験を行っています。 1MBから100MBくらいのファイルはうまく転送することができるのですが、それ以上の大きなファイルになると、 微妙にファイルサイズが大きくなると言う現象が起きています。サーバはaccept関数をマルチプロセスで動かし、 recv関数もマルチプロセスで行っています。クライアントはsend関数をマルチプロセスで行っています ファイルサイズが大きくなるほど、ファイルサイズのズレも大きくなるような感じです。 原因の予想がつく方、助言お願いします
905 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:30:43 ] コード晒せよ
906 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:40:52 ] ファイルをテキストモードでオープンしていると、LFがくるたびにCR追加されるから サイズは増えるな。でも100MBまで1つもLFが無いのにそこから入るなんてそうそう無いしなあ やっぱコード見ないとわからん。
907 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:39:16 ] recvの戻り値(受信したバイト数)を確認してないとかいうオチ?
908 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:42:09 ] ネットワークプログラミングって何?
909 名前:904 mailto:sage [2008/02/15(金) 18:25:45 ] >>907 するどいご指摘ありがとうございます。 大当たりです。確認を忘れてました。。
910 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:39:54 ] >>904 こーひーふいたじゃねーか・・・w ギャグじゃないのだよね・・・w
911 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:40:51 ] 不安すぎるから、送信したデータと受信したデータの内容が ちゃんと一致するか、テストしとけよw
912 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:41:06 ] ありえない、騙りじゃないのかよw
913 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 20:39:18 ] >>908 telnet上でプログラムすること
914 名前:デフォルトの名無しさん [2008/02/15(金) 22:36:01 ] winsockでsend()でHTTPリクエスト送信してrecv()でデータを受け取るという単純なプログラムを書いています。 yahooや、google等は取得出来たのですが、exciteブログがどうしても取得できません。 エキサイトブログはどの人のブログを試してみても駄目でした。 以下のようなエラーメッセージが出ます。 HTTP/1.1 403 Access Forbidden Server: Microsoft-IIS/5.0 Date: Fri, 15 Feb 2008 13:28:38 GMT Content-Type: text/html --------------: --- <html><head><title>Directory Listing Denied</title></head> <body><h1>Directory Listing Denied</h1>This Virtual Directory does not allow contents to be listed.</body></html> InetSpyを見てHTTPヘッダを同じにしても駄目でした。 エラーメッセージからしてアクセスを拒否られているみたいなのですが解決方法ありますか?
915 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 22:51:21 ] 取得しようとしてるURLは?
916 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:00:43 ] http://ユーザID.exblog.jp/ なんだけど、自分のブログとか無くて誰かの晒す訳にはいかないから www.exblog.jp/ で適当な文字列で検索かけて欲しいです。 とりあえず、誰のでやっても同じでした。
917 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:15:07 ] telnetでやってだめならあきらめれ
918 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:24:45 ] >>916 telnet でやったら出来たよ。 $ telnet <hogehoge>.exblog.jp 80 ... GET / HTTP/1.0 HTTP/1.1 404 Server: Microsoft-IIS/5.0 Date: Fri, 15 Feb 2008 14:24:02 GMT Pragma: no-cache P3P: CP="NOI DSP CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT" Pragma: no-cache Connection: Keep-Alive Content-Length: 4030 Content-Type: text/html;charset=utf-8 Expires: Fri, 15 Feb 2008 14:24:03 GMT Cache-control: no-cache ...
919 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:27:16 ] > HTTP/1.1 403 Access Forbidden http の勉強しろよ。 > Directory Listing Denied > This Virtual Directory does not allow contents to be listed. もしくは、英語の勉強な。 て言うか、telnet で試したら、 telnet ○○.exblog.jp 80 GET / HTTP/1.1 Host: ○○.exblog.jp で、普通に取得できたぞ。(Host を指定しないと、400 Bad Request で、 丁寧に Host を指定しろよゴラァといってくれるし。)
920 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:35:34 ] >919 それはHTTP/1.1でリクエスト出してるくせに 必須の筈のHostヘッダを落としたからだ。
921 名前:914 mailto:sage [2008/02/15(金) 23:36:06 ] ありがとうございます。 でも、telnetって何ですか? ググって見たらwindowsに標準のソフト事だとあったけど良く分からない。 もうちょっと、調べてきます。
922 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 23:44:09 ] 。。。
923 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:17:33 ] >>921 www.nurs.or.jp/~telnet/http.html tonetsutomu.com/tone/articles/nos1998b/www/ などを嫁
924 名前:914 mailto:sage [2008/02/16(土) 00:21:20 ] 結局良く分からなかった。 telnetってソフトですよね?Tera Termって言うの落としてみたけど使い方が分からず。 それを使えば、エキサイトブログのデータ取得できるかもしれないけど、 取得したデータを解析する場合プログラムに埋めないと駄目ですよね? その変が良く分からない・・・。
925 名前:914 mailto:sage [2008/02/16(土) 00:22:11 ] と、書いたらレス来てた。 ちょっと読んできます。
926 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 00:56:46 ] >>924 ネットワークプログラミングをする時、テキスト系のプロトコル (http, smtp, pop)をテストするのに実験用汎用クライアントとして telnetが使えるという事。 もちろん最終的にはプログラムに組み込まなければ ならないが、>>914 のような問題はまずtelnetでちょこちょこと検証が 出来るので便利。
927 名前:914 mailto:sage [2008/02/16(土) 02:04:05 ] なるほど、ありがとうございます。 自分はちと先を急ぎすぎたみたいですね・・・。 まず、telnetでの操作を覚えたいと思います。 ご迷惑お掛けしました。
928 名前:デフォルトの名無しさん [2008/02/18(月) 16:02:50 ] はじめまして。質問をさせて下さい。 softbank出版の「WinSock2.0プログラミング」という本のP.45に 次のような記述があります。 ・・・このポートという概念が在るおかげで、1つのマシンアドレスで 複数のソケットを使う事が可能となります。ソケットのフルアドレス (sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。 これらの3種類の情報が集まって、1つのソケットを一意に特定します。 同じマシン上にある2つのソケットを、同じプロトコルを使って 同じポートに関連付ける事は出来ません。それぞれが異なるプロトコルを 使うのであれば、同じポートに関連付ける事が出来ます。 そこで、お聞きしたいのですが、>>788 以降の書き込みを見ると この本の記述とは異なるようです。この本は間違っているのでしょうか?
929 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:29:24 ] >>788 の話と何の関係もない気がするんだが
930 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:35:17 ] 788の人はたぶん何か勘違いしてるだけなので気にしなくていいかと
931 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:50:19 ] >>928 >同じマシン上にある2つのソケットを、同じプロトコルを使って >同じポートに関連付ける事は出来ません。 アドレスが異なれば、同じプロトコルの同じポートでも関連付けられる。 ・・・そういう話じゃないか。
932 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:59:57 ] >>928 その本捨てた方が良いかも。 本当にその通りに書かれているなら書いてる奴自身がわかってないっぽい。 スティーブンス本で TCP/IP について勉強したら 後は以下のサイトを熟読すれば Winsock についてもほぼ困ることはない。 tangentsoft.net/wskfaq/ www.kt.rim.or.jp/~ksk/wskfaq-ja/
933 名前:932 mailto:sage [2008/02/18(月) 17:07:49 ] >>928 すまん、俺が勘違いしてた。 そこの「プロトコル」ってのはUDPとかTCPとかのレイヤの話か。
934 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:52:31 ] >>932 が一番わかっていなかった件
935 名前:928 mailto:sage [2008/02/18(月) 18:54:57 ] 本は正しいのでしょうか? 私の解釈だと、この本の通りであれば、TCPで繋ぐ時 サーバーが同時に接続可能なクライアントの数が ポートの数に縛られるような気がするのですが・・
936 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:56:42 ] http で あるサーバー 1 IP で ポートは 80 のみ なぜ同時に沢山アクセス出来ているんだと思う?
937 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 18:59:08 ] >同じマシン上にある2つのソケットを、同じプロトコルを使って >同じポートに関連付ける事は出来ません。 ここをちゃんと読めてない香具師は多い
938 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:01:44 ] 「一つの(アドレス、プロトコル、ポートで一意)に複数のソケットを割り当てられない」 とは書いてあるが 「一つのソケットに複数のクライアントを繋げない」 とはどこにも書かれていない
939 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 19:12:45 ] イメージで、複数つながるときは複数Listenしてると思うんだろう。
940 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:38:33 ] >>935 ソケットは ・プロトコル ・自分のアドレス ・自分のポート ・相手のアドレス ・相手のポート の組で区別されるので、自分側が同じアドレス・ポートでも相手側が異なれば異なる サーバは1個のアドレス・ポートだけでいくつものクライアントを裁ける ポート数には縛られない ・・・で合ってたっけ?ちょっと自信ない
941 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:38:44 ] 便乗質問ですが 一つのソケットに繋げられるクライアント数の最大数は? あるいは何によって制限されますか? メモリ?OSが処理できるプロセス数?スレッド数?
942 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:41:29 ] >>935 つまり結局、 > サーバーが同時に接続可能なクライアントの数が > ポートの数に縛られるような気がするのですが・・ その解釈でいいように思える。 unsigned short だから6万個くらいだっけ。 縛られるっつっても、現実問題としては充分だわな。
943 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:44:39 ] ダウト
944 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:49:01 ] >>941 openの方法にもよります FAQにも書いてあるので見ておくとよいかと また、ライセンスによっても制限があります Win2000などは10までだったかな
945 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:53:08 ] >941 1つのソケットで繋げられるのは、1つのクライアントだけだろ?
946 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 22:01:33 ] >>944 の訂正 2000Proはサーバ用途のソフトは不可 XPProが10 VistaはEURAみたことないので知らん
947 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 22:43:42 ] >>928 > ソケットのフルアドレス > (sockaddr)は1つのIPアドレス、プロトコル、ポートから構成されます。 > これらの3種類の情報が集まって、1つのソケットを一意に特定します。 ここは間違いだね。 これじゃacceptの引数のソケットと、 帰り値のソケットの違いを説明できない。 TCPの接続は>>940 の組で識別するということが理解できてないようだ。 ただこれはAPIの本であって、プロトコルの本ではないから、 プロトコルについてはカマーやスティーブンスの本を読んで、 APIの解説はこの本を参照すれば? もちろんMSDNも。 MSDNはどこに自分の欲しい情報があるか分かりにくいから、 こういう本を一読しておくとWinsock2全体を概観できていいよ。 リファレンスじゃなくて、解説本だからね。
948 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 22:45:29 ] >>945 「繋げる」の意味によるなあ。 TCP or UDPとか、マルチキャストとか。
949 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:03:35 ] 色々と理解不十分なのがゴチャゴチャかいてるので、元質問者が混乱しそう なのでいっておく。 >>940 と>>947 が正解。
950 名前: ◆0uxK91AxII mailto:sage [2008/02/18(月) 23:10:43 ] >>941 Winsockの場合。 www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html
951 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:54:40 ] >>948 マルチキャストってソケット関係ないじゃん?
952 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:57:34 ] >>951 あるよ^^
953 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 00:36:59 ] >>952 あるね。ごめんよ^^
954 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 19:13:41 ] OSによるとは思うんですが、UnixドメインソケットとループバックIFでTCPではどっちが高速ですか?
955 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 20:55:10 ] ループバック
956 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 21:04:31 ] >>954 そんくらいはかってみれ
957 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:02:32 ] >>954 悩むなら両方に対応してオプションで選択できるようにするといいよ
958 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:16:23 ] 「ウィンドウズだとプロセス作成が重い」という話をよく聞くのですが、 ウィンドウズでhttpサーバーを書く場合、どのような構成が適切だと思いますか? 1、1リクエスト=1プロセスを尊守する 2、いくつかのリクエスト(数十〜数百)をまとめて一つのプロセスで処理する 3、プロセスは1つ。1リクエスト=1スレッドで行う 4、プロセスは1つ。いくつかのリクエストをまとめて1スレッドで行う 5、プロセスもスレッドも1つ。すべてのリクエストを非同期で処理する
959 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:18:26 ] >>958 6. apache を使う
960 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:23:30 ] >>958 組み込みなら5しか選択肢はない
961 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:25:05 ] >>958 プロセス生成が重いと考えているのに、どうして1と2が選択肢になるのか。
962 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:47:20 ] 7. 複数のスレッドですべてのリクエストを非同期処理する
963 名前:デフォルトの名無しさん mailto:sage [2008/02/19(火) 22:59:10 ] >>958 お前の書くサーバなら2で十分。
964 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:25:57 ] 7、プロセスチーズは雪印
965 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 10:04:47 ] 雪印はあの事件以降買ってないわ
966 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 11:54:21 ] そうだね、雪印はちょっと怖いよね。 だから最近できたメグミルクってとこの買ってるよ。
967 名前:932 mailto:sage [2008/02/20(水) 13:00:08 ] >>960 マルチスレッドカーネルくらい書けよ。
968 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:55:48 ] >>958 IOCP
969 名前: ◆0uxK91AxII mailto:sage [2008/02/20(水) 19:38:43 ] 一方、IIS6ではTDIを叩いた。
970 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:59:11 ] TDIってそのうち非推奨になるって書いてあるけど、次のIISはどうするの?
971 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:40:56 ] IISはOSと癒着だから。 ミニポートドライバを挟み込むくらいは遣りかねない(w
972 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:57:22 ] >>967 マルチスレッドカーネルつかってても、組み込みなら1スレッドで非同期で全部やる 常識でしょ
973 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 09:55:45 ] >>972 なぜ常識なのかわかんね。 結果として1プロ1スレでやらざるを得ないことは多いけど。
974 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:37:54 ] スレッド増えるとコンテキストの切り替えで遅くなるからじゃない?
975 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:04:31 ] タイマによる切り替えだけじゃなくて、デバイスI/O待ちとかで積極的にdispatchするようにしとけば問題ない事が多い。
976 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:44:32 ] 1タスクのスタック領域4kとってるとして、100個接続裁いて100スレッドになると 400kのメモリが必要。そして、さばく接続数に比例して使用するメモリがどんどん 増える。非常に無駄。
977 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:46:53 ] コンテキストスイッチに時間がかかるのも効率が悪い。 まぁ最近の携帯電話とかだと、鬼のようなスペックつんでるので、携帯電話 メーカーが作るのならいいのかもだけど。「うちのミドルウェアには、HTTP サーバもついてますよ!1接続、1スレッド必要ですが」とかいったら、 ゼッタイそのミドルウェアは採用されないな。
978 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:49:22 ] スレッドをプールしてもダメなん?
979 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:59:31 ] 接続数が多くなる場合はIOCP使えってのは常道みたいだが。
980 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:36:54 ] Winsockの挙動について connect()するときに、以下の条件 1.プロトコルはTCP 2.HostAddressにDNS名を指定 3.DNS応答に複数IPが含まれている(DNSラウンドロビン等) において、DNS応答の1つ目のIPアドレスへの接続に失敗した場合、 接続再試行として、DNS応答の2つ目以降のIPアドレスへ接続を行ってくれる? それとも、接続試行を行うのは一つ目のIPアドレスに対してのみ? 知ってたら教えておくれやす。
981 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:49:38 ] おまいの使ってるconnect()とやらのパラメータには、何を渡すようになっているか知ってるか?
982 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 02:58:25 ] がびーーーん! 参考にしたMSDNのページをよく確認したら、 MFCのCAyncSocket。 逝ってきまつ… ;y=ー( ゚д゚)・∵. ターン \/| y |)
983 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 09:46:26 ] >>979 銭形警部?
984 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:27:47 ] オレもその略号みるとそれ思い出すんだw ICPOだけどな
985 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 14:28:45 ] >>983-984 お前らのせいで変な見方しか出来なくなったヽ(`Д´)ノ
986 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:44:23 ] linuxでIOCP無いと思った windowsで実装されてるようなの。
987 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 16:56:41 ] IOCPは特許になっているので、 スケジューラ絡みの部分はLinuxに実装できないが、 aio_*を使えばほとんど同じことができる。
988 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:23:24 ] IOCPって特許になってたんだ。知らなかった。
989 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 22:21:24 ] 組み込みのカスは死ねよ
990 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 11:35:46 ] 日本のソフト産業でシェアあるのってほとんど組み込み系じゃねえか
991 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 12:33:31 ] >>989 すべてお膳立てされたPCでのプログラミングしかできないカスは死ねよ。
992 名前: ◆0uxK91AxII mailto:sage [2008/02/26(火) 12:42:17 ] 組込みと聞いて見てみたら、窓CEとかJavaなんてのは、よくある話。
993 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 19:07:56 ] 組み込みと聞いて行ってみたら… ハードの事は何も分からないで仕切ってる奴がいて 1 octet を CHAR と書けとか 2 octet を WORD と書けとか 4 octet を LWORD と書けとか ... 言われるのもよくある話.
994 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:08:18 ] 別に違和感ないけど。 むしろ、UCHAR, UWORD, ULWORD とかはいらんのか? と思ってしまう。
995 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:59:09 ] そういえば、これは本当に偶然だったんだけど azn っていう略称の動作があって、せっかくなので使用可否のフラグを char aznable; って書いたら上司に見つかって、2人でウヘラウヘラ笑いあった。
996 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:26:01 ] >>995 俺もウヘラウヘラした
997 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 14:59:11 ] TCPでサイズが8kbくらいのデータを送ろうとするとへにゃるんですが、 TCP送信できるデータには最大サイズみたいなのはありますか? それとも、何か別の原因が考えられますか?
998 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:06:56 ] へにゃるって何だよ 具体的に何が起こったのか書け 1回のrecvで受け切れなかったとか、そういうことか?
999 名前:デフォルトの名無しさん [2008/02/27(水) 15:11:08 ] どっちにしろ下の層で細かく分割されるんだ。 TCPやソケットはそういうのを考えなくていいように作られてるんだ。
1000 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 16:09:40 ] へにゃりつつウヘラウヘラすればいいさ
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。