[過去ログ]
ネットワークプログラミング相談室 Port4 (1001レス)
ネットワークプログラミング相談室 Port4 http://mevius.5ch.net/test/read.cgi/tech/1034236536/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
844: 843 [sage] 02/12/10 01:22 しまった、ブロッキングソケットで、だ http://mevius.5ch.net/test/read.cgi/tech/1034236536/844
845: デフォルトの名無しさん [] 02/12/10 12:18 BSDソケットの代わりにカーネルキュー使うと 無茶苦茶速くなると聞いたんですが そのあたりの資料ってないですか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/845
846: デフォルトの名無しさん [sage] 02/12/10 15:12 その程度の知識の奴が使って「無茶苦茶速くなる」 ことなど決してない http://mevius.5ch.net/test/read.cgi/tech/1034236536/846
847: デフォルトの名無しさん [ sage ] 02/12/10 15:37 とりあえず、 http://ghost.math.sci.hokudai.ac.jp/esehttpd/ の関連リンクをあたれ。 それと、kqueueはsocketを待つ方法の一種。 socketのかわりに使うわけではない。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/847
848: デフォルトの名無しさん [] 02/12/11 14:31 あげ http://mevius.5ch.net/test/read.cgi/tech/1034236536/848
849: デフォルトの名無しさん [sage] 02/12/11 14:34 rawソケットとかで直接データリンクにアクセスしている場合、 自分宛のパケットを取り込むことってできるんでしょうか? ipアドレスを自分宛、MACアドレスも自分宛にして、送信してみましたが 取り込めません。 ためしに自分宛のIPアドレスとしてループバックアドレスを指定してみましたが 取り込まないです。。。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/849
850: デフォルトの名無しさん [] 02/12/11 19:57 プログラミング以前なんだけど、教えて下さい。 ノンブロッキングでシングルスレッドI/Oマルチプレクシングってどういう意味ですか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/850
851: 名無し@沢村 [] 02/12/11 19:58 銀行のATMにアクセスするプログラムはどう書くのですか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/851
852: デフォルトの名無しさん [sage] 02/12/11 20:19 ( ゚д゚) ポカーン http://mevius.5ch.net/test/read.cgi/tech/1034236536/852
853: デフォルトの名無しさん [sage] 02/12/11 20:20 つーか、また沢村かよ!! 土に還れ!! http://mevius.5ch.net/test/read.cgi/tech/1034236536/853
854: 名無し@沢村 [] 02/12/11 20:45 銀行のATMにアクセスするプログラムの書き方 //ネットワークに流れるデータを受信する recive(data); //データがATMのときは if(data==ATM) //あ億円を引き出す popmoney(100000000); http://mevius.5ch.net/test/read.cgi/tech/1034236536/854
855: 名無し@沢村 [] 02/12/11 20:50 銀行のATMにアクセスするプログラムの書き方 //ネットワークに流れるデータを受信する recive(data); //データがATMのときは if(data==ATM) //1億円を自分の口座に振り替える。 sendmoney(100000000)from(anybank)to(mybank); http://mevius.5ch.net/test/read.cgi/tech/1034236536/855
856: デフォルトの名無しさん [sage] 02/12/11 20:56 ワラタ http://mevius.5ch.net/test/read.cgi/tech/1034236536/856
857: デフォルトの名無しさん [sage] 02/12/11 22:13 >>850 まったくもってプログラミング以前の話じゃないぞ。 ソケットをノンブロッキングにしてselectでイベントを待ち、 イベントドリブンっぽく記述するプログラムのモデルのことだろう。 たとえば、サーバープログラムが、複数のクライアントとの処理を "forkせずに"おこなう場合なんかに使える。 まあ、unixならfork、win32/javaならthreadにしたほうが 楽だと思うけどね。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/857
858: デフォルトの名無しさん [ sage ] 02/12/11 22:17 unixなら、自力でforkするより、inetdから起こして貰う方が楽と思うが。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/858
859: デフォルトの名無しさん [sage] 02/12/11 22:19 シングルスレッド〜との対比で言うならforkであってると思う。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/859
860: デフォルトの名無しさん [sage] 02/12/11 22:34 > まったくもってプログラミング以前の話じゃないぞ。 すこーし言葉がおかしいと思う。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/860
861: 857 [sage] 02/12/11 23:16 追記。 win32ならwinsock2とWindowMessageを使えばイベントドリブンになるね・・・ でもその格好で書いたことないや・・・ http://mevius.5ch.net/test/read.cgi/tech/1034236536/861
862: デフォルトの名無しさん [ sage ] 02/12/11 23:26 漢は黙ってIOCP http://mevius.5ch.net/test/read.cgi/tech/1034236536/862
863: デフォルトの名無しさん [sage] 02/12/11 23:27 >>861 ウィンドウメッセージを使うのはWinsock2.0でなくてもできるぞ。 Winsock2.0で追加されたのはイベントオブジェクトを使った非同期処理とか 重複I/Oだとか。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/863
864: デフォルトの名無しさん [ sage ] 02/12/11 23:32 つーか、WindowMessageを使うwinsockは、 threadのないWin16のために出来たと思っていたが http://mevius.5ch.net/test/read.cgi/tech/1034236536/864
865: デフォルトの名無しさん [sage] 02/12/12 00:00 そして話がシングルスレッド〜に戻るわけだが http://mevius.5ch.net/test/read.cgi/tech/1034236536/865
866: デフォルトの名無しさん [] 02/12/12 01:57 >>857 ノンブロッキングでシングルスレッドI/Oマルチプレクシング これはzeusという有料webサーバーの特徴なんですが、ググっても要領を得なかったのです。 apache2.0の性能向上はマルチスレッド対応によるところが大きいと聞きますし 世間はマルチスレッドマンセーであると思われますが、シングルスレッドであるメリットはどこにあるのでしょうか? またI/Oマルチプレクシングについての資料やサンプルコード(perlやC)はないでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/866
867: デフォルトの名無しさん [sage] 02/12/12 02:01 >>866 マルチプレクシングを多重に読みかえて検索してみなされ ttp://www.soi.wide.ad.jp/class/20000011/slides/08/index_3.html コードは見当たらんな http://mevius.5ch.net/test/read.cgi/tech/1034236536/867
868: デフォルトの名無しさん [] 02/12/12 02:05 レベル低いね http://mevius.5ch.net/test/read.cgi/tech/1034236536/868
869: デフォルトの名無しさん [ sage ] 02/12/12 02:12 たとえば、同時接続数10000とかになると、マルチスレッドだとスレッドが、 マルチプロセスだとプロセスが10000とかできたりして、 そのタスクスイッチだけで相当の時間が費やされてしまうし、 保存すべきコンテキストも膨大な量になるから。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/869
870: デフォルトの名無しさん [sage] 02/12/12 02:15 >>866 理屈からいえばシングルスレッド/非ブロッキングが一番効率的になる (スレッド切り替えだとかの問題で)が、いかんせん、余りにも処理の 流れが掴みにくくなるので一般的に保守が面倒になる、といわれている。 apacheの場合はマルチプロセスだったものがマルチスレッドも可能になった って話でこの場合関係ない。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/870
871: デフォルトの名無しさん [sage] 02/12/12 02:38 >>870 CPU1個ならね。 CPU複数なら、マルチスレッド、ノンブロッキングマルチプレクシングが良い。 のか?教えて、偉い人。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/871
872: デフォルトの名無しさん [ sage ] 02/12/12 02:55 プロセスが1つだと、そのプロセスが落ちたとき全滅なので、 マルチプロセス・ノンブロック・マルチプレキシング、 ということになったりもするが。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/872
873: デフォルトの名無しさん [sage] 02/12/12 03:07 >>871 以前読んだ解説記事には、例えばWebサーバみたいにI/Oリクエストを 多数処理するプログラムの場合、 (1)シングルスレッド。selectでマルチプレクシング。 (2)I/Oリクエストごとにスレッドを生成。 (3)CPU数程度のワーカ・スレッド。ノンブロッキングI/Oでマルチプレクシング。 と、下になるほどスケーラブルとあった。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/873
874: デフォルトの名無しさん [sage] 02/12/12 08:32 >>872 初期のApacheとかだと、cgiを呼ばなきゃなんない関係で、 別プロセスにしてるんじゃなかったかなあ。 >>873 ソースキボン http://mevius.5ch.net/test/read.cgi/tech/1034236536/874
875: デフォルトの名無しさん [] 02/12/12 10:33 >>873 スレッドだけじゃ駄目な場合もあるだろうが >>874 違う。1プロセスで扱える接続数には制限があるほか、 メモリリークを回避する意味合いや、>>872の効果もある。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/875
876: デフォルトの名無しさん [] 02/12/12 10:42 ちょうどマルチスレッドの話もでているので便乗させてください 不特定多数が参加するMMO(というわりには規模がちいさいけど、イメージ的にはそれ)を作っています マルチスレッドを使おうと思ったのですが、色々訳あって現在はシングル+非同期winsockでやっております そこで質問なのですが、winsockでconnectを同期せず(connectで止まらず)に行うには AASyncを使うしかないのでしょうか recv, sendはソケットのオプション変更で非同期にできたのですが… プレイヤーがログインしたとき、データベースサーバーにコネクションを張らせたいのです マルチスレッドにするしかないでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/876
877: デフォルトの名無しさん [sage] 02/12/12 12:23 >>876 プレイヤー毎にDBに接続? 。。。正気の沙汰とは思えんな。 それじゃ同時接続数は30〜100くらいしかさばけんぞ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/877
878: デフォルトの名無しさん [] 02/12/12 12:32 UDPのパケット受信で正確な大きさが分からないのでsock_fastreadで受信します。 1回のsock_fastreadで処理したいのですが、 パケットってどれくらい小さく分断されるされる可能性があるものなのでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/878
879: デフォルトの名無しさん [ sage ] 02/12/12 12:40 >UNIX Network Programming" によれば、全ての TCP/IP の実装は、 >MTU の大きさに関わらず 576 バイトの最小 IP データグラムを >サポートしなければなりません。IP ヘッダが 20 バイトで UDP ヘッダが > 8 バイトと仮定すると、UDP メッセージの安全な最大サイズとしては >548 バイトが残ります http://mevius.5ch.net/test/read.cgi/tech/1034236536/879
880: デフォルトの名無しさん [sage] 02/12/12 12:44 thanx!>>879 じゃ、sock_fastread1回で、500byte位まで逝けるね! http://mevius.5ch.net/test/read.cgi/tech/1034236536/880
881: デフォルトの名無しさん [sage] 02/12/12 14:20 >>876 WSAEventSelect connectよりgethostbynameのEvent版がないことのほうが 納得いかん http://mevius.5ch.net/test/read.cgi/tech/1034236536/881
882: 876 [] 02/12/12 15:21 >>877さん, 881さん ありがとうございます。 WSAEventSelect確認しておきます 今ひとつのサーバーにコネクションいくつ張れるかテストしてみました 43本……。 いや、Win98をサーバーにしようとは微塵も思わないけど、44本目で 「Error10055 バッファスペースに空きがない」 2kなら大丈夫かな…だといいな クライアントとサーバーが同じPCだったからかな… 何にせよプレイヤーの数だけDBにコネクションを張るのは無謀、了解しました。 [プレイヤー] ←プレイ→ [ゲー鯖] ←セーブロード→ [DB鯖] ゲー鯖とDB鯖には一本張って、それでやりとりするのがいいですかね 何にせよゲー鯖はプレイヤー人数分コネクト張らなきゃいけないのに、43本… http://mevius.5ch.net/test/read.cgi/tech/1034236536/882
883: デフォルトの名無しさん [] 02/12/12 16:57 >>882 めちゃくちゃ納得 というか既存のネットゲーどうやってるのか?知りたいです。 ノンブロッキングIOプレクシングとやらも関係あるのかも http://mevius.5ch.net/test/read.cgi/tech/1034236536/883
884: デフォルトの名無しさん [sage] 02/12/12 19:15 DBとゲー鯖で一本コネクション張っておけば? でも一斉に大量がセーブロードを行う場合にsendバッファ超えそう 一回セーブ内容をプールしたりする必要があるかもな http://mevius.5ch.net/test/read.cgi/tech/1034236536/884
885: デフォルトの名無しさん [sage] 02/12/12 20:11 >>876 connectって非同期にできない? リファレンス見ると、できそうに書いてあるけど。 > With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. http://mevius.5ch.net/test/read.cgi/tech/1034236536/885
886: デフォルトの名無しさん [sage] 02/12/12 23:24 >>885 どう読んだらそうなるんだ? 「connect要求は直ちに完了できない(ノンブロッキングにできない)ので エラーになる」と書いてあるが。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/886
887: デフォルトの名無しさん [sage] 02/12/13 00:00 >>886 Windows の設計はよくわかんなくて、エラーは返るんだけど、正常に ノンブロッキング処理は行われる。 だから、メッセージをそのまま解釈すると、connect から SOCKET_ERROR が返ってきて、かつ WSAGetLastError から WSAWOULDBLOCK が返ってきたときは、正常に非同期接続が行われている(途中)ってことになる。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/887
888: 885 [sage] 02/12/13 00:07 >>886 え。だって、ノンブロッキングソケットって、いつもエラーリターンでそ? recv とか send とかも。 EWOULDBLOCK は、本来ならブロッキングしてたはずのところを、ノンブロッキングだからすぐリターンしたよって意味ではなかった? http://mevius.5ch.net/test/read.cgi/tech/1034236536/888
889: デフォルトの名無しさん [sage] 02/12/13 00:31 EWOULDBLOCKはEINTRと、意味は違うけどその後の処理は似てるね。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/889
890: デフォルトの名無しさん [sage] 02/12/13 00:56 まあ、Winsockのノンブロッキングを知ってればあたりまえだけど、 そういう仕様だと思って納得するしかないな。 ところで、>>876は > recv, sendはソケットのオプション変更で非同期にできたのですが… というところから、ノンブロッキングモードではなく非同期モードを使おうとしているようだが。 ちなみに俺は知らんし調べる気もない。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/890
891: デフォルトの名無しさん [sage] 02/12/13 00:57 非同期とノンブロックは全く別ものだな。 知ったかクンがよく間違えてるが。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/891
892: デフォルトの名無しさん [] 02/12/13 01:06 private int DatagramSocket ds; って宣言の仕方おかしいですか? Eclipseをつかっていまして トークン"ds"に構文エラーがあります。正しくは";","."です。と表示されますが、 どういうことでしょうか。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/892
893: デフォルトの名無しさん [sage] 02/12/13 01:08 >>889 結構違うと思うよ。 EINTRはそのままリトライに入って問題ないけど、 EWOULDBLOCKはそのままだとBusy Loopに陥る。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/893
894: デフォルトの名無しさん [sage] 02/12/13 01:09 >>892 ネットワークプログラミング以前の問題 初心者スレへ逝け http://mevius.5ch.net/test/read.cgi/tech/1034236536/894
895: 892 [sage] 02/12/13 01:16 あ・・・なんでintが入ってるんだろ(汗 スマソ http://mevius.5ch.net/test/read.cgi/tech/1034236536/895
896: デフォルトの名無しさん [sage] 02/12/13 09:03 >>888 「いつも」ではない。その場で処理されてすぐに戻ってくるかもしれない。 いつもWSAEWOULDBLOCKが返ってくることを前提にした コードを書いてはならない。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/896
897: 876 [sage] 02/12/13 09:40 >>890-891 すいません、しったか君が間違えました ノンブロッキングモードです。 cnnnectにもノンブロッキングモードはあるのかな ちょっと調べてみます >>881さん WSAEventSelect調べてみました ははーん…。 イベントとやらも便利そうですね。winsockのみなのが残念なところ linuxでも試してみたいので、connectのノンブロッキングを探してみます だめそうならイベントを http://mevius.5ch.net/test/read.cgi/tech/1034236536/897
898: デフォルトの名無しさん [sage] 02/12/13 12:57 >>896 上のドキュメント見ろ。「いつも」だ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/898
899: デフォルトの名無しさん [sage] 02/12/13 13:01 > With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. ノンブロッキングソケットでは、コネクションの試みは即座には完了できない。 この場合、connectはSOCKET_ERRORを返す。WSAGetLastErrorはWSAEOULDBLOCKを返す。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/899
900: デフォルトの名無しさん [sage] 02/12/13 14:18 >>888より > え。だって、ノンブロッキングソケットって、いつもエラーリターンでそ? recv とか send とかも。 >>896より > 「いつも」ではない。その場で処理されてすぐに戻ってくるかもしれない。 >>899より > the connection attempt cannot ... 後は自分で判断しような>他の人 http://mevius.5ch.net/test/read.cgi/tech/1034236536/900
901: デフォルトの名無しさん [sage] 02/12/13 14:34 判断する余地があるのか無いのか・・・ http://mevius.5ch.net/test/read.cgi/tech/1034236536/901
902: デフォルトの名無しさん [sage] 02/12/13 14:49 無いね。「may not」なら「完了しないこともある」だが、 「cannot」だからね。必ずSOCKET_ERRORが返る。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/902
903: 900 [sage] 02/12/13 14:54 >>888より > いつもエラーリターンでそ? recv とか send とかも。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/903
904: 900 [sage] 02/12/13 14:56 おっと、connect直後にFD_WRITEが来るから send()が成功するのは当てはまらないと言われるかな。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/904
905: デフォルトの名無しさん [sage] 02/12/13 14:56 要するに>>896が知ったかということだろ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/905
906: 900 [sage] 02/12/13 14:57 connectに関しては全く異論はないよ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/906
907: 900 [sage] 02/12/13 15:01 しつこいから最後。 俺には>>896が知ったかだったのではなく、>>898がよく読んでなかっただけに見えるけどね。 あ、俺は>>896ではないよ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/907
908: デフォルトの名無しさん [sage] 02/12/13 15:08 888がバカなのは確かだが。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/908
909: デフォルトの名無しさん [sage] 02/12/13 15:24 nonblockingなソケットの場合 1. connect()は必ずWSAEWOULDBLOCK.が返ってくる。 2. recv()やsend()とかはいきなり正常終了する可能性がある。 connect()する時は相手からの応答を待つから、即座の復帰はありえない。 recv()やsend()ではバッファの関係で正常/WSAEWOULDBLOCK.両方の可能性がある。 ごっちゃにしたのが混乱の原因(w http://mevius.5ch.net/test/read.cgi/tech/1034236536/909
910: デフォルトの名無しさん [sage] 02/12/13 15:27 乙 http://mevius.5ch.net/test/read.cgi/tech/1034236536/910
911: デフォルトの名無しさん [sage] 02/12/13 16:10 そうそう、send()が一番わかりやすいから書いたけど、 recv()もconnect後にFD_READが来る前でも成功する可能性がある。 そうなると、次にFD_READが来てからrecv()しても、WSAEWOULDBLOCKになる可能性がある。 また、FD_READの処理部で複数回recv()することも出来る。 そして、2回目以降が成功する場合もある。 この場合も次のFD_READで何も受信できない場合が多い。 これは、1回目のrecv()後にバッファにデータが残っていたら、 recv()からの復帰前にFD_READが送られるから。 だったはず。 確か、FD_CLOSEの後にFD_READが来る可能性もあったはず。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/911
912: デフォルトの名無しさん [sage] 02/12/13 18:04 >確か、FD_CLOSEの後にFD_READが来る可能性もあったはず。 普通はおきないけど、FD_CLOSE 前のFD_READ が届いたときに (ソケットバッファ未満の?)小さな recv() しかしない場合に、 発生する可能性ありなんだっけ? winsock 側としては、 FD_READ FD_CLOSE をポストして、お役御免と思っていたら、FD_READ 時に全部 recv() してくれないものだから、そこで、あわてて FD_READ を再発行って 印象。 それ以外のシチュエーションでも、FD_CLOSE後のFD_READなどが ポストされる場合って、あるのかな? http://mevius.5ch.net/test/read.cgi/tech/1034236536/912
913: デフォルトの名無しさん [] 02/12/13 20:22 Mobile IPv6 に対応したプログラムくみたいんですけど、誰か参考になる ソースとかのありかおしえてくれませんか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/913
914: デフォルトの名無しさん [sage] 02/12/13 23:28 >>912 前スレで同じ話があったと思う。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/914
915: デフォルトの名無しさん [sage] 02/12/14 04:28 蒸し返すようだけど、>>885-888の話の流れからして、 888は「WSAEWOULDBLOCKを知らせる時には(sendやrecvも)いつもSOCKET_ERRORを返す」 ということを言いたかったんじゃないかと思う。 とすると、888も896も898以降も、みんなわかってるのに言葉のあやでひっかかってただけかも。 日本語勉強しないとね>俺も http://mevius.5ch.net/test/read.cgi/tech/1034236536/915
916: 名無しさん@接続しっぱなし [] 02/12/14 12:43 >>845 http://www.cs.rice.edu/~gaurav/papers/usenix99.ps これ読むと、select(2)のkernel内bottle neckは、 bit操作であることが分かるよ。 だからkqueue/keventとまではいかずに、poll(2)や/dev/pollでも、 selectよりもかなり改善が期待できる。(C10Kな状況では) http://www.kegel.com/dkftpbench/Poller_bench.html にベンチマークがある。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/916
917: デフォルトの名無しさん [] 02/12/14 12:57 ウイルスをください もちろんダウンロードしたときに こっちのパソコンが感染しないように してほしいです。 ダウンロードさせてくれるサイトの紹介でも いいです。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/917
918: デフォルトの名無しさん [] 02/12/14 13:17 >>917 何に使うの? http://mevius.5ch.net/test/read.cgi/tech/1034236536/918
919: 888 [sage] 02/12/14 17:58 885=888です。 >>891 非同期と聞いてノンブロッキングと短絡的に考えてました。本で読んだばっかりなのに・・・鬱。 >>915 ふぉろーさんくす・・・言葉足らずだったばっかりに。許して>896,900,903,905,908 >>909 localhostの場合はすぐconnect完了するかもしれんので、必ずじゃないかも(UNIXの本にはそう書いてありました)。 あと、UNIXではEWOULDBLOCKじゃなくてEINPROGRESSだと知りました・・・いろいろ勉強不足。ごめ。もっと修行します。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/919
920: デフォルトの名無しさん [sage] 02/12/14 19:27 >非同期と聞いてノンブロッキングと短絡的に考えてました って?非同期=ノンブロッキングではないってこと? http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=%E9%9D%9E%E5%90%8C%E6%9C%9F+%E3%83%8E%E3%83%B3%E3%83%96%E3%83%AD%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0+%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja とか見ると「非同期(ノンブロッキング)」とか書いてあるけど…。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/920
921: 919 [sage] 02/12/14 19:40 >>920 >って?非同期=ノンブロッキングではないってこと? ないです。891さんの言うとおり、やっぱりよく間違えられるんでしょう。 「UNIXネットワークプログラミング第2版Vol1」によると、入出力を扱う手法はブロッキング、ノンブロッキング、多重化(select と poll のこと)、シグナル駆動I/O、非同期I/O という5つの方法があって、 非同期I/O は aio_read、aio_write とかいうものを使う方法だそうです。Windows ではたぶん WriteFileEx と ReadFileEx で OVERLAPPED を指定した状態が、それに相当するのではないかと。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/921
922: デフォルトの名無しさん [sage] 02/12/14 19:47 >>921 あ、そうなんですか。 うーん。何やら難しいですね。。。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/922
923: 909 [sage] 02/12/14 22:40 >>919 俺はMSDNに書いてある記述の要約をしただけで、 Unix系の実装について触れた覚えはないんだが。 大抵の場合はlocalhostに関してもエラーが帰ってくる可能性が高いだろ。 connect(2)が完了するためには相手がaccept(2)するためにコンテキストスイッチが 発生するから、それを待たずに即座に復帰するよう実装するんじゃないか? それでも、nonblockingでもconnect(2)が常に失敗することを仮定して 実装すべきではないと思う。つーか、エラーチェックくらいしろ、と。 あと、Unix系ではEAGAIN、EWOULDBLOCK、EINPROGRESSの三種類がある。 Linuxでは、manページによるとconnect(2)はEINPROGRESS、recv(2), send(2)は EAGAINまたはEWOULDBLOCK(実際は同じ値)を返すらしい。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/923
924: 909 [] 02/12/14 22:40 >>921 使い分けだと3種類だな。 同期: ブロッキング 多重化: ノンブロッキング + (select or poll) 非同期: シグナル駆動I/O or 非同期I/O Windowsの場合も同様。 ブロッキング、ノンブロッキング、select()、Windowメッセージ、イベント、重複I/Oに分かれる。 WSAEventSelect()ではWindowメッセージかイベントに対して通知をし、 OVERLAPPED渡すやつではイベントか、コールバックに通知をする。 同期: ブロッキング 多重化: ノンブロッキング + (select or event) 非同期: 重複I/O(イベント使わずコールバック) MsgWaitForMultipleObjectsEx()使えば、スレッドの終了イベントを待機しながら、 Windowsメッセージを処理し、さらにI/Oを完全な非同期で処理することを1スレッドで 実装することも不可能ではない。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/924
925: 名無しさん@接続しっぱなし [sage] 02/12/15 01:35 ネットワークや分散の世界で、 非同期メッセージ通信というと、requestとacknowledgementが分かれていて、 acknowledgmentを別途取得するタイプのメッセージ通信のことです。 例えばDNSを引く時に、gethostbyname(3)を使うと、 関数呼び出しと値返しが同時に起きるので、同期メッセージ通信になります。 WSAAsyncGetHostByName(win32)だと非同期メッセージ通信です。 非同期I/Oは、kernelとのやり取りにおいて、 I/Oの結果をAPI呼び出し時に即座に返えさないタイプのI/Oです。 どのレベルのinteractionについて、同期/非同期を言っているのか、 混同している人は意外に多いようです。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/925
926: デフォルトの名無しさん [sage] 02/12/15 01:40 APIレベルの話なんでねえの? http://mevius.5ch.net/test/read.cgi/tech/1034236536/926
927: 名無しさん@接続しっぱなし [sage] 02/12/15 01:42 >>924 Stevens本はpthreadを視野に入れてないので、 (というかStevensの使っているUNIXにはまともなthreadがなかった) > 多重化(select と poll のこと) でもいいのですが、Windowsの場合は、 > 多重化: ノンブロッキング + (select or event) だけじゃなくて、多重化を実現する方法に、 マルチスレッドも入るんじゃないでしょうか? (それからノンブロッキングは必須でない。多重化をより稼げるけど) http://mevius.5ch.net/test/read.cgi/tech/1034236536/927
928: 名無しさん@接続しっぱなし [sage] 02/12/15 01:45 >>926 gethostbyname(3)もsend(2)もどっちもAPIじゃん? http://mevius.5ch.net/test/read.cgi/tech/1034236536/928
929: 名無しさん@接続しっぱなし [sage] 02/12/15 01:51 >>926 ん? 「send/recv(write/read)レベルの話なんでねえの?」 「UNIXでいうところのsystem callレベルの話なんでねえの?」 と言っているのかな? そこに限ってしまうと同期/非同期と ブロッキング/ノンブロッキングの区別がなくなるから、 同期/非同期はもう少し大きい枠組みで理解しよう、 というのが、分かりにくかったかも知れないけど>>925の主旨でした。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/929
930: デフォルトの名無しさん [sage] 02/12/15 02:07 このスレで扱ってる同期/非同期は、 「指示した動作の、完了を知る方法の違い」 でしかないと思った。 TCP/socketはネットワークアクセスのためのAPIだけど、 APIになった瞬間にネットワークの存在は関知しなくてもいいでしょ。 というか、知りえないでしょう。 925の言う「どのレベルでのinteractionか」というくだりの、 レベルの違いっていうのが、プログラムから見て意味あんのか疑問。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/930
931: コロ助 [コロッケ大好きナリ] 02/12/15 12:10 すいません。WinSockの質問をしたいのですが。 サーバーにHTTP接続を試みているのですが、うまく接続できません。 ソース sock[n]=socket(AF_INET,SOCK_STREAM,0); WSAAsyncSelect(sock[n],hW,SM_ASYNC,FD_CONNECT|FD_CLOSE|FD_READ|FD_WRITE) lpServEnt = getservbyname("http", "tcp"); if(lpServEnt==NULL) { ser.sin_port=htons(80); } else { ser.sin_port=lpServEnt->s_port; } lpHostEntry=(LPHOSTENT)bufHostEnt; ser.sin_family=AF_INET; ser.sin_addr=*((LPIN_ADDR)*lpHostEntry->h_addr_list); if(SOCKET_ERROR!=connect(sock[n],(LPSOCKADDR)&ser,sizeof(SOCKADDR_IN))) HTTPだと駄目なのですが、SMTPやFTPならうまく接続できて、データも転送できます。 なぜ、HTTPだけ接続できないのでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/931
932: デフォルトの名無しさん [sage] 02/12/15 12:20 > うまく接続できません > HTTPだと駄目 どこでどんなエラーが出てるのか、 またはエラーが出てないが応答がこないのか、 明示しないお前にコロ助を名乗る資格はない。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/932
933: コロ助 [コロッケ大好きナリ] 02/12/15 12:34 >>932 唯一、エラーが出ているのは、サーバーと接続(connect)したときで、 エラー if(SOCKET_ERROR!=connect(sock[n],(LPSOCKADDR)&ser,sizeof(SOCKADDR_IN))) { MessageBox(hW,"connect","成功",0); } else { if(WSAGetLastError()!=WSAEWOULDBLOCK) { MessageBox(hW,"connect","失敗",0); } } connect関数はSOCKET_ERRORを返しエラーとなりますが、その後の、if(WSAGetLastError()!=WSAEWOULDBLOCK)には引っかかりません。 そのほかはエラーは全く出ていません。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/933
934: コロ助 [コロッケ大好きナリ] 02/12/15 12:37 lpServEnt = getservbyname("http", "tcp"); でhttpを指定すると接続されないのですが、ftp、smtpだとうまく接続されます。 WinSockはhttp接続の際なにか特別な処理をしないといけないのでしょうか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/934
935: デフォルトの名無しさん [sage] 02/12/15 12:41 >>933 WSAGetLastError() ぐらい知らんのかよ...。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/935
936: デフォルトの名無しさん [sage] 02/12/15 12:43 >>934 gethostbyname() http://mevius.5ch.net/test/read.cgi/tech/1034236536/936
937: 935 [sage] 02/12/15 12:43 すまん勘違いだった。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/937
938: デフォルトの名無しさん [sage] 02/12/15 13:36 ( ●∀●) コロ助にSYNパケットを送るモナ http://mevius.5ch.net/test/read.cgi/tech/1034236536/938
939: デフォルトの名無しさん [sage] 02/12/15 14:21 実は80はwell-known-portに含まれず、servicesにhttpが書いてない罠。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/939
940: デフォルトの名無しさん [sage] 02/12/15 14:36 >>939 その時は、80 をセットするようにしてるみたいだけど ? ちゃんと見てないけど、ロジックがおかしいのか ? http://mevius.5ch.net/test/read.cgi/tech/1034236536/940
941: デフォルトの名無しさん [ sage ] 02/12/15 14:51 で、結局WSAGetLastError()は何を返してるんだ? それと、相手はちゃんと存在するのか? http://mevius.5ch.net/test/read.cgi/tech/1034236536/941
942: デフォルトの名無しさん [] 02/12/15 14:52 っつーか、ネットワークプログラミングしてるくらいなら、 パケットダンピングくらいしろよ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/942
943: デフォルトの名無しさん [sage] 02/12/15 14:58 >>941 取りあえず、WSAEWOULDBLOCK じゃねーのか ? WSAAsyncSelect() で Non-Blocking-Mode にしちゃってるから、当たり前だと思う。 ftp/smtp がちゃんと動いている方が不思議だ。 http://mevius.5ch.net/test/read.cgi/tech/1034236536/943
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 58 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.021s