ネットワークプログラミング相談室 Port19
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/02/09(金) 23:04:56Programming UNIX Socket FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/sock-faq/indexj.html
Winsock Programmer's FAQ (日本語訳)
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/
関連リンクは>>2-10辺り
足りなかったら適当に付け足してね
前スレ
ネットワークプログラミング相談室 Port18
http://pc10.2ch.net/test/read.cgi/tech/1159692799/
0002デフォルトの名無しさん
2007/02/09(金) 23:05:58Port17 http://pc8.2ch.net/test/read.cgi/tech/1148944560/
Port16 ttp://pc8.2ch.net/test/read.cgi/tech/1136005644/
Port15 ttp://pc8.2ch.net/test/read.cgi/tech/1128088448/
Port14 ttp://pc8.2ch.net/test/read.cgi/tech/1118469143/
Port13 ttp://pc8.2ch.net/test/read.cgi/tech/1109793931/
Port12 ttp://pc5.2ch.net/test/read.cgi/tech/1102427855/
Port11 ttp://pc5.2ch.net/test/read.cgi/tech/1096187183/
Port10 ttp://pc5.2ch.net/test/read.cgi/tech/1090385857/
Port9 ttp://pc5.2ch.net/test/read.cgi/tech/1080658835/
Port8 ttp://pc5.2ch.net/test/read.cgi/tech/1073560271/
Port7 ttp://pc5.2ch.net/test/read.cgi/tech/1063035045/ ★行方不明
Port6 ttp://pc5.2ch.net/tech/kako/1052/10521/1052106444.html
Port5 ttp://pc2.2ch.net/tech/kako/1040/10402/1040220302.html
Port4 ttp://pc3.2ch.net/tech/kako/1034/10342/1034236536.html
Port3 ttp://pc3.2ch.net/tech/kako/1023/10233/1023359282.html
Port2 ttp://pc.2ch.net/tech/kako/1006/10062/1006258198.html
Port1 ttp://pc.2ch.net/tech/kako/970/970344582.html
まとめ ttp://makimo.to/cgi-bin/search/search.cgi?q=%83l%83b%83g%83%8F%81%5B%83N%81%40%91%8A%92k%8E%BA&andor=AND&sf=0&H=ikenai&D=tech&shw=2000
0003デフォルトの名無しさん
2007/02/09(金) 23:07:20UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
http://www.amazon.co.jp/exec/obidos/ASIN/4894712059/
そのソースコード
http://www.unpbook.com/src.html
詳解TCP/IP〈Vol.1〉プロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894713209/
詳解TCP/IP〈Vol.2〉実装
http://www.amazon.co.jp/exec/obidos/ASIN/4894714957/
詳解TCP/IP〈Vol.3〉トランザクションTCP, HTTP, NNTP, UNIXドメインプロトコル
http://www.amazon.co.jp/exec/obidos/ASIN/4894716674/
TCP/IPによるネットワーク構築
〈Vol.1〉原理・プロトコル・アーキテクチャ
http://www.amazon.co.jp/exec/obidos/ASIN/432012054X/
〈Vol.3〉クライアント‐サーバプログラミングとアプリケーション
http://www.amazon.co.jp/exec/obidos/ASIN/4320028007/
?Linux/POSIXソケットバージョン
http://www.amazon.co.jp/exec/obidos/ASIN/4320120841/
?Windowsソケットバージョン
http://www.amazon.co.jp/exec/obidos/ASIN/4320029992/
0004デフォルトの名無しさん
2007/02/09(金) 23:08:04http://www.amazon.co.jp/exec/obidos/ASIN/4274065618/
Linuxソケットプログラミング?ネットワークプログラミングにおける実践技法
http://www.amazon.co.jp/exec/obidos/ASIN/4894714671/
Webプロトコル詳解?HTTP/1.1、Webキャッシング、トラフィック特性分析
http://www.amazon.co.jp/exec/obidos/ASIN/4894715414/
WinSock2.0プログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/
猫でもわかるネットワークプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4797323604/
IPv6ネットワークプログラミング
http://www.amazon.co.jp/exec/obidos/ASIN/4756142362/
Visual Basicではじめるネットワークプログラミング超入門
http://www.amazon.co.jp/exec/obidos/ASIN/4839917523/
0005デフォルトの名無しさん
2007/02/09(金) 23:08:42★規格
RFC 日本語版リスト
http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html
JPNIC RFC関連リンク集
http://rfc-jp.nic.ad.jp/link/
RFC Editor
http://www.rfc-editor.org/
HTMLなRFC (セクションを直に示すのに便利)
http://www.freesoft.org/CIE/RFC/
RFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳
http://www.studyinghttp.net/rfc_ja/2616/rfc2616_ja.html
IANA Well known port numbers
http://www.iana.org/assignments/port-numbers
★プログラミング
C10K ヘヴィーロードサーバ
http://www.kegel.com/c10k.html
MSDN
http://msdn.microsoft.com/library/en-us/dnsitehelp/html/tochelp.asp
Raw IP Networking FAQ
http://www.whitefang.com/rin/
Java で packet capture
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/
Randomness Recommendations for Security
http://www.faqs.org/rfcs/rfc1750.html
BoostSocket
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?BoostSocket
The Code Project - Internet & Network programming
http://www.codeproject.com/internet/
ネットワークプログラミングの基礎知識 (問題ありのサイト?)
http://X68000.q-e-d.net/~68user/net/
0006デフォルトの名無しさん
2007/02/09(金) 23:09:33ethereal - http://www.ethereal.com/
Wireshark - http://www.wireshark.org/
tcpdump - http://www.tcpdump.org/
Windump - http://netgroup-serv.polito.it/netgroup/tools.html
WinPcap - http://www.winpcap.org/
pathchar - ftp://ftp.ee.lbl.gov/pathchar/
pchar - http://www.employees.org/~bmah/Software/pchar/
Packetyzer - http://www.networkchemistry.com/products/packetyzer/
libevent - http://www.monkey.org/~provos/libevent/
★プロトコル
TTCP
http://www.sean.de/Solaris/ttcp.html
http://www.kohala.com/start/ttcp.html
UDP Hole Punching
http://homepage3.nifty.com/toremoro/p2p/firewall.html
★IP, TCP実装
http://www.iti.fi/documentation/miniip.html
http://www.sics.se/~adam/uip/
http://www.codeguru.com/Cpp/I-N/network/tcpip/article.php/c5447/
http://www.geocities.jp/bruce_teller/security/garakuta.htm
00071
2007/02/09(金) 23:15:50前スレと同じテンプレで立てさせてもらった。
次スレを立てる人へ
>>5のRFC 2616 "Hypertext Transfer Protocol -- HTTP/1.1" 日本語訳のアドレスは
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616 に変わっているから立てるときに変えてください。
0008デフォルトの名無しさん
2007/02/10(土) 00:02:510009デフォルトの名無しさん
2007/02/10(土) 01:15:47Java ネットワークプログラミング 【教えて!】
http://pc10.2ch.net/test/read.cgi/tech/1086238859/
0010デフォルトの名無しさん
2007/02/12(月) 00:35:110011デフォルトの名無しさん
2007/02/17(土) 14:15:40send/recvを使ってHTTP通信したいのですが、ブロックしてしまうのを回避するために
・send/recv前に毎回selectして調べる
・非同期でsend/recvしてh_errorを調べる
の方法は適切ですか?
0012デフォルトの名無しさん
2007/02/17(土) 14:30:190013デフォルトの名無しさん
2007/02/17(土) 14:36:55・無限ループのスレッドでずーっとread、メインはセマフォ待ちで待機。
・改行の受信か相手側のクローズを検知したらセマフォを解放
これが正しいモデルだと思うけど、どうよ。
0014デフォルトの名無しさん
2007/02/17(土) 15:09:400015デフォルトの名無しさん
2007/02/17(土) 15:57:440016デフォルトの名無しさん
2007/02/17(土) 16:04:37最悪なのはI/O待ちもsleepもない計算だけのループ。
0017デフォルトの名無しさん
2007/02/17(土) 16:23:51そのスレッドを綺麗に終了させる手段がないじゃん。
イベントとI/Oの両方を待機させるような作りにするのが定石じゃないの。
0018デフォルトの名無しさん
2007/02/17(土) 16:43:28I/Oにイベントを流してやる
001911
2007/02/17(土) 17:45:45後出しになって申し訳ないのですが、実はApache + C++CGIとして動作させています。そのため、スレッドの生成は避けたいと思っています。
CGIの待機中プロセスが増えすぎてしまわないためにタイムアウトを設けたいと思って質問しました。
少なくとも毎回selectするくらいなら非ブロックモードにするべきのようですね。
非ブロックでsend/recvし、ソケットが閉じられるまでループさせる方法で試してみます。
0020デフォルトの名無しさん
2007/02/17(土) 18:34:48そうそう、
socketのイベントとpthread_cancelを同時に待つ方法が知りたい。
0021デフォルトの名無しさん
2007/02/17(土) 18:47:00スレッドでソケットでセレクト
0022デフォルトの名無しさん
2007/02/18(日) 00:35:09> 少なくとも毎回selectするくらいなら非ブロックモードにするべきのようですね。
なことはない
0023デフォルトの名無しさん
2007/02/18(日) 15:55:130024デフォルトの名無しさん
2007/02/19(月) 08:43:58ITU, IEEE, ISOに比べればね。
0025デフォルトの名無しさん
2007/02/19(月) 11:37:130026デフォルトの名無しさん
2007/02/20(火) 03:40:15みたいに送ってくるけど、\はquoted-pairになるから、これって違法な
気がするんだが・・
0027デフォルトの名無しさん
2007/02/20(火) 11:07:40環境はWindowsXPです
名前解決を変更するのにHostsをいじればいいわけですが
ドメインではなくて実際のIPにフィルターかけることって出来ますかね?
192.168.1.90 -> 192.168.1.100
90へのリクエストはすべて100へ行くようにしたいわけです
ソケットフックするしかない?
0028デフォルトの名無しさん
2007/02/20(火) 22:38:18(IP->IPのマッピングじゃないけど。)
0029デフォルトの名無しさん
2007/02/20(火) 22:39:49自分のIP宛でないパケットが来たところで無視されるのがオチだな。
0030デフォルトの名無しさん
2007/02/20(火) 23:16:24パケットフィルタで書き換える
・振り替えを実行したいマシン毎で、192.168.1.90に対して、192.168.1.100のMACを
static ARPとして設定する。そのうえ、192.168.1.100のマシンで、ループバック
インターフェースに、192.168.1.90/32を割り当てる。100のマシンのホストモデルが
「強力」なら「弱い」にしておく。
くらいしか思い浮かばないな。
0031デフォルトの名無しさん
2007/02/20(火) 23:18:530032デフォルトの名無しさん
2007/02/20(火) 23:24:440033デフォルトの名無しさん
2007/02/21(水) 16:18:2690内でだけで解決しないといけない
0034デフォルトの名無しさん
2007/02/21(水) 18:19:00裏と表がひっくり返った50円玉やるよw
0035デフォルトの名無しさん
2007/02/21(水) 19:55:510036デフォルトの名無しさん
2007/02/21(水) 23:55:52リクエスト元が192.168.1.90、100と違うサブネットなら、境界のルータで
NATかければいい。
同じサブネットなら、無理やりな方法になるけど>>30 かな?
>>32
(NAPTじゃない)NAT、それも固定NATなら、対称なんだから逆も何もない。
0037デフォルトの名無しさん
2007/02/22(木) 11:48:19ローカルから接続する対象をリアルタイムで変更したいわけ
ソフトによってはIP固定で通信してるからそれに対応したいということ
NATってあて先変更できたっけ?
90のほうにNATソフトいれたら出来るんだっけ?
そういう機能があるソフト知ってたら教えて下さい
0038デフォルトの名無しさん
2007/02/22(木) 14:37:41UDP Hole Punching
http://homepage3.nifty.com/toremoro/p2p/firewall.html
の中のNATの説明読んでから出直してくれ。
そしてプログラミングに関連づけて質問し直してくれ。
0039デフォルトの名無しさん
2007/02/22(木) 17:08:33ソケットをフックするよりドライバ書いてるほうがはるかに手間がかかるので
NATの原理で出来るというアドバイスは愚の骨頂です
最初に書いた通り、こちらの最も望むものはフックするより手間の掛からない方法です
0040デフォルトの名無しさん
2007/02/22(木) 17:53:01馬鹿だなあ。
知識足りないんだから、大人しく教えを乞えばいいのに…
0041デフォルトの名無しさん
2007/02/22(木) 21:00:560042デフォルトの名無しさん
2007/02/22(木) 21:02:010043デフォルトの名無しさん
2007/02/25(日) 19:17:26ttp://www.jptm.net/memo/index.php?cmd=read&page=WinPcap%A4%F2%BB%C8%A4%C3%A4%BF%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0&word=winpcap
とりあえずこのページのサンプルを実行してみましたが、
いまいちよくわからず・・・
このサンプルではrtspとかmmsとかをキャプチャできるのでしょうか?
というか全然知識が足りないので
読んだ方がよいページとかありましたら
紹介お願い致しますm(_ _)m
0044デフォルトの名無しさん
2007/02/25(日) 22:16:38http://www.ietf.org/rfc/rfc2326.txt
mms、mmshはmplayer、xineとかのコードとかでしょうか。
004543
2007/02/27(火) 07:27:19というかまだ全然プロトコル解析の段階にいってません・・・orz
メディアプレイヤーで以下のアドレスを再生させると
mms://wms.g2.cdn.bcast.co.jp/yahoo/ystream/kad/10193/kad1019300001100000b929.asf?session_id=b4d2575ccae7b6b454cece0e68ea0860&product_id=
取得パケットの中には
202.93.94.14
という外部アドレスだけが見つかりました。
ttp://www.cman.jp/network/support/ip.html
で調べたところ、
wms.g2.cdn.bcast.co.jp
というのは
202.93.94.16
というアドレスであると出たのですが
逆に
202.93.94.16
を調べたら
wms06.g2.bbt.bcast.co.jp
と出ていました。
004643
2007/02/27(火) 07:28:53を調べたら
wms04.g2.bbt.bcast.co.jp
と出ていました。
でももう一度改めてパケット取得してみたら
202.93.94.15
というアドレスだけが見つかりました。
wms.g2.cdn.bcast.co.jpというドメイン名からは
正確なIPアドレスはわからないものなのでしょうか?
0047デフォルトの名無しさん
2007/02/27(火) 07:40:33202.93.94.16 202.93.94.15 202.93.94.18 202.93.94.17
「正確なIPアドレス」の定義がよくわからんが、1つのDNS名が
複数のIPアドレスを持つのは、負荷分散的によくあること。
0048デフォルトの名無しさん
2007/02/28(水) 06:05:23DNSラウンドロビンだのぉ。
0049デフォルトの名無しさん
2007/03/01(木) 07:12:46winsockのプログラミング勉強してます。
recv関数でよくselect使用して、タイムアウト処理すると思います。
同じようにして、accept関数のタイムアウト処理をしたいと思ってますが、
accept関数呼ぶ前に、select関数使えないんでしょうか。
FD_ZERO(&readfds);
FD_SET(soc,&readfds);
select(width,&readfds,NULL,NULL,&timeout)
socは、きちんと渡せていたんですが、接続試しても
select抜けられずに、全部タイムアウトになります。
accept呼んでからじゃないと、ソケットの読み取り可能か
わからないのでしょうか。
やりたいこと伝わりませんでしたら、
補足させていただきます。
0050デフォルトの名無しさん
2007/03/01(木) 07:49:080051デフォルトの名無しさん
2007/03/01(木) 09:32:35WSAStartup->socket作成->bind->listen->accept->select呼んでrecv
よくあるrecvのタイムアウトは、こんな順番だと思います。
accept関数もずっと待ち状態になるので、recvのときと同じように
タイムアウトの機能を、追加できないかと考えてます。
WSAStartup->socket作成->bind->listen->select呼んでaccept->recv
なぜか、クライアントから接続してもselectから、抜けられないんです。
タイムアウトだけでしか抜けられません。
・acceptした後でないと、ソケットの読み取り可能かわからず
select関数使え無い。ということがあるのかと思いましたが
気のせいでしょうか。
>selectの最初の引数が気になるけど、それでOK.
selectにも、きちんと引数渡せてるようなので、
どこがおかしいのかわからないです。
もうちょっと、ポイントしぼれるようにがんばってみます。
レスありがとうございました。
0052デフォルトの名無しさん
2007/03/01(木) 10:04:44あれれ、ソースコード特にどこも変えた覚えないのですが、
listenのときのソケットディスクリプタと
acceptの返すディスクリプタの値比べて、
同じ値が表示されてるの確認作業したりしていたら、
いつのまにかタイムアウトの処理できていました。
んー、ほんとにどこも変えた覚えは無いのですが・・・
原因説明できなくて、すみません。
acceptもrecvとほぼ同じコードで、タイムアウト処理できました。
どうもお騒がせいたしました。
ありがとうございました。
0053デフォルトの名無しさん
2007/03/01(木) 10:19:20アプリの終了処理の時に使えますね。
0054デフォルトの名無しさん
2007/03/02(金) 11:58:52selectを使ったpollの実装ってどこかに転がってたりしませんでしょうか?
ぐぐったのですがいいのがなくて。
既出だったらスマソ
0055デフォルトの名無しさん
2007/03/02(金) 13:25:260056デフォルトの名無しさん
2007/03/02(金) 16:07:36WSAEventSelectで登録して、WaitForMultipleObjectsがWinSockの作法。
WaitForMultipleObjectsの上限に引っかかるぐらいのスケールなら、IoCompletionPort。
0057デフォルトの名無しさん
2007/03/02(金) 16:38:26手抜き移植でソースをなるべく変えずにpoll()を使いたいってこと?
cygwinは、WaitForMultipleObjects()を用いてselect(), poll()を
エミュレートしてるはずなので、cygwinのソースを読むと良い。
つか、移植の手間を一切掛けたくないのなら、ぶっちゃけcygwinで
コンパイルすればいいだけなのだが。cygwin1.dllには依存するけどな。
一から自分で書くなら、>>56の言うようにIOCPがWindowsではもっとも
効率がよく、しかも色々応用が利いて便利だ。NT系のOSでしか使えないが。
0058デフォルトの名無しさん
2007/03/04(日) 03:37:06中級ネットワークプログラミングみたいな本で
お勧めの本はありませんか?
英語でも構いません。
amazon.co.jpや、お勧め書籍スレ/ページは色々見てみましたが
基礎的なソケットの使い方などの本が多いようです。
それなりに実用的なネットワークソフトの解説のようなものがあれば幸いです。
ソース嫁ってことになるのかも知れませんが、よろしくお願いします。
0059デフォルトの名無しさん
2007/03/04(日) 18:32:12質問させてください。
環境:Windows2000/XP
会社で営業部ドメイン(EIGYO)と、技術部(GIJYUTU)があります。
自分のPCは、GIJYUTUに属してます。
UNC(\\EIGYOU\フォルダ名の形式)を使って、営業部ドメインの
共有フォルダにアクセスする事は出来るのですが、
「マイネットワーク」を開いて、営業部ドメイン(EIGYO)にアクセスする事が
出来ません。営業部ドメイン(EIGYO)自体表示されない。
「マイネットワーク」に、自分が所属していないドメインを表示させる方法って
ありますでしょうか。
プロトコルをヘッダ込みで実装してみるとか
メーラーを作ってみるとかするのがいいと思う
プロトコルのコマンドやフォーマットはネットで探せるし
Etherealを使えばアプリがやり取りしているパケットも見れる
ドライバ、apacheなどのモジュールを作るのもいい
中級を目指すならこれから作るものを定めておいたほうがよいのでは
などといってみる
レベルが上がるにつれて道程は細分化していくから
0061デフォルトの名無しさん
2007/03/05(月) 22:26:310062デフォルトの名無しさん
2007/03/06(火) 12:21:29>>56 >>57 �dクス
手抜き移植と言うか、今後のメンテを考えて、
unix/linux版とwin版でできるだけ統一ソースにしておきたいんですよねぇ...
socketのラッパーみたいなのがあるといいなぁとオモタのですが、
自分で書くことにしますです。
0063デフォルトの名無しさん
2007/03/06(火) 12:28:210064デフォルトの名無しさん
2007/03/06(火) 15:00:24$(GLIBC)/sysdeps/unix/bsd/poll.c 使えそうですね。どもです。
0065デフォルトの名無しさん
2007/03/06(火) 16:38:00http://cygwin.com/snapshots/cygwin-src-20070301.tar/cygwin-snapshot-20070301-1/winsup/cygwin/poll.cc
にそのものずばりのselectをつかったpollの実装がありますた(・∀・)
cygwin_selectを使っているのでこの部分をwin32sdkの_selectに移植する必要がありますがだいぶ参考になりそうです。
0066デフォルトの名無しさん
2007/03/06(火) 20:13:17for (i = 0; i < nfds; ++i) {
fds[i].revents = 0;
if (!cygheap->fdtab.not_open (fds[i].fd)) {
sysdeps/unix/bsd/poll.c ってこんな実装になってるんですね... 総当り(笑)
やはり発想変えてpollになっているところをselectに直すほうがいいのかなぁ。
教えてエロイ人
0067デフォルトの名無しさん
2007/03/06(火) 20:15:50どこでも使えるselectにするとか
するしかないんじゃないの。
0068デフォルトの名無しさん
2007/03/07(水) 11:11:56サーバのあるディレクトリにアクセスすると、はじめの1回目の認証で
ダイアログボックスが表示されますが、2回目以降はそのディレクトリ以下に
アクセスしても表示されなくなります。
この機能は、サーバとクライアントどちらの機能で実現されているのでしょうか。
Basic認証では、ログインではなくて、毎回ID、PASSを送信しているということなので
「サーバの方では特に何もせずに、クライアントの方でアクセスしたURLのアドレスを記録しておいて、
2年目以降は、その下のディレクトリにアクセスするときは、初めからリクエストのヘッダに
”Authorization: Basic hogehogehoge”を付けるようにしている。」というふうに考えたんですけど、
どうなのでしょうか。
よろしくお願いします。
0069デフォルトの名無しさん
2007/03/07(水) 11:39:03パケットモニタで調べてみますた。
クライアント側で毎回送ってますね。
Authorization: Basic hogehogehoge
をつけないでGET/POSTすると、応答に
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="Login"
みたいなのが帰ってきます。
0070デフォルトの名無しさん
2007/03/07(水) 12:03:29調べていただいてありがとうございます。
BASIC認証で一回アクセスしたら、何らかの仕組みで、
ブラウザの方でそのアクセスしたURL(ディレクトリ)を覚えておいて、
2回目以降そのディレクトリ以下にアクセスするときは、自動的に
ヘッダーにAuthorization: Basic hogehogehoge を付けてるんですね。
ふむふむ。それで、2回目以降はダイアログが出てこなくなると。
BASIC認証できるhttpサーバもどきを、勉強の課題で作ってますが、
サーバ側でなにか大掛かりな仕組みでもあるのかと、心配になりまして。
パケットモニタというのも、知らなかったので勉強になりました。
どうもありがとうございました。
0071デフォルトの名無しさん
2007/03/07(水) 13:28:19そういう調査技能もあると便利だが
HTTPに関してはRFC2616とかに全部定義されている
0072デフォルトの名無しさん
2007/03/07(水) 17:16:40sockB = accept(sockA, &addr, &size)のような形で子スレッドで
動かしていて、acceptでブロックされてます。アプリケーション終了時に
親スレッドでclosesocket(sockA)という風に処理していいのでしょうか?
0073デフォルトの名無しさん
2007/03/07(水) 17:30:20「処理していいのでしょうか?」の意味が、
処理して正しく動作するのでしょうか?
→知らん。試せばわかる。>>72が期待している動作(acceptを抜けるか/抜けないか、
抜けるときのsockBの値、GetLastErrorの値、etc) を知りようがないのに
正しい動作も何もない。
一般的にそのような処理をするものなのでしょうか?
→マルチスレッドを真面目に考えたプログラムなら、イベント使って、
非同期Acceptをするので、このような状況に陥らない。
0074デフォルトの名無しさん
2007/03/08(木) 10:21:30回答ありがとうございます。
もっとマルチスレッドやイベントについても勉強しないといけないようでした。
0075デフォルトの名無しさん
2007/03/09(金) 18:56:05サーバ側:ダウンロードしたファイル
クライアント:ダウンロードの途中のファイル
こういう状況だったとします。
1.接続しクライアントに途中のファイルがあるかどうかを確認。
2.クライアント:ファイルを読み込んでハッシュ値を出し、「ファイルの名前:読み込んだ文字列の長さ:ハッシュ値」を送信
3.サーバ:「ファイルの名前:読み込んだ文字列の長さ:ハッシュ値」を受信します。
4.サーバ:読み込んだ文字列の長さ分(Nとします)、ファイルから文字列を読み込んでハッシュ値を出し、クライアントからのハッシュ値を比較
5.ハッシュ値が一致した場合は、seek関数でファイルのポイントをN個移動して、そこから読み込んで順番にデータを送信
こういう感じでしょうか?
修正、追加する場所、その他気をつけることなどありましたら
アドバイスよろしくお願いします。
0076デフォルトの名無しさん
2007/03/09(金) 22:26:230077デフォルトの名無しさん
2007/03/09(金) 22:57:350078デフォルトの名無しさん
2007/03/10(土) 00:05:400079デフォルトの名無しさん
2007/03/10(土) 03:24:23もっと新しいRFCがあるのか?
0080デフォルトの名無しさん
2007/03/10(土) 07:57:54同じファイルか、確認のため比較する容量が大きいと転送が大変だと思いまして。
>>76
>Range:bytes=100-
httpのヘッダー情報に、こういうのがあったとは。
でもブラウザは、途中からのものをダウンロードできても、
上書きだけみたいですね。
>>78
ttp://www2s.biglobe.ne.jp/~hig/tcpip/HostReq_Appl.html#HREQAPP_4_1_3_4
サーバ FTP は、データストリーム中の都合の良い箇所に再開マーカ <ssss> を付ける
buf="hogehoge";を送信するとき、
"<ssss>hogehoge"を送信して、
・サーバ側では、send()するとき、<ssss>をbufのどこか適当な位置に挿入して送信
・クライアント側では、recv()するたびに、制御ファイルの(ssss,rrrr) を更新。
・再開するときは、<ssss>を送信。
とリンク先見てこいうことかと想像してたんですが、実際の実装で
送られてくるクライアントに、送信される文字列bufって、どんな形なんでしょうか。
RFCでどこに書いてあるのか探してるんですが、よくわかりません。
0081デフォルトの名無しさん
2007/03/10(土) 09:01:48通信の中身は、パケットモニタで見るという方法がありました。
0082デフォルトの名無しさん
2007/03/10(土) 09:15:33> とリンク先見てこいうことかと想像してたんですが、実際の実装で
> 送られてくるクライアントに、送信される文字列bufって、どんな形なんでしょうか。
> RFCでどこに書いてあるのか探してるんですが、よくわかりません。
とにかくRFCを読んで。
解説ページに惑わされないで。
0083デフォルトの名無しさん
2007/03/10(土) 11:18:57まだdraftだけど。
http://www.ietf.org/internet-drafts/draft-ietf-ftpext-mlst-16.txt
0084デフォルトの名無しさん
2007/03/10(土) 12:00:50おお。5.1でSTREAMモードでの再開が規定されとる
> Expiration Date: March 2003
が気になるけど
0085デフォルトの名無しさん
2007/03/10(土) 17:59:47なにげに、この方法よいのかも?
0086デフォルトの名無しさん
2007/03/10(土) 18:03:110087デフォルトの名無しさん
2007/03/10(土) 18:51:57確かに大きそう。まあSSL通信に比べれば
そんなでも、ないかもしれないけど。
0088デフォルトの名無しさん
2007/03/10(土) 21:53:00手順4見てみろ
0089デフォルトの名無しさん
2007/03/10(土) 23:56:010090デフォルトの名無しさん
2007/03/11(日) 00:05:22クライアント側で計算させて一致しないのだけやり直しが普通の発想だろ
0091デフォルトの名無しさん
2007/03/11(日) 03:00:14w
>>89-90
同意
0092デフォルトの名無しさん
2007/03/11(日) 05:51:090093デフォルトの名無しさん
2007/03/11(日) 11:28:22ブロックの長さはどれぐらいが適当でしょうか。
仮に64kByte毎だと1MB辺り64Byteで済みますが、
これは冗長でしょうか。
0094デフォルトの名無しさん
2007/03/11(日) 12:06:46サーバとクライアントでそれぞれ2,3箇所ピックアップして、
ハッシュ求めれば十分じゃん。
あとダウンロードは、なんも処理しないでいいんだし。
ただ、これをいうと、ハッシュじゃなくてもいいんだよな。w
どれだけ'同じファイルであるかの確かさ'を求めるかだ。
毎回なんか処理しながらダウンロードって、しないに越したことは無いでしょ。
突っ込みの嵐の予感。
0095デフォルトの名無しさん
2007/03/11(日) 13:37:08> ただ、これをいうと、ハッシュじゃなくてもいいんだよな。w
>>76
0096デフォルトの名無しさん
2007/03/12(月) 00:53:50ブロック長が長くなるほど衝突が増える。
ブロック長が長くなるほど再送に無駄が増える。
後は自分で考えて。
>>94
普通、まずサイズや最終更新時間を調べるでしょ。
そんなわけでFTPだってSIZEとMDTMコマンドがある。
0097デフォルトの名無しさん
2007/03/12(月) 01:05:380098デフォルトの名無しさん
2007/03/13(火) 00:11:12可変長文字列で詰まってしまいました。
struct message{
int size;
char buf[1];
}
struct message *p;
p = (struct message *)malloc( sizeof(struct message) + strlen(input) );
送信したい文字列をinputに格納して、その長さに合わせてこのmessage構造体をmallocしているのですが、
受信側ではなぜか文字列が途中で途切れてしまいます。
可変長を実装するにはこのやり方は間違っているのでしょうか?
0099デフォルトの名無しさん
2007/03/13(火) 00:31:48010098
2007/03/13(火) 01:03:07今色々デバッグしてみたところ、sendtoで送信できているサイズが、sizeof(struct message)と同じ値でした。きちんとmallocはしているはずなのですが…
0101デフォルトの名無しさん
2007/03/13(火) 01:41:23010298
2007/03/13(火) 02:16:30send:
sendto( s,p,sizeof(struct message) + strlen(input),0,(struct sockaddr *)pfrom,fromlen );
recv:
recvfrom(s,p,sizeof(p)+20,0,(struct sockaddr *)pfrom,fromlen);
といった感じに改造したところ、短いメッセージならきちんと受信できるようになりました。ただ20という数字が適当なので、この部分をきちんとinputの長さに合わせたいです。
0103デフォルトの名無しさん
2007/03/13(火) 09:24:59C言語のテキスト見直ししる。
010498
2007/03/13(火) 11:23:32ありがとうございました。
0105デフォルトの名無しさん
2007/03/13(火) 12:46:23> sizeof(p)がstruct message *pなんだろうなぁ
これは>>98のミス原因をつぶやいただけだろ。
Cの勉強し直してくれ。Cが分からないから>>103を誤読する。
0106デフォルトの名無しさん
2007/03/13(火) 12:49:16struct message{
int size;
char buf[0];
}
と定義できるぞ。
これで出来ることは増えないが、サイズ計算が単純になる。
http://seclan.dll.jp/c99d/c99d04.htm#dt19990726
0107デフォルトの名無しさん
2007/03/13(火) 14:00:49recvfrom(s,p,sizeof(p)+20,0,(struct sockaddr *)pfrom,fromlen);
で、pの宣言がstruct message *pなら
sizeof(p)+20=24ぐらいになるってことでしょ?
paddingとか32bit環境とかは置いといてね。
0108デフォルトの名無しさん
2007/03/13(火) 20:20:03C99以前は配列の最終要素を踏み越えるのは厳密には未定義じゃなかったっけ
0109デフォルトの名無しさん
2007/03/13(火) 20:57:030110デフォルトの名無しさん
2007/03/13(火) 21:00:07"本当に"外部ネットワークからアクセスできるか確かめる方法って
外部にそれようのサービス立てておいてそれを叩くしかないよね?
0111デフォルトの名無しさん
2007/03/13(火) 21:03:34携帯電話からアクセスしたら?
0112デフォルトの名無しさん
2007/03/13(火) 21:05:53ポートを空けたプロセス自身から確かめる方法
0113デフォルトの名無しさん
2007/03/14(水) 19:50:51[サーバ(accept側)]−[クライアント(connect側)]
こんな感じで繋がっている時、
1秒間にサーバからsendできるデータの限界量=上り帯域
1秒間にクライアントからsendできるデータの限界量=下り帯域
という概念で合ってるでしょうか。
0114デフォルトの名無しさん
2007/03/14(水) 23:51:36sendはtcpの送信バッファにコピーするだけ。
0115デフォルトの名無しさん
2007/03/15(木) 02:01:58どんどん捨ててるだけということもあり得るし
0116113
2007/03/15(木) 20:53:071秒間にサーバ/クライアントから送信できるデータの限界量=上り/下り帯域(/sec)
という事でしょうか?
0117デフォルトの名無しさん
2007/03/15(木) 21:07:50糊=ごはんつぶというわけではない
0119113
2007/03/17(土) 02:47:410120デフォルトの名無しさん
2007/03/18(日) 00:54:02HTMLで言うところのformからPOSTでCGIを呼ぶってことです。
0121デフォルトの名無しさん
2007/03/18(日) 01:04:510122デフォルトの名無しさん
2007/03/18(日) 09:58:270123デフォルトの名無しさん
2007/03/18(日) 11:05:240124デフォルトの名無しさん
2007/03/18(日) 11:14:560125デフォルトの名無しさん
2007/03/18(日) 14:22:26まとめてください。
0126デフォルトの名無しさん
2007/03/18(日) 15:21:000127デフォルトの名無しさん
2007/03/18(日) 17:17:470128デフォルトの名無しさん
2007/03/18(日) 17:29:290129デフォルトの名無しさん
2007/03/18(日) 21:00:240130デフォルトの名無しさん
2007/03/19(月) 16:02:54チャットソフトです。
・print、strcpyとか気を付けるのと、ほかになにかあるでしょうか。
・もしも、WEBサイトに文字列を表示させる場合は、メタキャラクタのエスケープ処理ですよね。
検索したところ、これぐらいかと思ったのですが、まだまだたくさんあるでしょうか。
アドバイスよろしくお願いします。
0131デフォルトの名無しさん
2007/03/19(月) 20:13:39ttp://www.freebsd.org/ja/security/#spg
ここが参考になるよ
0132デフォルトの名無しさん
2007/03/19(月) 21:57:22ありがとうございます。
参考にさせていただきます。
0133デフォルトの名無しさん
2007/03/21(水) 04:01:45決まってると思いますが、プログラミングしてて
長さがわからなくなるときって、どんなときですか。
0134デフォルトの名無しさん
2007/03/21(水) 04:41:280135デフォルトの名無しさん
2007/03/21(水) 04:43:10TCPなら繰り返し受信すればいい
UDPだったら1つのパケットに入りきらないメッセージが来ること自体あり得ない
0136デフォルトの名無しさん
2007/03/21(水) 16:02:47長さがわからなくなるときは、無い
長さは必ず返却される
0137デフォルトの名無しさん
2007/03/21(水) 17:24:33レスありがとうございます。
ネットワークプログラミングでは、バッファ・オーバー・フローは
気にしなくても大丈夫なんでしょうか。
気を付けて使ってるのかわからないですが、猫でもわかるとか、
他の本でもstrcpy使用してみるみたいです。
strncpy、snprintfは全然見ないような。
0138デフォルトの名無しさん
2007/03/21(水) 17:38:07長さを無視してるとダメだけど、
それはネットワークに限った話じゃないし
0139デフォルトの名無しさん
2007/03/21(水) 18:01:20バッファオーバーフローは無論あってはならない。特にネットワークプログラミング
においては重大なセキュリティホールに繋がりかねないので、強く意識すべき。
C++を使えるのなら、Cなんぞ使わずにstringやvector<>を使うことを薦める。
0140デフォルトの名無しさん
2007/03/21(水) 18:02:44基本を何も分かってないって事だろ。
まず系統的に解説してある入門書読めよ。
0141デフォルトの名無しさん
2007/03/21(水) 20:56:110142デフォルトの名無しさん
2007/03/22(木) 02:26:15レスありがとうございます。
>それはネットワークに限った話じゃないし
>C++を使えるのなら、Cなんぞ使わずにstringやvector<>を使うことを薦める。
とても勉強になりました。ありがとうございました。
0143デフォルトの名無しさん
2007/03/25(日) 01:22:19判別できるんですか?
ブラウザ(IE)に偽装した形でhttpリクエストを出したいんです。
0144デフォルトの名無しさん
2007/03/25(日) 01:34:49スレ違い
http://pc11.2ch.net/php/
0145デフォルトの名無しさん
2007/03/25(日) 11:49:08ajax使うしかないな
だが単純に普通にIE使ってたら最初の一発目は偽装不能
0146デフォルトの名無しさん
2007/03/28(水) 09:16:33ポーリングするのが一般的でしょうか?
0147デフォルトの名無しさん
2007/03/28(水) 09:58:480148デフォルトの名無しさん
2007/03/28(水) 10:02:270149デフォルトの名無しさん
2007/03/28(水) 10:06:18ブロックさせたいんじゃねーのかよ
0150デフォルトの名無しさん
2007/03/28(水) 10:17:50思うわけです。
0151デフォルトの名無しさん
2007/03/28(水) 10:52:300152デフォルトの名無しさん
2007/03/28(水) 11:00:530153デフォルトの名無しさん
2007/03/28(水) 11:09:140154デフォルトの名無しさん
2007/03/28(水) 11:13:410155デフォルトの名無しさん
2007/03/28(水) 12:20:08その任意のタイミング発生装置(ttyとかXのイベントとか)も
selectに含ませてブロックさせる。
0156デフォルトの名無しさん
2007/03/28(水) 12:27:59なるほど
あなた、もしかして天才?
0157デフォルトの名無しさん
2007/03/28(水) 12:48:320158デフォルトの名無しさん
2007/03/28(水) 12:58:46すみません。本当はよく意味がわかってません。
しかーし、外部からselectを抜けさせればよいということですよね!
0159デフォルトの名無しさん
2007/03/28(水) 13:00:22http://www.geekpage.jp/programming/linux-network/select-eintr.php
0160デフォルトの名無しさん
2007/03/28(水) 21:28:56スレッド2:問答無用でsend
0161デフォルトの名無しさん
2007/03/28(水) 21:39:18( ・∀・)イイ!!
0162デフォルトの名無しさん
2007/03/29(木) 04:21:500163デフォルトの名無しさん
2007/03/29(木) 04:25:43今解らないことだらけでしょ?>プログラム作ってて
ソケットとかスレッドとか。
もしそうなら本買って勉強したほうがいいと思うよ
0164デフォルトの名無しさん
2007/03/29(木) 04:43:26たとえばWinsockはスレッドセーフであることは保証されていない
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html
0165デフォルトの名無しさん
2007/03/29(木) 12:01:30同時に複数の男が出し入れすることはできない。
一人がIOしているときは、他の奴が待つように作らないとバグるよ。
0166デフォルトの名無しさん
2007/03/29(木) 12:21:35その説明だと、1 socketに対し、3 thread同時にI/Oできるように読めるが?
また、thread同士でもI/Oできることになるので、適当な例えではない。
0167デフォルトの名無しさん
2007/03/29(木) 12:29:17(゚Д゚)ハァ?
0168デフォルトの名無しさん
2007/03/29(木) 12:33:50(もう一つ穴があるだろ、はなしね)
socket自体はスレッドセーフではないが、スレッド間で同時にIOを
行わないように制御すれば、複数スレッドで単一socketを使うことは可能じゃね?
しかし、それでもデータ内容がごちゃごちゃになる可能性があったりするし、
あまり良い方法とは思わないが。
誰の子供かわかんな〜い、になっちゃう。
0169165
2007/03/29(木) 12:37:390170デフォルトの名無しさん
2007/03/29(木) 12:54:30別の板でやれ
0171デフォルトの名無しさん
2007/03/31(土) 00:26:080172デフォルトの名無しさん
2007/03/31(土) 05:45:21接続先のIPアドレスに自分のマシンのプライベートアドレス指定しているときは、正常に動作しますが
グローバルアドレスを指定すると、connectからエラーコード10061 (接続が拒否された)が返ってきます
Windowsファイヤウォールによるブロックは、されてない様子です
ネットワーク初心者ですが、どういうケースが考えられるでしょうか
よろしくお願いします
0173172
2007/03/31(土) 08:18:29テストを行うには、リモートマシンを使わないといけないんでしょうか
0174デフォルトの名無しさん
2007/03/31(土) 08:43:37うちはファームのバージョンあげたらできるようになった
0175172
2007/03/31(土) 10:20:27同じくconnectでエラーコード10061が発生します。何がいけないんでしょうか
0176デフォルトの名無しさん
2007/03/31(土) 10:55:02もしそうならbind呼び出しのところのコードを晒せ
0177デフォルトの名無しさん
2007/03/31(土) 11:21:02折り返し機能がないか(>>175はこの問題と関係ないが)。
どっちにしても、ルータの設定の見直しが必要だと思います。
0178172
2007/03/31(土) 11:30:340179デフォルトの名無しさん
2007/03/31(土) 14:12:13壊しちゃってごめん。
0180デフォルトの名無しさん
2007/04/01(日) 07:11:29ネットワーク勉強したところです。
もっと、複雑な通信規則のアプリを作りたいとき、
なんの命令待ちか状態の推移の管理の仕方で、
わかりやすいサンプルプログラムや本などないでしょうか。
本屋に行ってもいい本みつからないです。
・データを送信したので、OKを待っている状態
・データを待ってる状態
どんどん何を待ってるか、変わってくると思うんです。
よろしくお願いします。
0181デフォルトの名無しさん
2007/04/01(日) 09:50:10WINDOWSの方で、2回に分けてrecv()が呼ばれているようでした。
■linux
send(soc,buf,strlen(buf)); //20000バイトの文字列を送信
WINDOWSのグローバルIPアドレスを指定して送信。
ブロッキングモード
■WINDOWS
while(1){
recv(soc,buf,sizeof());
}
ブロッキングモード
//2回に分けてrecvが呼ばれました。16000文字と4000文字
サイズが大きいときは、分けてrecv関数が呼ばれることを
想定してプログラミングしないとだめでしょうか。
16000バイトというのは、環境関係なく決まった数字ですか?
0182デフォルトの名無しさん
2007/04/01(日) 11:40:49TCPならどこで切られるか、どこでくっつくかは予想できない。
UDPで2回に分かれたというなら、バグじゃね?
0183デフォルトの名無しさん
2007/04/01(日) 23:11:470184デフォルトの名無しさん
2007/04/01(日) 23:35:54>>183
レスありがとうございます。
今回はTCPでした。UDPはそうでしたか。ふむふむ。
図書館で調べたら、パケット一個分だっり8000ぐらいのときもあったり
ばらばらなんですね。
ブロッキング、ノンブロッキング、ローカルホスト、リモートホスト
でも違うみたいです。
勉強になりました。
ありがとうございました。
0185デフォルトの名無しさん
2007/04/01(日) 23:46:37というか、TCPはストリームベースのプロトコルだから、そういうことは
一切仮定してはならない。
TCPは、実際にはいくつかのIPパケットとして送られるデータを
区切りの無いただのバイト列のように見せる。
TCPで「メッセージの区切り」のようなものが欲しければ、自分で(アプリ層で)
仕掛けを作りこまなければダメだ。
0186デフォルトの名無しさん
2007/04/02(月) 00:10:26大きなデータもらうときは、
std::string s;
s+=buf;
で、終わるまでこれを繰り返すようにして
解決できました。
勉強になりました。ありがとうございました。
0187デフォルトの名無しさん
2007/04/02(月) 00:55:210188デフォルトの名無しさん
2007/04/02(月) 01:32:020189デフォルトの名無しさん
2007/04/02(月) 05:37:590190デフォルトの名無しさん
2007/04/02(月) 09:42:440191デフォルトの名無しさん
2007/04/06(金) 14:02:00プログラムを開発したいのですが
この場合、制御される側にサーバアプリを置くのが一般的だと思っています。
しかし、それによって制御される側にWindowsファイアフォールを
開ける必要があると思うのですが、それをしたくないとしたら
管理端末にサーバアプリを置いて、制御端末にクライアントアプリを
置けばいいと考えています。
具体的にどのように考えているかというと
�@制御端末は管理端末にsendメッセージを送信したあとrecvメッセージがあるまでひたすら待ち続けます。
�Aそして管理端末の操作によりrecvメッセージが返り、そのメッセージの指示に従い動作します。
の繰り返しを行うのです。
この考え方に非現実的でないとか不備がありましたら、
指摘してもらえますでしょうか?よろしくおねがいします。
0192デフォルトの名無しさん
2007/04/06(金) 15:21:250193デフォルトの名無しさん
2007/04/06(金) 16:29:31変な言葉の使い方だな。
0194デフォルトの名無しさん
2007/04/06(金) 16:43:070195デフォルトの名無しさん
2007/04/07(土) 09:59:29世間様の常識と自分の常識は必ず一致するとは限らないわけだな
0196デフォルトの名無しさん
2007/04/07(土) 12:48:07ルータのWAN側グローバルIPを取得したいのですが、直接ルータに聞く方法ってありますでしょうか。
0197デフォルトの名無しさん
2007/04/07(土) 14:25:39・ADSLモデムのスレに行って、方法を聞く。
・tracedumpを使う。
・http://checkip.dyndns.org/などを使う。
というかそれプログラミングの話題と言うより、
ネットワークそのものの話題だな。
0198デフォルトの名無しさん
2007/04/07(土) 15:14:15Windowsアプリのプログラムの中で取得したかったんです。
httpでルータの管理画面にアクセスして、取得すると、機種依存するんで、
何か決まった方法があるのか知りたかったんです。
直接ルータではなく、一度、外にアクセスするのが一般的なんでしょうか。
0199デフォルトの名無しさん
2007/04/07(土) 15:24:08GetExternalIPAddressをサポートしてなかったら機種依存するか
外部に接続する方法しかない
0200デフォルトの名無しさん
2007/04/07(土) 15:43:37ありがどうこざいます。UPnPのサンプルが見付かりました。
ひとまずは、UPnP対応ルータみたいなので、これでいけそうです。
0201デフォルトの名無しさん
2007/04/10(火) 18:32:35MFCのCAsyncSocketについて教えてください。
クライアントのOnSendハンドラがコールされるときって
接続直後、ネットワーク障害発生以外に
どのようなケースがあるのでしょうか?
0202デフォルトの名無しさん
2007/04/11(水) 03:18:27送信バッファがいっぱいになったとき
もちろん送信バッファのサイズを仮定するプログラムを書いてはならない
(つまりいつでも呼ばれうると考えるべき)
0203デフォルトの名無しさん
2007/04/11(水) 09:26:49ありがとうございます。
0204デフォルトの名無しさん
2007/04/13(金) 01:00:07知り合いの人買いが人足りないって困ってた。
まあ派遣になんて人集まらなくて当たり前と心の中で思ってたが。
0205デフォルトの名無しさん
2007/04/13(金) 01:31:47webアプリなら死ぬほど転がってると思うが
0206デフォルトの名無しさん
2007/04/13(金) 03:20:47ネットワークアプリだっつってんだろ
webアプリなんざネットワークプログラミングじゃねーよ
0207デフォルトの名無しさん
2007/04/13(金) 07:41:320208デフォルトの名無しさん
2007/04/13(金) 08:53:53webアプリか?
0209デフォルトの名無しさん
2007/04/13(金) 20:40:300210デフォルトの名無しさん
2007/04/13(金) 21:23:15ネットワークを隔離して閉網で構成した方がパフォーマンスもセキュリティも高い。
0211デフォルトの名無しさん
2007/04/13(金) 22:13:10環境はWindowsXPでVisualStudio2005です。
手始めにwinsockの初期化と終了処理ということで、
#include <winsock2.h>
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,0), &wsaData);
WSACleanup();
return 0;
}
というプログラムを書いてみたのですが、
コンパイルする時に
error LNK2019: 未解決の外部シンボル_imp_WSACleanup@0 が関数_mainで参照されました。
error LNK2019: 未解決の外部シンボル_imp_WSAStartup@8 が関数_mainで参照されました。
というエラーが出て、いきなり躓いてしまいました。
これは、どうすればいいのでしょうか?
0212デフォルトの名無しさん
2007/04/13(金) 22:19:47ライブラリは?
0213コッチェビ
2007/04/13(金) 22:21:520214211
2007/04/13(金) 22:30:11選択のところにws2_32.libがないのですが、これはネット上からダウンロードするのでしょうか?
0215デフォルトの名無しさん
2007/04/13(金) 22:31:140216デフォルトの名無しさん
2007/04/13(金) 22:46:220217デフォルトの名無しさん
2007/04/13(金) 22:55:050218デフォルトの名無しさん
2007/04/14(土) 00:33:47つーかエラーの原因くらい特定できるようになれよバーカwwwwwwwww
0219デフォルトの名無しさん
2007/04/14(土) 00:57:03ソリュューションの下のプロジェクトを右クリック->プロパティをクリックして構成プロパティを表示。
構成プロパティ->リンカ->入力->追加の依存ファイルのテキスト欄にws2_32.libを入力後->OK
あと↓の設定も必要だったかも
http://msdn2.microsoft.com/ja-jp/library/ms235626(VS.80).aspx
0220デフォルトの名無しさん
2007/04/14(土) 12:43:00暗号は認証にしか使わないので大丈夫かなパスの平分で流すよりは自前でいじるのもなんだし
ついでだからhttpsとか汎用性があるのを使おうかとおもって
まあ三期の暇人学生が作るmmoゲー(予定)なんで使いやすいのを・・・
0221デフォルトの名無しさん
2007/04/14(土) 13:33:30チャレンジ&レスポンスって方法もありますよ。
>>210は馬鹿だけど。
0222デフォルトの名無しさん
2007/04/14(土) 21:35:08作成がかなり難しくすることは可能でしょうか?
また、そうするためにはどのような対策(パッカーも含めて)を行う必要があるでしょうか?
メモリ書き換え対策?の仕組みや、解読されづらいパッカーなど、あったら教えてください。
0223デフォルトの名無しさん
2007/04/14(土) 21:56:12一ついえるのは「パッカー自作しろ」
0224デフォルトの名無しさん
2007/04/15(日) 12:44:34いや、大作先生のことだと思う。
0225デフォルトの名無しさん
2007/04/16(月) 17:57:23チャレンジ&レスポンスを見てみましたが、サーバー側で独自のレスポンスを作り
比較するらしいのですがその最初にパスなどを受け取るときにはどうするかが載ってなかった・・・まいっか
電気技術者三種が8月にあるから暇じゃなくなった・・・・orz
0226デフォルトの名無しさん
2007/04/16(月) 19:55:45最近みたソースで select / poll でも EAGAINまたは、EWOULDBLOCK の
チェックしてたんですが、select/poll でもerrno にこれがセットされることって
あるんですかね??マニュアルにはなかったもので。。
0227デフォルトの名無しさん
2007/04/16(月) 20:44:540228226
2007/04/16(月) 21:05:35サンクス。やっぱり無駄なチェックなんですね。。。
ちなみに、non-blockingモードでも、selectやpollで待ち合わせてから、
send/recv すれば、EAGAINは返ってこないと思ってますが、
あってますよね?
selectから抜けて、sendするまでにバッファが詰まるとかあるのかな??
0229デフォルトの名無しさん
2007/04/16(月) 21:31:180230デフォルトの名無しさん
2007/04/16(月) 22:04:07kuruyo
0231デフォルトの名無しさん
2007/04/16(月) 23:49:09できるだけ小さいもので、良いものがあれば教えてください。
0232231
2007/04/17(火) 00:05:140233デフォルトの名無しさん
2007/04/17(火) 17:08:14それ俺も怖い。
pollで書き込み可能になってwriteしたらEAGAINとか
poll->読み込み可能->readでEAGAINとか。
似たようなことをここで聞いたらソース嫁ってずーっと前にいわれた。まだ読んでない。
だから一応read/writeでもEAGAINをチェックしてる。
0234デフォルトの名無しさん
2007/04/17(火) 22:18:120235デフォルトの名無しさん
2007/04/17(火) 22:31:40データが到着したら、次回のイベントは発火するけど、
データ自体は今回のrecvで帰ってくることがある(ので
次回recvしても読めないこともある)、ってMSDNあたり
で見た気がする
0236226
2007/04/17(火) 23:35:230237デフォルトの名無しさん
2007/04/18(水) 04:16:07どんなモジュールをトラップしているものなのでしょうか?
(Windows)
ファイアウォールのソフトを手動で削除したら、
CScript.exeから
Msxml2.XMLHTTPオブジェクトなどのオブジェクトを使用して
インターネットにアクセスする事ができなくなってしまいました。
WinHttp.WinHttpRequestなどもすべて同じです。エラーが起きます
WScript.exeは大丈夫です
削除後、まず最初に、WScript.exeからもCScriptからも
FileSystemObjectが使えなくなっていたので
レジストリを調べたらFSOのActiveXコンポーネントscrrun.dllのパスが
ファイアウォールのDLLのパスにすり返られていたので
これは直しました
でもMsxml2.XMLHTTPやMicrosoft.XMLHTTPなどはすべて
そういう事にはなっていません。元のパスのままのようです
このような現象はどこがトラップされて起きているものなのでしょうか?
削除の仕方がまずかった訳で、再インストールしたりすれば
元に戻せるのかもしれませんが、
一応ダメ元で手動復元にトライしたいのです。
0238237
2007/04/18(水) 04:18:40正確にはファイアウォール部分ではないですね・・・
総合セキュリティソフトだったので・・・
スクリプトブロックの部分でした
0239デフォルトの名無しさん
2007/04/18(水) 05:56:14来るはずがないんだったらチェックしたって害はないからな
0240デフォルトの名無しさん
2007/04/19(木) 07:26:520241デフォルトの名無しさん
2007/04/20(金) 10:45:40http://news21.2ch.net/test/read.cgi/bizplus/1176927088/
Vulnerability Summary CVE-2007-1558
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-1558
ちなみにマン・イン・ザ・ミドルアタックだから、
SSLでサーバ認証をすれば問題ない。
SSLだったらAPOPである必要もないわけで、APOP死亡。
0242デフォルトの名無しさん
2007/04/20(金) 13:45:150243デフォルトの名無しさん
2007/04/20(金) 14:47:100244デフォルトの名無しさん
2007/04/20(金) 15:26:450245デフォルトの名無しさん
2007/04/20(金) 15:35:16MD5 をハッシュ関数にするのはまずいんでねーの?
0246デフォルトの名無しさん
2007/04/20(金) 15:50:35扱うデータに偏りがある場合は無理かもしれんけど。
0247デフォルトの名無しさん
2007/04/20(金) 21:07:200248デフォルトの名無しさん
2007/04/20(金) 21:59:35SHA-2
0249デフォルトの名無しさん
2007/04/20(金) 22:21:450250デフォルトの名無しさん
2007/04/20(金) 22:42:12デカ過ぎ?
0251デフォルトの名無しさん
2007/04/20(金) 22:49:320252デフォルトの名無しさん
2007/04/20(金) 23:56:36セッション張りまくりで速攻落とせそう。
0253デフォルトの名無しさん
2007/04/21(土) 00:37:030254デフォルトの名無しさん
2007/04/21(土) 08:34:43その一方、大きな問題としてSHA-2がSHA-1の代替としてふさわしいハッシュ関数であるのかという議論がある。
というのも、昨今、MD5やSHA- 0に対する攻撃成功例が相次いでいること、
またWang氏らの攻撃によって予想よりも簡単にSHA-1への攻撃が成功したことなどから、
NISTや暗号研究者はMD5/SHA-1の設計方針自体に実は脆弱性があるのではないかと疑い始めている。
そのため、MD5/SHA-1の設計方針の延長線上で設計されているSHA-2についても
本当に安全なのか確信が持てなくなってきているのが現状である。
2005年10月に行われたハッシュ関数に関するワークショップ(NIST Cryptographic hash workshop)の席上でも、
NIST自身が今後10年間でSHA-256に対する攻撃方法が見つかる可能性はあると考えていると述べている。
さらに、AESの選定と同じように、新しいハッシュ関数選定のための公募を実施すべきとの意見も根強く残っており、
2006年8月には再度ワークショップが開催されることが決まった。
ここでの議論次第では数年後にハッシュ関数コンテストの実施もあり得る。
近年国際的にもハッシュ関数の設計に関する研究が活発化しており、
暗号学会でもしばらくの間、ハッシュ関数の提案や解読が続くものと考えられている。
0255デフォルトの名無しさん
2007/04/21(土) 09:37:090256デフォルトの名無しさん
2007/04/21(土) 09:41:07・2007年にThird Hash Function Workshop 2007を開催
・2008年〜2012年までのタイムスケジュールの提示
・2012年に新しい標準ハッシュ関数を決定する
0257デフォルトの名無しさん
2007/04/21(土) 10:34:145年以内にSHA-256が破られたらジエンドというわけか
0258デフォルトの名無しさん
2007/04/21(土) 10:50:56これまでもあったように、バリアントを作ったり。
0260デフォルトの名無しさん
2007/04/21(土) 13:44:16他にデカいソケットバッファを要求するプロセスはない
0261デフォルトの名無しさん
2007/04/21(土) 13:45:060262一日駅長
2007/04/21(土) 13:58:46いきなりですが、PHPで作りたいものがあるんですが、
WINDOWS XPを使ってるのでAPACHE(←スペル合ってる?)をダウンロードしよ
うと思ったのですが。インストール後APACHE MONITOR IS ALREADY STRATEDとエラーが、、
なんか上手くいかんのです。全てのプログラム→からクリックしてもなにも出来ない
し、ためしにXAMPPをダウンロードしたのが影響してるのかな?????
上のを削除しようとしてもXAMPPが既に起動してますと表示されます。起動してないつもりだけど(涙)
スレ違いならスマソ。初心者で用語とか全くチンプンカンプンなので分かり易く
説明キボン。
0263デフォルトの名無しさん
2007/04/21(土) 14:01:270264一日駅長
2007/04/21(土) 14:02:360265デフォルトの名無しさん
2007/04/21(土) 14:13:040266デフォルトの名無しさん
2007/04/21(土) 14:24:380267デフォルトの名無しさん
2007/04/21(土) 15:44:07こんにちは。シュールな書き出しですね。
0268デフォルトの名無しさん
2007/04/22(日) 09:27:004GBっす
0269デフォルトの名無しさん
2007/04/22(日) 09:55:10沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…
※一国二制度
簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
(つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。
今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
0270デフォルトの名無しさん
2007/04/22(日) 14:16:28暗号の専門家が手がけてないオレオレハッシュのほうがよっぽど危険じゃね?
0271デフォルトの名無しさん
2007/04/22(日) 16:10:570272デフォルトの名無しさん
2007/04/22(日) 18:19:560273デフォルトの名無しさん
2007/04/22(日) 18:28:290274デフォルトの名無しさん
2007/04/22(日) 19:51:52つーかまだ破られたわけじゃないんだからSHA-256使ってればいいだろ
0275デフォルトの名無しさん
2007/04/22(日) 20:25:03夢が無いね
0276デフォルトの名無しさん
2007/04/22(日) 21:53:530277デフォルトの名無しさん
2007/04/22(日) 21:57:26自称専門家なんてのも居るし。
0278デフォルトの名無しさん
2007/04/23(月) 00:24:452つときは、簡単だったのですが、A,B,Cと3つパソコンでやまびこ
みたいにエコーをしたいと思ってます。A→B→C→B→A
子スレッドがそれぞれ担当するとします。
--�@Aの子スレッドのプログラム--
send(); //A→Bのメッセージを送信
recv(); //B→Aのメッセージを受信
--�ABの子スレッドのプログラム--
recv(); //A→Bのメッセージを受信
B⇔Cのための子子スレッドを呼び出し?
send(); //B→Cのメッセージを送信
--�BBのB⇔Cのための子子スレッド--
send(); //B→Cのメッセージを送信
recv(); //C→Bのメッセージを受信
こういう感じでしょうか?
疑問がありまして、Bの子スレッドのなかで、�Bを呼び出して子子スレッドは、
たぶんダメですよね。実際に実装するときは、どのようになるでしょうか。
よろしくお願いします。
0279278
2007/04/23(月) 00:34:05よろしくお願いします。
--�@Aの子スレッドのプログラム--
send(); //A→Bのメッセージを送信
//Cから戻ってくるまで、ちょっと待ちます
recv(); //B→Aのメッセージを受信
--�ABの子スレッドのプログラム--
recv(); //A→Bのメッセージを受信
B⇔Cのための子子スレッドを呼び出し?
//Cからメッセージが来てsend()
send(); //B→Aのメッセージを送信
--�BBのB⇔Cのための子子スレッド--
send(); //B→Cのメッセージを送信
recv(); //C→Bのメッセージを受信
0280デフォルトの名無しさん
2007/04/23(月) 01:19:45と言うような情報をパケットに持たせて、
プログラム側はその情報に従ってメッセージを送信し、
作成者まで戻ってきたら破棄する。
という感じ?よく分からんけど
0281278
2007/04/23(月) 01:59:09レスありがとうございます。そういう理論ですか。なるほどです。
ネットワークプログラミングとマルチスレッドが、
初心者なので、実際のプログラミングでどうしたら、
良いのかと思いまして。
Bのプログラミングは、もうちょっと細かく見ると
WSAStartup()->socket()->bind()->listen()->accept()->recv()->
B⇔Cのための子子スレッドを呼び出し?
->send()->closesocket()->WSACleanup()
■子スレッドで、_beginthread使っても良いなら、わかりやすくできるんですが、
だめなんですよね?
■WSAStartup()->socket()->bind()->listen()->accept()->recv()->
{B⇔Cの処理 WSAStartup()->socket()->connect()->send()->recv()->WSACleanup()}
->send()->closesocket()->WSACleanup()
スレッド使わないで、WSAStartup()2回呼んだら、どうなるんだろうとか、
一回目のWSACleanup()で、A⇔B,B⇔C、両方の接続切れちゃったりしますよね。
とか、いろいろ疑問で。実験して見ようと思うんですが、頭がごちゃごちゃして
難しいです。
■あとは、はじめからBのプログラミングで、
AがBに接続をして、アクセプトした瞬間に、その親スレッドで、
A⇔B,B⇔Cのやり取りするスレッドを、立ち上げてスレッド間のメッセージで
タイミングをはかる方法があるかもしれないですが、スレッド間のやりとりって、
やったときなくて、難しいです。
うまく説明できず、すみません。的外れなこと言ってるかもしれないです。
2番目と3番目の■について、ここに気をつけるなど、アドバイスいただけないでしょうか。
よろしくお願いします。
0282278
2007/04/23(月) 04:08:282番目の■実験してみました。ちょっと違うんですが、
http://www.geekpage.jp/programming/winsock/http-client.php
こちらのページのプログラムを参考に、させていただき実験してみました。
int main2(int argc, char *argv[]);関数を作成しました。
内容は、
//WSADATA wsaData;
// if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
// printf("WSAStartup failed\n");
// return 1;
// }
// WSACleanup();
●WSAStartup()とWSACleanup()は、一回でいいと思い
にコメントを入れました。この理解合ってますでしょうか?
main()関数の中のsocketclose();のあとに
main2(argc,argv);を呼び出しました。
●すると、同じページが2回表示されました。
この要領で、281も実装すれば大丈夫でしょうか?
0283278
2007/04/23(月) 04:16:18■WSAStartup()->socket()->bind()->listen()->accept()->recv()->
{B⇔Cの処理 socket()->connect()->send()->recv()}
->send()->closesocket()->WSACleanup()
だと、サーバプログラムで、上記のように実験しないとだめですか。
んー、これで動きそうですが、状況作るの難しいです。
眠いので、もうだめです。><
0284デフォルトの名無しさん
2007/04/23(月) 16:09:22親プロセスと子プロセスで、1対1のプロセス間通信をしたいです。
状態やエラーも返したいので名前付きパイプにしたいと思います。
しかし、親子が複数作られる場合があり、
当然、パイプの名前をユニークな名前にしなければならないのですが、
Windowハンドルを使えばいいでしょうか?
こういう場合、普通はどんな風にプロセス間通信しますか?
0285デフォルトの名無しさん
2007/04/23(月) 17:31:14作成したCGIプログラムをHTTPで確認しようとすると
「Script Execution Failed」というエラーが表示されてしまいます。
色々調べたところサーバ側ではRedhat7.1という環境でサーバを動作
させており、Linuxで作成したexeファイルしか動作できないようなのです。
(Linux使ってないのでこの辺り大分自信が無いのですが)
これはつまり、VisualC++6.0等のWindows上で動作するコンパイラで作成した
cgiファイルは使えないという事なのでしょうか?
0286デフォルトの名無しさん
2007/04/23(月) 18:01:26はい、使えません。
0287デフォルトの名無しさん
2007/04/23(月) 18:02:41無名パイプを継承可能で作成してさらにCreateProcessでハンドルを継承可能にする。
0289284
2007/04/23(月) 18:37:13http://www.fides.dti.ne.jp/~tokai/vc/vcchips1.html
このページを参考に作ってみたいと思います。
子プロセス側が無いですが。
0290デフォルトの名無しさん
2007/04/24(火) 05:19:32ソースコードをLinuxマシンに転送してLinuxマシン上でコンパイルすれ
ばいい。
0291デフォルトの名無しさん
2007/04/24(火) 10:46:120292デフォルトの名無しさん
2007/04/24(火) 11:32:40sendに一度に渡すデータサイズはどれぐらいが適正なんでしょうか?
大きめに渡したほうが速く送れると、
どこかで読んだので大きめにしたほうがいいのかと
1MBまでなら渡しても正常に送ってくれるので
今のところ1MBにしています・・・でも、これはさすがに大きすぎるような気がして不安です。
0293デフォルトの名無しさん
2007/04/24(火) 11:35:11WindowsとLinuxの両者でネイティブ動作する実行ファイルを作るのは不可能。
一般にコンパイル環境と異なるターゲット環境のための実行ファイルを
生成したい場合には、クロスコンパイラというものを使う。
0294デフォルトの名無しさん
2007/04/24(火) 17:44:160295デフォルトの名無しさん
2007/04/24(火) 19:51:45リングバッファ処理を覚えましょう。
0296デフォルトの名無しさん
2007/04/24(火) 21:25:18アンカーぐらい付けてくれ
0297デフォルトの名無しさん
2007/04/25(水) 00:50:120298デフォルトの名無しさん
2007/04/25(水) 03:09:460299デフォルトの名無しさん
2007/04/25(水) 03:56:12248 , 40 , 45 , 22 , hwnd , (HMENU)0 , ((LPCREATESTRUCT)(lp))->hInstance , NULL);
これで表示される“最初の文字”のフォントのサイズを小さくすることは出来るのでしょうか?
0300デフォルトの名無しさん
2007/04/25(水) 04:02:00目的のエディットコントロールを読み専用に変えたいのですが、↑のだと上手くいきません。
どうすればいいのでしょうか?
0301デフォルトの名無しさん
2007/04/25(水) 04:18:34ここは
ネットワークプログラミング相談室 Port19
です。
0302デフォルトの名無しさん
2007/04/25(水) 05:02:57ごめんなさい、スレを間違えてました。本当の質問は、
n = connect(sock, (struct sockaddr *)&server, sizeof(server));
while(n==SOCKET_ERROR){
n = connect(sock, (struct sockaddr *)&server, sizeof(server));
}
という感じで、サーバに接続するようにしているのですが、どうしても上手くいかない場合があります。
というのは、サーバー側でacceptする数の上限が5個にしている場合、
6人目はconnectを素通りしているような動作をします。
6人目にこのループを抜けてもらったら困るのです。
下の方の処理で、if(n!=SOCKET_ERROR){}のようにして6人目を村八分にしようとしても、
どうやら6人目のnにSOCKET_ERRORが入ってないようで、処理から除外することが出来ません。
どうすればいいのでしょうか?
0303デフォルトの名無しさん
2007/04/25(水) 16:51:45ネットワークというよりアルゴリズム的な話だと思う。
0304292
2007/04/25(水) 17:10:520305デフォルトの名無しさん
2007/04/25(水) 21:12:22といったらみもふたもないな。
0306デフォルトの名無しさん
2007/04/26(木) 01:09:35サーバ側はどういう挙動にしてますか?
5クライアントをaccept()した後にもlisten()しているとか?
0307デフォルトの名無しさん
2007/04/26(木) 01:11:57サーバがacceptを呼ぶ以前にOS側で接続を
成立させておく機能があるわけ
0308デフォルトの名無しさん
2007/04/26(木) 07:19:28ローカルのプログラムからサーバーにあるCGIを起動する際に引数を
渡してやりたいのですが上手くいきません。
ローカル側のアプリから以下のようにして引数の文字列「data」をCGIに渡してます。
hRequest = HttpOpenRequest(
hHttpSession,
"GET",
"test.cgi?data",//「data」という文字列をCGIに渡す
NULL, NULL, NULL, 0, 0);
CGI側のプログラムは以下のようになっています。
int main(){
char szBuf[256];
int i;
char c;
for (i = 0; (i < 255) && (c = getchar()) != EOF; i++) {
szBuf[i] = c;//引数として与えられた文字列を標準入出力から取得
}
szBuf[i] = '\0';
printf("Content-type:text/html\n\n");
printf(szBuf);//引数の文字列を描画
printf("test");//Test用
return 0;
}
CGIを実行してみると「test」というテスト用に書き出した文字列は吐き出されるのですが、
肝心の引数として与えた文字列が書き出されません。
ローカルでの引数の渡し方か、CGI側での引数の取得方法のどちらかが
間違ってると思うのですが、どなたかアドバイスして頂けないでしょうか?
0309デフォルトの名無しさん
2007/04/26(木) 07:45:58GETとPOSTで受信方法が違う。GETの場合は環境変数のQUERY_STRINGから読み取る。
0310デフォルトの名無しさん
2007/04/26(木) 07:53:510311308
2007/04/26(木) 07:57:43ありがとうございます!ようやく引数を取得する事が出来ました!!
本当に困ってたんです。適切なアドバイスありがとうございました!
0312デフォルトの名無しさん
2007/04/26(木) 08:00:140313デフォルトの名無しさん
2007/04/27(金) 01:18:56MessageBox(hwnd, "OK", "OK", MB_OK);
sock[i] = accept(sock0, (struct sockaddr *)&client_s, &len_s);
↑のプログラムなんですが、クライアント側から接続要求がないのに
WSAAsyncSelectで待機せずに素通りしてしまいます。どうしてでしょうか?
ちなみにWM_MYMSG2では何も処理をしてません・・・
0314デフォルトの名無しさん
2007/04/27(金) 01:54:340315デフォルトの名無しさん
2007/04/27(金) 02:44:02どうしてWSAAsyncSelect()が待機するなんて思うんですか?
0316デフォルトの名無しさん
2007/04/27(金) 14:52:52WinsockでIPv6のUDPパケットを出すプログラムを書いています。
パケットの送信元アドレスをパケットを出す前に取得するにはどうすればよいのでしょうか?
パケットを出すPCは複数のIPv6アドレスを持つ可能性があるので、
送信元アドレスはできればシステムに決めさせたいのです。
IPv4では次のようなコードでうまくいったのですが、
IPv6では送信元が[::]となってしまいます。(擬似コードですいません。)
s = socket( UDP ) ;
connect( s, "remote_sockaddr" ) ;
getsockname( s, src_sockaddr ) ;
getnameinfo( src_sockaddr, &src_addr_string, &src_port_string ) ;
0317デフォルトの名無しさん
2007/04/27(金) 17:05:57ちょっと勉強しなおしました。
別に待機はしないんですね。
WSAAsyncSelect(sock, hwnd, WM_MYMSG, FD_READ);で、
ウィンドウプロシージャの方でFD_READを捕まえてrecvをしようとしているのですが、
なぜかメッセージが送られてきてもWM_MYMSGがプロシージャに送られて来ません。
原因として何が考えれれるでしょうか?
0318デフォルトの名無しさん
2007/04/27(金) 21:59:210319デフォルトの名無しさん
2007/04/28(土) 02:16:47> なぜかメッセージが送られてきてもWM_MYMSGがプロシージャに送られて来ません。
言ってる意味がわからん。何のメッセージが送らてきたんだ。WM_MYMSG
のメッセージが送られてきたのではないの?
0320デフォルトの名無しさん
2007/04/28(土) 12:38:08>>317
「もっと勉強し直せ」としか答えようがない
0321デフォルトの名無しさん
2007/04/28(土) 14:09:400322デフォルトの名無しさん
2007/04/28(土) 15:19:57「自己解決しました」だけで去っていくのは最悪だが
0323デフォルトの名無しさん
2007/04/28(土) 23:41:40クライアントからメッセージを送っても、プロシージャにWM_MYMSGが送られてこないということです
0324デフォルトの名無しさん
2007/04/29(日) 00:28:26日本語は理解できるか?
0325デフォルトの名無しさん
2007/04/29(日) 01:43:09受け取って・・・ください・・・ 伝わって・・・・・・ ください・・・
0326デフォルトの名無しさん
2007/04/29(日) 01:44:321つずつ処理を追いかけていけば怪しい部分が分かると思うけどな
0327デフォルトの名無しさん
2007/04/29(日) 04:32:12char型のメッセージです。"Hello"って文字列です。
メッセージが送られてきたときだけrecv()を呼び出したいので・・・
0328デフォルトの名無しさん
2007/04/29(日) 16:29:29以下コピペですが、どうかお願いいたします。
C、C++、Javaを用いて、ネットに存在する情報を取得したいのですが、可能でしょうか?
使用目的は、 「株式の時系列データを取得し、株式の解析に用いる」 です。
例えば、プログラムを実行すると、
http://table.yahoo.co.jp/t?s=5010.t&g=d
上記ページの、
2/16〜4/27までの始値、高値、安値、終値を取得する。
そして、それらを数値として変換し、解析に用いたいのです。
研究室の条件により、C、C++、Javaのみでプログラムを作成しなければなりません。
可能でしたら、参考になるWEBサイトを教えていただければ幸いです。
よろしくお願いいたします。
0329デフォルトの名無しさん
2007/04/29(日) 16:41:35おれも株の自動化してみたいなーFXとかほかのもやる予定?
0330デフォルトの名無しさん
2007/04/29(日) 16:43:55仕事ならともかく学校のならJavaで1日で作れ。
0331デフォルトの名無しさん
2007/04/29(日) 16:56:38ありがとうございました。
HTTP通信と構文解析ですか…。あとで調べてみます。
FXとかですが、自分なりに理論が固まれば取り組もうと思ってます。
0332デフォルトの名無しさん
2007/04/29(日) 17:00:40【自動】株式トレーディングシステム Part4【売買】
http://pc11.2ch.net/test/read.cgi/tech/1110223706/
あと解析するには本買うだろうけど、一万近くします。立ち読むには厚くて重い
あと、数式とか解くらしいからがんばれ〜三流大だから無理であきらめた〜
0333デフォルトの名無しさん
2007/04/29(日) 17:17:55おー!ありがとうございます!
Javaで組めるようにならないといけないですね…。
そのスレを参考にして作り上げたいと思います。
0334デフォルトの名無しさん
2007/04/30(月) 01:10:56コネクション成立処理がくさそうな気がする。
0335デフォルトの名無しさん
2007/04/30(月) 14:39:18javaは読めればいいわけで、重要なのは理解できるかだと思うよ
理解できればCにもできるし、まあ大学の研究室なら公開してくれwww待ってる
0336デフォルトの名無しさん
2007/05/01(火) 01:48:51「ソケット上で文字列を送っても WM_MYMSG の処理に行かない」ってこ
とね。コードを見ない限り、もう「ちゃんとコードを組めばできるはず」
としかい言いようがない。
0337デフォルトの名無しさん
2007/05/02(水) 16:02:29tetherealを起動していると、マルチキャスト受信ができるのに、
tetherealを起動していないと、マルチキャスト受信ができない。
何か原因について、予想できることはありますか?
プログラムは、以下のページを見ながら作りました。
ttp://www.geekpage.jp/programming/linux-network/multicast-2.php
ネットワーク構成は,以下のようになっています。
[受信側]---[ルータ]---[送信側]
受信側IP:192.168.0.100
ルータIP:192.168.0.1
送信側IP:192.168.0.3
0338デフォルトの名無しさん
2007/05/02(水) 21:25:020339デフォルトの名無しさん
2007/05/03(木) 00:44:17あなたが神か。
インターフェースの設定を以下のコマンドで変更したら、
teherealに関わらず、マルチキャスト受信できました。
ifconfig eth0 promisc
また、以下の設定でもマルチキャスト受信できるようになりました。
ifconfig eth0 allmulti
蛇足ですが、
「ifconfig eth0 -multicast」によって、MULTICAST属性(?)を消しても、
マルチキャスト受信ができました。このあたりは、よく分かっていません。
不明な部分もありますが、当初の予定の
マルチキャスト受信できるようになりました。
ありがとうございます。
0340サービス定義済みポートだと返ってこない
2007/05/04(金) 07:09:13サービスが定義されているポートだとrecv,WSARecv,send,WSASendの関数呼び出しが返ってきません。
サービスが定義されていない24や27015だとちゃんと送信、受信がすぐに行われ関数呼び出しは返ってきます。
サービスが定義されているポートだと何か特別な処理が必要なのでしょうか?
流れとしては単純にサーバもクライアントもブロッキングモードで、ホストはlocalhost:25で
サーバはWSASocket,bind,listen,WSAAccept,recv/WSARecvとやってrecv/WSARecvで返ってこなくなります。
クライアントはWSASocket,connect,send/WSASendとやってsend/WSASendで返ってこなくなります。
ご教授のほどよろしくお願いします。
0341サービス定義済みポートだと返ってこない
2007/05/04(金) 08:22:44でもサーバの方はWSAAcceptまではするのですが、recvで処理が返ってこなくなります。
行の節約のためエラー処理を抜きにして試したプログラムを記載します。
起動の順番はサーバ、クライアントとしてクライアントがメッセージをサーバに送り
サーバがメッセージを受け取る単純な形です。
見にくいかもしれませんがよろしくお願いします。
0342サービス定義済みポートだと返ってこない
2007/05/04(金) 08:23:50WSADATA sWSAData;
addrinfo sHints, *pInfo = NULL;
char* pszMsg = "Helo localhost \r\n";
::memset(&sHints, 0, sizeof(sHints));
::WSAStartup(MAKEWORD(2, 2), &sWSAData);
SOCKET s = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
sHints.ai_family = AF_INET;
sHints.ai_socktype = SOCK_STREAM;
sHints.ai_protocol = IPPROTO_TCP;
::getaddrinfo("localhost", "25", &sHints, &pInfo);
::connect(s, pInfo->ai_addr, pInfo->ai_addrlen);
::send(s, pszMsg, ::strlen(pszMsg), 0);
::printf("Send Msg[%s]", pszMsg);
::freeaddrinfo(pInfo);
::WSACleanup();
getchar();
0343サービス定義済みポートだと返ってこない
2007/05/04(金) 08:24:55WSADATA sWSAData;
addrinfo sHints, *pInfo = NULL;
SOCKADDR_IN sClientInfo;
DWORD ulNumofRecv = 0, ulFlag = 0;
int iRet;
char achBuffer[1024];
int iSize = sizeof(sClientInfo);
::memset(&sHints, 0, sizeof(sHints));
::memset(&sClientInfo, 0, sizeof(sClientInfo));
::memset(achBuffer, 0, 1024);
::WSAStartup(MAKEWORD(2, 2), &sWSAData);
SOCKET s = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
sHints.ai_family = AF_INET;
sHints.ai_socktype = SOCK_STREAM;
sHints.ai_protocol = IPPROTO_TCP;
::getaddrinfo("localhost", "25", &sHints, &pInfo);
::bind(s, pInfo->ai_addr, pInfo->ai_addrlen);
::listen(s, 1);
SOCKET a = ::WSAAccept(s, (sockaddr*)&sClientInfo, &iSize, NULL, NULL);
::printf("WSAAccept complete\r\n");
iRet = ::recv(a, achBuffer, 1024, ulFlag); //ここで処理が返ってこなくなる
::printf("recv msg[%s]", achBuffer);
::freeaddrinfo(pInfo);
::WSACleanup();
getchar();
0344サービス定義済みポートだと返ってこない
2007/05/04(金) 09:14:43何かヒントになるでしょうか。
0345デフォルトの名無しさん
2007/05/04(金) 09:22:59SMTPのコマンドか?
サーバーとクライアントって、どこと接続しているのか、netstat -anoとかで確かめてみた?
0346デフォルトの名無しさん
2007/05/04(金) 09:40:15send()した直後にWSACleanup()したら、送られないんじゃない?
0347サービス定義済みポートだと返ってこない
2007/05/04(金) 09:44:41netstat -anoの結果はTCP 127.0.0.1:20000でSTATEがLISTENINGとESTABLISHEDの2つが出ました。
サーバとクライアントでちゃんと通信が確立しているみたいです。
しかしSMPTポート(25)で行ったら127.0.0.1:20000は表示されなくなりました。
bind,listen,acceptもconnectも成功しているのに何故表示されないのでしょうか。
よろしくお願いします。
0348サービス定義済みポートだと返ってこない
2007/05/04(金) 09:47:02SMTPポート(25)で行ったところさっきの空いているポート(20000)と
同様に127.0.0.1:25のLISTENINGとESTABLISHEDが表示されています。
プロセスID?(PID)も同じです。
通信は確立していると見てよいのでしょうか。
何故recvできないのでしょうか?
よろしくお願いします。
0349サービス定義済みポートだと返ってこない
2007/05/04(金) 09:53:13netstat -anoの結果で
Proto Local Address Foreign Address State PID
(1)TCP 127.0.0.1:25 0.0.0.0:0 LISTENING 5208
(2)TCP 127.0.0.1:25 127.0.0.1:3744 ESTABLISHED 5208
のあとに
(3)TCP 127.0.0.1:3744 127.0.0.1:25 ESTABLISHED 3868
という(2)のForeign Addressが(3)のLocal Addressで使われていました。
PIDも異なります。
空いているポート(20000)では(3)のような重複したものはありませんでした。
もしかしたら、別のプロセスへメッセージが送られているのでしょうか?
よろしくお願いします。
0350デフォルトの名無しさん
2007/05/04(金) 10:01:00心配なら自分のサーバプログラムとクライアントプログラムでPIDを表
示してみれば?
(1)がサーバのWSASocket(),bind(),listen(),WSAAccept()のパラメータ のソケット
(2)がサーバのWSAAccept()の結果、recv() のソケット
(3)がクライアントのソケット
でしょう。
0351デフォルトの名無しさん
2007/05/04(金) 10:03:29一応だけど、ファイアウォールの設定とログも確認して。
0352サービス定義済みポートだと返ってこない
2007/05/04(金) 10:07:20NortoAntiVirusのアプリケーションみたいです。
それで調べてみたら電子メールのスキャンを無効にするとうまく動くようになりました。
345さんありがとうございました。
346さんもありがとうございました。
それにしてもノートンには困ったものです。
0353サービス定義済みポートだと返ってこない
2007/05/04(金) 10:09:380354サービス定義済みポートだと返ってこない
2007/05/04(金) 10:12:42あれ、確かにサーバとクライアントはプロセスが違うはずですよね。
でも同じPIDでLISTENINGとESTABLISHEDになっています。
他に127.0.0.1:25はないようだし。
謎ですね。
0355デフォルトの名無しさん
2007/05/04(金) 10:16:05返ってこなくていい
0356サービス定義済みポートだと返ってこない
2007/05/04(金) 10:19:59クライアント側のESTABLISHEDがあってもいいようなものですが、どうなのでしょうか。
ちょっと気になりますね。
0357デフォルトの名無しさん
2007/05/04(金) 12:46:510358非ブロッキングモードでAcceptしたら
2007/05/05(土) 13:11:12またまた、よくわからないことができたのでご教授願います。
非ブロッキングモードでlisten中、WSAAcceptにより新しいソケットを作ったのですが、
デフォルトで非ブロッキングモードのような動作をWSARecvでします。
ブロックせずにWSAEWOULDBLOCK(10035)を返してくるです。
おまけにioctlsocketのFIONBIOで0(ブロッキングモードに変更)を指定すると
WSAEINVAL(10022)を返して失敗します。
非ブロッキングモードのlistenソケットによりacceptされてできたソケットはずっと
非ブロッキングモードで動作するしかないのでしょうか。
よろしくお願いします。
0359非ブロッキングモードでAcceptしたら
2007/05/05(土) 13:13:47WSADATA sWSAData;
WSAEVENT hEvent;
addrinfo sHints, *pInfo = NULL;
SOCKADDR_IN sClientInfo;
DWORD ulNumofRecv = 0, ulFlag = 0;
WSABUF sBuffer;
int iRet;
char achBuffer[1024];
int iSize = sizeof(sClientInfo);
::memset(&sHints, 0, sizeof(sHints));
::memset(&sClientInfo, 0, sizeof(sClientInfo));
::memset(achBuffer, 0, 1024);
::WSAStartup(MAKEWORD(2, 2), &sWSAData);
SOCKET s = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
sHints.ai_family = AF_INET;
sHints.ai_socktype = SOCK_STREAM;
sHints.ai_protocol = IPPROTO_TCP;
::getaddrinfo("localhost", "25", &sHints, &pInfo);
::bind(s, pInfo->ai_addr, pInfo->ai_addrlen);
::listen(s, 1);
hEvent = ::WSACreateEvent();
::WSAEventSelect(s, hEvent, FD_ACCEPT);
::WSAWaitForMultipleEvents(1, &hEvent, FALSE, WSA_INFINITE, FALSE);
長いので次に続きます。
0360非ブロッキングモードでAcceptしたら
2007/05/05(土) 13:16:25sBuffer.buf = achBuffer;
sBuffer.len = 1024;
u_long ulMode = 0;
iRet = ::ioctlsocket(a, FIONBIO, &ulMode);
if (iRet == SOCKET_ERROR) {
int iError = ::WSAGetLastError();
::printf("::ioctlsocket Error code is %d", iError);
}
iRet = ::WSARecv(a, &sBuffer, 1, &ulNumofRecv, &ulFlag, NULL, NULL);
if (iRet == SOCKET_ERROR) {
int iError = ::WSAGetLastError();
::printf("::WSARecv Error code is %d", iError);
}
else
{
::printf("recv msg[%s]", achBuffer);
}
::freeaddrinfo(pInfo);
::WSACleanup();
getchar();
以上です。長いですが、listen用のソケットsを作成listenし、WSAEventSelectで非同期モードにしイベントシグナルを待ってからWSAAccept、WSARecvするかんじです。
何か単純なミスがあるのかもしれません。よろしくお願いします。
0361非ブロッキングモードでAcceptしたら
2007/05/05(土) 13:45:010362デフォルトの名無しさん
2007/05/05(土) 13:45:33ioctlsocket:
>To set the socket back to blocking mode, an application must first
>disable WSAAsyncSelect by calling WSAAsyncSelect with the lEvent
> parameter equal to zero, or disable WSAEventSelect by calling
>WSAEventSelect with the lNetworkEvents parameter equal to zero.
WSAAccept:
> The newly created socket has the same properties as socket s including
>asynchronous events registered with WSAAsyncSelect or with WSAEventSelect.
だからだな。
0363非ブロッキングモードでAcceptしたら
2007/05/05(土) 14:01:42ありがとうございます。
WSAEventSelectなどの設定を引き継いでしまうんですね。
さっきのテストコードのWSAAcceptの呼び出しの直後に次のコードを追加し、
WSAEventSelectを別のイベントを使って無効にしたら行けました。
WSAEVENT hEvent2 = ::WSACreateEvent();
iRet = ::WSAEventSelect(a, hEvent2, 0);
if (iRet == SOCKET_ERROR)
{
int iError;
iError = ::WSAGetLastError();
::printf("::WSAEventSelect Error code is %d", iError);
}
WinSockは難しいですね。でもちゃんとMSDNを読まなかったのが、というか英語だから僕には無理っぽいですが、それがまずかったですね。
ありがとうございました。
ただ、一つ疑問が残ります。WSAEventSelectの設定をacceptしたソケットが引き継ぐのはわかったのですが、
内部で勝手にWSACreateEvent()でイベントを作成して、それでWSAEventSelect(a, 内部で勝手に作ったイベント, 引き継ぐイベントフラグ)
というような呼び出しをしているのでしょうか。
もしそうなら、そのイベントをできればこっちで知りたいし、破棄したりもしたいのですが。
MSDNを見てみます。でも僕だけだと本当に心もとないのでご支援お願いします。
0364非ブロッキングモードでAcceptしたら
2007/05/05(土) 14:11:02nonblocking mode, regardless of the value of lNetworkEvents.
To set socket s back to blocking mode, it is first necessary
to clear the event record associated with socket s via a call
to WSAEventSelect with lNetworkEvents set to zero and the
hEventObject parameter set to NULL. You can then call ioctlsocket
or WSAIoctl to set the socket back to blocking mode.
WSAEventSelectにこんなことが書いてありました。
hEventObjectはNULLでかまわないみたいなのでさっきの修正コードのhEvent2はなしにして
iRet = ::WSAEventSelect(a, NULL, 0);
これだけで行けました。
でも内部で勝手に作っているかもしれないWSAEVENTについては謎です。
0365非ブロッキングモードでAcceptしたら
2007/05/05(土) 14:27:44same properties as the listening socket used to accept it.
Any WSAEventSelect association and network events selection set
for the listening socket apply to the accepted socket. For example,
if a listening socket has WSAEventSelect association of hEventObject
with FD_ACCEPT, FD_READ, and FD_WRITE, then any socket accepted on that listening socket will also have
FD_ACCEPT, FD_READ, and FD_WRITE network events associated with the same hEventObject.
If a different hEventObject or network events are desired,
the application should call WSAEventSelect,
passing the accepted socket and the desired new information.
このevents associated with the same hEventObjectというようにlistenのソケットと同じイベントに
結び付けられるみたいです。
つまり内部で新しいWSAEVENTが作られているのではなく、acceptするソケットが関連付けているイベント
に対して新たなソケットも関連づけられるようです。
なのでさっきのように::WSAEventSelect(a, NULL, 0);とすればacceptで新しく作られたソケットの関連付けは
とけることになるみたいです。
ご支援ありがとうございました。
0366デフォルトの名無しさん
2007/05/06(日) 12:56:380367デフォルトの名無しさん
2007/05/06(日) 15:29:34メッセージだらけになって追いつかなくなりそうじゃないですか?
0368デフォルトの名無しさん
2007/05/06(日) 15:40:23約300回/sくらいメッセージが来ることになるね。
0369デフォルトの名無しさん
2007/05/06(日) 17:31:51高速回線だとスレッドを取得し終えるまで操作できなくなってたな
0370デフォルトの名無しさん
2007/05/06(日) 17:35:310371デフォルトの名無しさん
2007/05/06(日) 17:39:09入力メッセージを処理できなくなるから。
WindowsはPostMessageでポストしたメッセージのほうがキーボードやマウスからの
入力メッセージより優先度が高いという仕様なので。
0372デフォルトの名無しさん
2007/05/06(日) 21:09:120373デフォルトの名無しさん
2007/05/06(日) 21:43:450374デフォルトの名無しさん
2007/05/06(日) 22:12:42ウィンドウが操作出来なくなるなんて事は無い。
普通は、一回のFD_READで4K-8K程度は受信できる(たぶんsockopt次第)。
で、何故操作出来なくなるかというと
(recvのバッファが小さいという可能性もあるが)
recvのハンドラ内で重い処理をしているからと思われる。
具体的には、毎回ディスクに書き込みをするような作りだと
「ウィンドウが動かせない」状態になる。
gzipの展開程度は、重い処理には入らないし
実際の画面描画はWM_PAINTで行われるので
これも「ハンドラ内の重い処理」にはならないはず。
0375デフォルトの名無しさん
2007/05/06(日) 22:47:55受信したばかりのスレッドが保存されていないという「バグ」が報告されるくらいだし。
かちゅの場合IEコンポへの書き込みがボトルネックになってるかも
0376デフォルトの名無しさん
2007/05/06(日) 23:06:270377デフォルトの名無しさん
2007/05/06(日) 23:51:540378デフォルトの名無しさん
2007/05/07(月) 10:22:130379デフォルトの名無しさん
2007/05/07(月) 12:58:570380デフォルトの名無しさん
2007/05/07(月) 18:32:10変換処理、IEへの書き込み処理をその中でしている以上、
それらの処理が終わるまで他のウインドウメッセージが
処理されるわけがない。
0381デフォルトの名無しさん
2007/05/07(月) 21:01:33詳希!
0382デフォルトの名無しさん
2007/05/07(月) 23:02:53http://mxr.mozilla.org/seamonkey/source/widget/src/windows/nsWindow.cpp
0383デフォルトの名無しさん
2007/05/07(月) 23:23:04nsWindow::OnKeyDownあたりの処理ですか?
長くてよくわかりません。
0384デフォルトの名無しさん
2007/05/09(水) 02:51:32接続の最大人数を5人までにしたくて、5人と接続をしたら、
誰か一人接続を終了するまでacceptをしないように設計しています。
ここからが問題なのですが(クライアント側の問題です)、
6人目がconnect()すると、特にSOCKET_ERRORも返さず、
その後そのソケットにsend()を行っても特にエラーを返しません。
これはどういう状況なのでしょうか?
(サーバーのログを見ると、6人目とは接続を行っていないので
当然6人目からのメッセージは受信してません)
0385デフォルトの名無しさん
2007/05/09(水) 03:32:21accept してからスレッドに処理を任せて再度 accept
するまでの間に到着した connect 要求は次の accept
で処理されるように待たされることになる(listen の
第二引数の説明参照)。
ということでその 6 人目はシステム的には「サーバー
が忙しくて accept が遅れている(ように見える)」状
態にある。
0386デフォルトの名無しさん
2007/05/09(水) 03:52:41しかし、acceptが遅れているように見える状態であるなら
タイムアウトになるまでconnect()で待ったりしないのでしょうか?
0387デフォルトの名無しさん
2007/05/09(水) 03:57:52「非同期ソケット」の一般的な定義を知りたいです。
fcntl(sock_fd,F_SETFD,O_NONBLOCK);
として設定したソケット(sock_fd)は、
「非同期ソケット」と呼ばれているのでしょうか?
0388デフォルトの名無しさん
2007/05/09(水) 06:50:20非ブロッキングなだけで非同期とは呼ばないな
非同期=コールバックして通知する
みたいなイメージがある
0389デフォルトの名無しさん
2007/05/09(水) 08:08:33非同期=要求と応答を同時に処理しない。
普通は非同期I/O APIを使うソケットのことをいうと思う。> 非同期ソケット
POSIXだとaio_read()など。
>>388
応答をコールバックでパッシブに処理するか、
アクティブに受け取ろうとするかは、別の分類になる。
0390Nortonがあると通信できないのは何故
2007/05/09(水) 14:58:58>>343で書いたソースがサーバでクライアントはTeraTermでやってます。
netstat -anoで調べた状態で関連するものだけをピックアップすると以下の3つがあります。
TCP 127.0.0.1:25 0.0.0.0:0 LISTENING 3896(サーバ)
TCP 127.0.0.1:25 127.0.0.1:4766 ESTABLISHED 3896(サーバ)
TCP 127.0.0.1:4766 127.0.0.1:25 ESTABLISHED 3992(Norton)
以前はNortonのメールスキャン機能を停止して解決だったのですが、
どうも他のメールサーバ(Radish)では同じ状態でも通信ができるようです。
Radishを起動してTeraTerm(localhost:25)で接続してHELO<CRLF>でちゃんと
通信ができるのを確認しました。
netstatの結果も同様でした。
Radishのソースも見てみたのですが特別な処理をしているようには見えません。
上のような通信状態でクライアントと通信するために必須の処理などありましたらお教え願います。
何卒よろしくおねがいします。
0391Nortonがあると通信できないのは何故
2007/05/09(水) 15:00:42以前、困ったものだと言ってしまいましたがあれは撤回します。
困ったものなのは今の僕の知識のなさです。
0392デフォルトの名無しさん
2007/05/09(水) 15:19:290393デフォルトの名無しさん
2007/05/09(水) 15:59:42SOCK_STREAMのブロッキングのソケットで1024バイトバッファで受信してるんだから、
1024バイト受信するか、connectした側がソケットをshutdown/closeするまで
ブロックするだろ。
どういう動作を期待してるの?
0394Nortonがあると通信できないのは何故
2007/05/09(水) 16:15:21ご返事ありがとうございます。
再度確認してみましたがNortonのメールスキャン機能を外してTeraTermで
試したところ1文字TeraTermから送信するだけでサーバ側のrecvは処理を返すようです。
しかし、Nortonのメールスキャン機能を有効にして同じことをするとAcceptは成功する
のですが、何文字送信してもサーバ側のrecvの処理は帰ってこないのです。
>>390の内容からみて127.0.0.1:4766をローカルアドレスに持つNortonがデータの送信を
邪魔しているように思えるのですがどうでしょうか?
0395Nortonがあると通信できないのは何故
2007/05/09(水) 16:23:28今1024の代わりに1でやってみたのですが状況は同じでした。
0396デフォルトの名無しさん
2007/05/09(水) 16:27:55virusかそうでないか判別してから溜めてたデータを送りなおすんだから
しょうがないだろ。
そのままスルーしてたら何のためのウィルススキャナだよw
0397デフォルトの名無しさん
2007/05/09(水) 16:30:24>>390みると、nortonが接続してそれで終わりなんじゃないの?
その状態からTeraTermで接続しても、listeningのソケットがあるから、
connect()は成功するかもしれんけど、サーバ側がaccept()しないからそりゃつながらんだろ。
0398Nortonがあると通信できないのは何故
2007/05/09(水) 17:22:01>>397さん、複数のAccept可能なテストコード(終了処理は全然考えていない)を作って
試してみました。次にそのテストコードを書かせて頂きます。
試した結果やはり状態は変わりません。というかTeraTerm(クライアント)をconnectする前後でNortonとの接続
が確立するみたいです。しかし、Nortonは直接connectはしてきていません。
TeraTermを2つ起動しやってみたんですが、クライアントとの接続が確立するとそれに応じて
Nortonが、NortonのLocal Address=クライアントのForeign Address、NortonのForeign Address=クライアントのLocal Address
といった形の接続を確立するようです。
netstat -anoの結果としては、
TCP 127.0.0.1:25 127.0.0.1:2002 ESTABLISHED 2092(サーバ)
TCP 127.0.0.1:25 127.0.0.1:2004 ESTABLISHED 2092(サーバ)
TCP 127.0.0.1:2002 127.0.0.1:25 ESTABLISHED 3992(Norton)
TCP 127.0.0.1:2004 127.0.0.1:25 ESTABLISHED 3992(Norton)
です。
0399Nortonがあると通信できないのは何故
2007/05/09(水) 17:26:43// Test12DoAcceptから呼び出されるスレッド(ひたすら受信する)
unsigned int _stdcall Test12DoRecv(void* pAnyParam)
{
char achBuffer[2];
::memset(achBuffer, 0, 2);
SOCKET a = (SOCKET)pAnyParam;
while (g_bTest12DoRecvAndAccept == true) {
::recv(a, achBuffer, 1, 0); //ここで処理が返ってこなくなる
::printf("recv msg[%s]", achBuffer); //Nortonを無効にするとrecvが返る
}
return 0;
}
// Test12から呼び出されるスレッド(ひたすらAcceptする)
unsigned int _stdcall Test12DoAccept(void* pAnyParam)
{
SOCKET s = (SOCKET)pAnyParam;
while (g_bTest12DoRecvAndAccept == true) {
SOCKET a = ::WSAAccept(s, NULL, NULL, NULL, NULL);
::printf("WSAAccept complete\r\n");
::_beginthreadex(NULL, 0, Test12DoRecv, (void*)a, 0, NULL); //TestDoRecv開始
}
return 0;
}
0400Nortonがあると通信できないのは何故
2007/05/09(水) 17:29:07// Test12DoAcceptから呼び出されるスレッド(ひたすら受信する)
unsigned int _stdcall Test12DoRecv(void* pAnyParam)
{
char achBuffer[2];
::memset(achBuffer, 0, 2);
SOCKET a = (SOCKET)pAnyParam;
while (true) {
::recv(a, achBuffer, 1, 0); //ここで処理が返ってこなくなる
::printf("recv msg[%s]", achBuffer);
}
return 0;
}
// Test12から呼び出されるスレッド(ひたすらAcceptする)
unsigned int _stdcall Test12DoAccept(void* pAnyParam)
{
SOCKET s = (SOCKET)pAnyParam;
while (true) {
SOCKET a = ::WSAAccept(s, NULL, NULL, NULL, NULL);
::printf("WSAAccept complete\r\n");
::_beginthreadex(NULL, 0, Test12DoRecv, (void*)a, 0, NULL); //TestDoRecv開始
}
return 0;
}
0401Nortonがあると通信できないのは何故
2007/05/09(水) 17:30:46{
WSADATA sWSAData;
addrinfo sHints, *pInfo = NULL;
::memset(&sHints, 0, sizeof(sHints));
::WSAStartup(MAKEWORD(2, 2), &sWSAData);
SOCKET s = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
sHints.ai_family = AF_INET;
sHints.ai_socktype = SOCK_STREAM;
sHints.ai_protocol = IPPROTO_TCP;
::getaddrinfo("localhost", "25", &sHints, &pInfo);
::bind(s, pInfo->ai_addr, pInfo->ai_addrlen);
::listen(s, 10);
// Acceptのスレッドを起動する
::_beginthreadex(NULL, 0, Test12DoAccept, (void*)s, 0, NULL); //TestDoAccept開始
getchar();
::freeaddrinfo(pInfo);
::WSACleanup();
}
以上です。
0402デフォルトの名無しさん
2007/05/09(水) 17:32:360403デフォルトの名無しさん
2007/05/09(水) 17:51:120404Nortonがあると通信できないのは何故
2007/05/09(水) 17:56:16なんでしょうか?
0405デフォルトの名無しさん
2007/05/09(水) 19:00:15「geekなぺーじ」のHTTPサーバサンプルを参考にコード書いてみたんですが、
SYNに対してのACKがすぐに返らないときがあります。
4秒程度、20回ぐらいリトライしているとようやくACKを返すんですが、
原因になりそうな事って何が考えられるでしょうか・・・
受けたパケットのチェックサムは問題なかったです。
他に注意すべき所があれば、ご教授のほどよろしくお願いします。
0406デフォルトの名無しさん
2007/05/09(水) 20:58:22俺は>>403ではないが。
もう少しまとめて、整理してから書き込んでくれ。
一つ質問があるごとにいくつも書き込まれると、正直、キツイ。
>>343、>>390の件に関しては、プロトコルレベルでのサーバの挙動が問題だろうね。
「特別な処理」ではないと思う。
Nortonが間にいるから通信できない、ってわけじゃないでしょ。
0407デフォルトの名無しさん
2007/05/09(水) 21:07:24それだけじゃわからんが、途中でパケットが落ちてるとか、
そもそも鯖が重くてSYNに反応していない等。
0408Nortonがあると通信できないのは何故
2007/05/09(水) 21:17:19率直に言うと、netstat -anoでTCPの状態を見た場合、
確立している接続のForeignAddressがLocalAddressになっている接続があります。
Local Foreign
(1)TCP 127.0.0.1:25 127.0.0.1:2002 ESTABLISHED 2092(サーバ)
(2)TCP 127.0.0.1:2002 127.0.0.1:25 ESTABLISHED 3992(Norton)
(1)のForeignAddressが(2)のLocalAddressになっている
この場合、何故かサーバとクライアントの通信が行えません。
Nortonのメール送受信のスキャンをなくせば(2)がなくなり通信が行えます。
僕もはっきりとはわかりませんが、プロトコル以前にサーバとクライアントの通信ができていない
(Accpetまではするがsendもrecvも結果が現れない)ようです。
僕のイメージとしてはクライアント->NortonなどX->XサーバのようにNortonとサーバとの通信ができていないように感じます。
確かに特別な処理はなさそうなのですが、Radishなどの他のアプリではできるので
些細な違いがあるのかなと思って探しています。
どうぞご支援をよろしくおねがいします。
0409デフォルトの名無しさん
2007/05/09(水) 21:18:51少なくともsageろ。
0410406
2007/05/09(水) 22:20:12俺はSMTPレベルの話だと思っているんだけどな。
Nortonは>>343のサーバからの送信を待っているんじゃないかな。
それが無いからHELOを溜め込んだままなんだろう。
TeraTerm - ( Norton - ) Radishのときと、TeraTerm - ( Norton - ) >>343のサーバの場合での、
両方のSMTPレベルでのフローを整理してみ?
0411デフォルトの名無しさん
2007/05/09(水) 23:10:55[INFO] サーバーあたりの接続数を制限する WinInet
ttp://support.microsoft.com/kb/183110/ja
Windows XP/2003のTCP同時接続数制限とその回避
ttp://itpro.nikkeibp.co.jp/article/Watcher/20060812/245765/
0412デフォルトの名無しさん
2007/05/09(水) 23:19:49そのnetstatの出力は、単にNortonが「サーバ」にソケット接続してることを示してるだけで、
「クライアント」との通信には無関係だと思うが。
nortonがあると、ってのは、nortonがNDISフィルタか、TDIあたりで「クライアント」のソケットに割り込んでるだけでしょう。
正直、情報が五月雨式に出てきて、何がなにやら分からないが、俺も>>410のとおり
nortonのフィルタドライバが、25番ポートの通信をバッファして、SMTPレベルで解釈しようとしてるんだと思う。
telnetでつないで、HELOじゃない適当なデータいれても、サーバ側に届くってのなら、
まずは、
1. 「クライアント」は、shutdown、closeを呼んで、正規の手続きでソケットを閉じる。
2. 「サーバ」は非ブロッキングにするか、ブロッキングなら1バイトずつ読み込む。
3. send、recv、connect、acceptなどは、返り値を全て正常かチェックする。
をやればよいと思う。
複数の条件を一度に変えるんじゃなくて、一つずつ変えていけ。
0413デフォルトの名無しさん
2007/05/10(木) 00:03:46ネットワーク関連のプログラミングをするWindowsでは、
Norton AntiVirusはアンインストールを推奨。
機能停めただけじゃ、まだまだ邪魔する気満々。なんなんだこいつは。
0414デフォルトの名無しさん
2007/05/10(木) 00:08:25誰か助けて頂けないでしょうか。
問1 次を実行した結果を書きなさい
サーバー1
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 8427
int main(int argc, char* argv[]){
struct sockaddr_in server;
struct sockaddr_in client;
int s_wait;
int s_connect;
int client_len;
unsigned char* client_addr;
char buf[128];
0415デフォルトの名無しさん
2007/05/10(木) 00:09:16server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_family = AF_INET;
server.sin_port = PORT;
if((s_wait = socket(AF_INET, SOCK_STREAM, 0)) == -1){
fprintf(stderr, "サーバへのソケットが生成できません。 \n");
exit(1);
}
if(bind(s_wait, (struct sockaddr*)&server, sizeof(server)) == -1){
fprintf(stderr, "ソケットにサーバを設定できませんでした。 \n");
exit(1);
}
0416デフォルトの名無しさん
2007/05/10(木) 00:09:47fprintf(stderr, "待ち行列が設定できません。 \n");
exit(1);
}
client_len = sizeof(client);
if((s_connect = accept(s_wait, (struct sockaddr *)&client, &client_len)) < 0) {
fprintf(stderr, "サーバに接続を要求できません。 \n");
exit(1);
}
if((close(s_wait)) == -1) {
fprintf(stderr, "ソケットディスクリプタをクローズできません。 \n");
exit(1);
}
client_addr = (unsigned char*)&(client.sin_addr.s_addr);
printf("connected to %d.%d.%d.%d.",
client_addr[0], client_addr[1], client_addr[2], client_addr[3]);
0417デフォルトの名無しさん
2007/05/10(木) 00:10:17client_addr[0], client_addr[1], client_addr[2], client_addr[3]);
if((write(s_connect, buf, strlen(buf))) == -1) {
fprintf(stderr, "ソケットへデータを書き込めません。 \n");
exit(1);
}
if((close(s_connect)) == -1) {
fprintf(stderr, "ソケットディスクリプタをクローズできません。 \n");
exit(1);
}
}
0418デフォルトの名無しさん
2007/05/10(木) 00:11:35#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 8427
int main(int argc, char* argv[]){
int ip[4];
struct sockaddr_in server;
int s;
int len;
char buf[512];
struct hostent* server_host;
0419デフォルトの名無しさん
2007/05/10(木) 00:12:09bzero((char *)&server, sizeof(server));
bcopy(server_host->h_addr, (char *)&server.sin_addr,server_host->h_length);
server.sin_family = AF_INET;
server.sin_port = PORT;
if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "サーバへのソケットが生成できません\n");
exit(1);
}
if((connect(s, (struct sockaddr*)&server, sizeof(server))) < 0 ) {
fprintf(stderr, "サーバに接続できません\n");
exit(1);
}
0420デフォルトの名無しさん
2007/05/10(木) 00:13:17fprintf(stderr, "ソケットからデータを読み込めません\n");
exit(1);
}
if((write(1, buf, len)) == -1) {
fprintf(stderr, "ソケットへデータを書き込めません\n");
exit(1);
}
if((close(s)) == -1) {
fprintf(stderr, "ソケットディスクリプタをクローズできません\n");
exit(1);
}
}
0421デフォルトの名無しさん
2007/05/10(木) 00:20:28手順は
送信:
1 標準入力(stdin)から文字列を配列bufへ読み込む
2 配列buf中の文字列をソケットに書き込む(write)
受信:
1 ソケットから文字列を読み込み配列bufへ書き込む(read)
2 配列buf中の文字列を標準出力(stdout)へ書き込む
この1問です ソースは自分でかいたのですが多分あっているかと・・・
どうかよろしくお願いいたします。
0422デフォルトの名無しさん
2007/05/10(木) 00:20:51スレ違い。宿題スレ逝け
0423デフォルトの名無しさん
2007/05/10(木) 00:23:51これはJavaの宿題スレにいけばいいのでしょうか
0424デフォルトの名無しさん
2007/05/10(木) 00:25:330425デフォルトの名無しさん
2007/05/10(木) 00:27:52すいません 実験の授業なんで習ってないことをやってるんです
0426デフォルトの名無しさん
2007/05/10(木) 01:03:00分かったような振りしてそのままホイホイ進めちゃうのかなあ
何でも教えてもらえる身分である学生特有の悪い癖だな
ちゃんと言語の種類くらいは問題出した奴に聞けよ
C/C++スレ逝っとけ
0427405
2007/05/10(木) 10:01:24>411さん
ありがとうございます。
今回のプログラムは単一のクライアントと試験的にイーサネットを介して通信させています。
同時に複数の通信を行っていないので、同時接続数は関係ないかもしれません。
教えていただいたBiotは試してみます。
SYNにACKをすぐに返さないのは、ポートを開いた後であることはMSネットワークモニタ3等を使用して
確認済みです。
bind、listen等を終えているのにもかかわらずSYNに対してのACKがすぐに返らず20回程度のリトライが
発生するようになります。
これはサーバ側でソケットのオープン→クライアント側で送信→サーバ側でクローズのような動作を
繰り返しているうちに発生します。
0428デフォルトの名無しさん
2007/05/10(木) 11:47:27> 俺はSMTPレベルの話だと思っているんだけどな。
問題を切り分けるのに telnet 使うといいかな。
> telnet MAILSERVER smtp
220 MAILSERVER ESMTP
helo localhost ←ここ入力
250 SMTP
help ←ここ入力
(色々)
quit ←おしまい
>
こんくらいやって接続可能かどうか試すといいよ。
0429Nortonがあると通信できないのは何故
2007/05/10(木) 12:35:04>>406さん、Radish(サーバ)×TeraTerm(クライアント)で通信を行い、Radishの詳細ログを見てみました。
見たところNorton(CCAPP)との接続をしていそうな感じはしません。RadishとTeraTermで直接やりとりをしているように見えます。
しかし、netstat -anoで接続状況を見ると相変わらずNortonのプロセスが>>390のように接続を確立しています。
ログ2行目のようにSMTPはクライアントが接続したときサーバはすぐに220〜のメッセージをクライアントに
送信するようなので、自作サーバ(>>400のプログラム)のTest12DoRecv関数の最初で同様のメッセージを送信するようにしたのですが
それもTeraTermには届きませんでした。
RadishではすぐにTeraTermにログ2行目のようなメッセージが受信されます。
まったくもって謎です。
以下詳細ログ
SMTP-SERVER Connected from localhost[127.0.0.1]
SMTP-SERVER > 220 localhost.localdomain SMTP Radish 3.0.0-b035; Thu, 10 May 2007 12:22:32 +0900
SMTP-SERVER < HELO (TeraTermでHELO<CRLF>を入力)
SMTP-SERVER Connected from localhost[127.0.0.1]
SMTP-SERVER > 250 localhost.localdomain Helo localhost[127.0.0.1], Pleased to meet you.
SMTP-SERVER < QUIT (TeraTermでQUIT<CRLF>を入力)
SMTP-SERVER > 221 closing connection
SMTP-SERVER DisConnect
0430Nortonがあると通信できないのは何故
2007/05/10(木) 13:45:31>>412さん、telnetで127.0.0.1 [25]につないでもホストへ接続できませんでしたと出ます。これはRadishがサーバでも同じでした。
なのでTeraTermでlocalhost:25で接続してHELOではない適当なHOGEなどの文字を送ってみたのですが、Radishではちゃんと受信したらしくエラーメッセージが返ってきました。
自作サーバでは受信できていないようです。
>1. 「クライアント」は、shutdown、closeを呼んで、正規の手続きでソケットを閉じる
HELOコマンドをホストに送信してすぐにshutdown、closesocket等を行うクライアントを作りためしてみましたが、
自作サーバではAcceptまではするのですがHELOを受信できませんでした。
そして次にRadishに対して自前クライアントでHELOを送りshutdown、closesocketすると意外なことがわかりました。
そのときのRadishの詳細ログです。
SMTP-SERVER Connected from localhost[127.0.0.1]
SMTP-SERVER > 220 localhost.localdomain SMTP Radish 3.0.0-b035; Thu, 10 May 2007 13:39:02 +0900
SMTP-SERVER < QUIT
SMTP-SERVER > 221 closing connection
SMTP-SERVER DisConnect
意外だったのはHELOの受信記録がなく送信していないQUITの受信記録があることです。
皆さんの意見をもとに考えるとNortonがHELOを正しいSMTPコマンドと解釈せずに捨てて、
shutdown、closesocketしたことでNortonが勝手にQUITを送っているのかなと思いました。
0431Nortonがあると通信できないのは何故
2007/05/10(木) 13:55:41sendの直後にshutdownをしていたのでそれで送れていないだけでした。
でも送っていないQUITを受信しているのは変わりません。
やっぱりNortonがSMTPレベルで仲介していると考えるべきなのでしょうか。
0432Nortonがあると通信できないのは何故
2007/05/10(木) 13:57:59int iRet;
WSADATA sWSAData;
addrinfo sHints, *pInfo = NULL;
::memset(&sHints, 0, sizeof(sHints));
::WSAStartup(MAKEWORD(2, 2), &sWSAData);
SOCKET s = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
if (s == INVALID_SOCKET) return;
sHints.ai_family = AF_INET;
sHints.ai_socktype = SOCK_STREAM;
sHints.ai_protocol = IPPROTO_TCP;
::getaddrinfo("localhost", "25", &sHints, &pInfo);
iRet = ::connect(s, pInfo->ai_addr, pInfo->ai_addrlen);
if (iRet == SOCKET_ERROR) return;
char* pszMsg = "HELO localhost \r\n";
iRet = ::send(s, pszMsg, ::strlen(pszMsg), 0); // SMTP(HELOコマンド)送信
if (iRet == SOCKET_ERROR) return;
::Sleep(5000); // 念のためsendが完了すると思われる時間待つ
::printf("Send Msg[%s]", pszMsg);
iRet = ::shutdown(s, SD_SEND);
if (iRet == SOCKET_ERROR) return;
iRet = ::shutdown(s, SD_RECEIVE);
if (iRet == SOCKET_ERROR) return;
iRet = ::closesocket(s);
if (iRet == SOCKET_ERROR) return;
::freeaddrinfo(pInfo);
iRet = ::WSACleanup();
if (iRet == SOCKET_ERROR) return;
::printf("ClientTest01 end\r\n");
getchar();
0433Nortonがあると通信できないのは何故
2007/05/10(木) 14:29:01>>432の自前クライアントとエラーチェックを加えた>>400-401での自前サーバ(ブロッキングで1バイトずつ読み込む)で試してみたのですが、
Nortonを無効にするとHELOコマンドのメッセージが自前サーバに受信されます。
Nortonを有効にするとHELOコマンドのメッセージが自前サーバで受信されません。
0434Nortonがあると通信できないのは何故
2007/05/10(木) 14:45:14今度は>>400-401のrecvをWSAEventSelectで非ブロッキングにして試してみたのですがやっぱりさっきと同じです。
Nortonを無効にするとHELOコマンドのメッセージが自前サーバに受信されます。
Nortonを有効にするとHELOコマンドのメッセージが自前サーバで受信されません。
ただ一つ気になったのはNorton無効のときはクライアントがshutdownしたためか
WSAWaitForMultipleEventsは受信しなくても処理を返してきました。
しかしNorton有効のときはWSAWaitForMultipleEventsが返ってきません。
以下その待機処理の部分だけ書きます。
iRet = ::send(a, achBuffer, strlen(achBuffer), 0);
if (iRet == SOCKET_ERROR) ::MessageBox(NULL, "5", "err", MB_OK);
::Sleep(5000);
::printf("send message[%s]\r\n", achBuffer);
::WSAEventSelect(a, hEvent, FD_READ); // 非ブロッキングモード
while (true) {
::memset(achBuffer, 0, 1024);
// Nortonがなくクライアントがshutdownすると受信しなくても返ってくる
// Nortonがあるとここで返ってこなくなる
ulRet = ::WSAWaitForMultipleEvents(1, &hEvent, TRUE, WSA_INFINITE, FALSE);
if (ulRet != WAIT_OBJECT_0) ::MessageBox(NULL, "8", "err", MB_OK);
iRet = ::recv(a, achBuffer, 1, 0); //ここで処理が返ってこなくなる
if (iRet == SOCKET_ERROR) ::MessageBox(NULL, "6", "err", MB_OK);
if (iRet > 0 && iRet != SOCKET_ERROR)
{
::printf("recv msg[%s]", achBuffer);
}
}
0435Nortonがあると通信できないのは何故
2007/05/10(木) 14:49:41チェックしてみましたがどれも正常でした。
>>413さん
確かにそれでいいかなと思ったのですが、他のメールサーバでは普通に通信できているようなのでその理由が気になります。
また、実はPHPのmail関数を受けるためにローカルだけで動くメールサーバを作っているのですがApacheもNortonと同じような形で仲介してきて
通信が行えなくなります。
Apacheを止めるとPHPも動かなくなるのでこればかりは避けられません。
0436Nortonがあると通信できないのは何故
2007/05/10(木) 14:57:43結果としてNortonが有効なときはRadishはTeraTermと通信可能。自前サーバ(>>400-401)はできませんでした。
皆さん、アドバイスありがとうございます。
でもはっきりいってまだ原因がさっぱりわかりません。
何か検索するキーワードなども教えていただければうれしいです。
例えばnetstatしたときのサーバプロセスの外部アドレスをローカルアドレスに持つNortonが存在する状態
TCP 127.0.0.1:25 0.0.0.0:0 LISTENING 3896(サーバ)
TCP 127.0.0.1:25 127.0.0.1:4766 ESTABLISHED 3896(サーバ) //この外部アドレスと
TCP 127.0.0.1:4766 127.0.0.1:25 ESTABLISHED 3992(Norton) //このローカルアドレスは同じ
こういった状態が正式にはなんという状態なのかもわかりません。
素人で申し訳ありませんがよろしくおねがいします。
0437Nortonがあると通信できないのは何故
2007/05/10(木) 15:10:41原因を聞いて怒らないでほしいのですが、サーバのメッセージの最後に<CRLF>をつけていないためだったようです。
SMTPプロトコルの参考にしていたサイトがあったのですが、
そこにはサーバ側は\r\nをつけないような表現があったのでつけていませんでした。
で、皆さんの言うとおりプロトコルレベルの問題かと思いRadishのサーバのメッセージ送信関数を見ていたら
最後で<CRLF>をつけているのがわかり、早速つけたところ動きました。
本当に長い時間付き合っていただきありがとうございました。
素人なものでまたくだらない質問をするかもしれませんが、何卒よろしくお願いします。
0438デフォルトの名無しさん
2007/05/10(木) 15:15:560439デフォルトの名無しさん
2007/05/10(木) 17:14:24> SMTPプロトコルの参考にしていたサイト
なんで RFC に頼らずそんなものに頼るんだ?
何のためにテンプレに入ってると思ってるんだ。
次からはコテつけてくれ。絶対に答えないから。
0440デフォルトの名無しさん
2007/05/10(木) 17:52:260441デフォルトの名無しさん
2007/05/10(木) 20:58:450442デフォルトの名無しさん
2007/05/11(金) 06:24:400443デフォルトの名無しさん
2007/05/11(金) 10:33:50まだ、「自己解決しました」で終わらせなかっただけマシと思おうや。
0444デフォルトの名無しさん
2007/05/11(金) 11:22:040445デフォルトの名無しさん
2007/05/11(金) 15:20:100446デフォルトの名無しさん
2007/05/14(月) 13:28:020447デフォルトの名無しさん
2007/05/14(月) 13:43:42分割と言うか、send 側で write+flush した分だけ read 出来ると仮定してはいけない(仮定できない)。
但し、send 側で flush したデータ位置で recv 側の受信 flush が呼ばれる事は保証されてたと思う。
0448デフォルトの名無しさん
2007/05/14(月) 14:01:00今 RFC 読み返したのでちょっと補足。
> send 側で write+flush した分だけ read 出来ると仮定してはいけない(仮定できない)。
これは「一度に read 出来ると仮定してはいけない」ということ。
送信側/受信側の TCP レイヤに依存する。
> send 側で flush したデータ位置で recv 側の受信 flush が呼ばれる事は保証されてたと思う。
送信側が直ちに送出するのは保証されてる(must)。
受信側は実装依存っぽく読めるけど、そうしない理由もないし、そうでない実装も見たこと無い。
0449デフォルトの名無しさん
2007/05/14(月) 18:01:30かつ、再送が絡んでくると、保証できなくのでは?
0450448
2007/05/14(月) 18:30:56> the push function does not supply a record boundary marker.
ごめんなさい...orz
0451デフォルトの名無しさん
2007/05/14(月) 22:34:110452デフォルトの名無しさん
2007/05/14(月) 22:44:18ループを回してhtmlを取得するようにしているんですが、connection reset by peerと言うエラーがrecvで出まくります。
いったんクローズして再接続しているんですが、エラーの原因と対処法を教えて頂けないでしょうか。
よろしくお願いします。
0453デフォルトの名無しさん
2007/05/15(火) 00:06:510455デフォルトの名無しさん
2007/05/15(火) 03:14:29もちろんデータは可変長
現在recv出来るデータが全部なのか、分割された先頭部位なのか、後続部位なのかってどうやって判断したらいいの?
0456デフォルトの名無しさん
2007/05/15(火) 03:29:440457デフォルトの名無しさん
2007/05/15(火) 05:24:130458デフォルトの名無しさん
2007/05/15(火) 09:26:510459デフォルトの名無しさん
2007/05/15(火) 10:02:21> 後続部位なのか
これはあり得ないだろ常識的に考えて…。
0460デフォルトの名無しさん
2007/05/15(火) 12:30:04意味不明。
0461デフォルトの名無しさん
2007/05/15(火) 12:34:500462デフォルトの名無しさん
2007/05/15(火) 12:37:49UDPは分割されないけど、到着順入れ替わったりロストしたりする
0463デフォルトの名無しさん
2007/05/16(水) 00:15:59色々あると思うけど、どれが一番いいかねぇ
0464デフォルトの名無しさん
2007/05/16(水) 00:17:28> C10K ヘヴィーロードサーバ
> http://www.kegel.com/c10k.html
0465デフォルトの名無しさん
2007/05/16(水) 02:11:03select
0466デフォルトの名無しさん
2007/05/16(水) 05:58:24WaitForってことはWinsockだよね?
ならオーバーラップI/O
0467デフォルトの名無しさん
2007/05/16(水) 07:40:26TCPでデータ分割が発生した場合にFD_READが複数回呼ばれるじゃない
最初のFD_READで全部じゃないと判断したら
全部集まるまでFD_READが呼ばれる度にキャッシュしていかないといけない?
最後に全部揃ったら最終処理をするような感じ?
これってすげーめんどくさいんだけど
もっとスマートな方法はないの?
0468デフォルトの名無しさん
2007/05/16(水) 07:50:010469デフォルトの名無しさん
2007/05/16(水) 08:12:01最初のFD_READ内でrecvしないという手も無くはない。
対処療法にしかならないけど。
0470デフォルトの名無しさん
2007/05/16(水) 08:17:56昔に比べれば随分便利になった訳だが
0471デフォルトの名無しさん
2007/05/16(水) 08:52:29selectでMaxSize変えてって感じかねー。10000とかにしていいのかなぁ。
すごく遅くなりそうだけど。
>>466
CreateIoCompletionPortとかかな。あれいまいち情報少ないし、
使い方がよくわからないんだよね・・
0472デフォルトの名無しさん
2007/05/16(水) 11:57:4910,000ビットのビットマスクの管理もちょっと考えないとものすごく時間食うよ。
0473デフォルトの名無しさん
2007/05/16(水) 13:49:08もう一段上のデータレイヤ考えて
データ区切りが来るまで読んで返すとか、
所定バイト読んでから返すとかすれば?
0474デフォルトの名無しさん
2007/05/16(水) 16:58:090475デフォルトの名無しさん
2007/05/16(水) 18:58:5164以上待てない
0476デフォルトの名無しさん
2007/05/16(水) 19:43:36とは限らないのでは?http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html#64sockets
まあ俺も2桁以上はselectにすべきじゃないとは思うけど。
>>471
一般的な「スレッドプール」というものの使われ方を知っていれば
IOCPは(少なくとも、仕組みを理解するのは)難しくないよ。
0477デフォルトの名無しさん
2007/05/16(水) 21:29:03よくわからん。
これはGetQueuedCompletionStatusで待つ側のスレッド数を指定すんのかな?
0478デフォルトの名無しさん
2007/05/16(水) 21:53:27キューにタスクが300個残っていたとしても
100スレッド全部同時に実行する必要はないでしょ?
現実にはCPU(コア)数だけしか同時には実行出来なくて
それ以上はタイムスライスを与えて切り替えているわけだから。
じゃあ、↑の状態のとき、いくつまで(同時に)実行するのかは
どうやって決めるか、と。
もちろん、決める必要(方法)が無い場合、100個同時に実行中状態になるけどね。
0479デフォルトの名無しさん
2007/05/16(水) 22:30:10関連付けされちゃうのかなあみたいな・・
1スレッドでGetQueuedCompletionStatusで同時に待てるハンドルは64とかの
制限はないんですかねぇ。MSDNには特に制限書いてないから、リソースの限界
までって感じになるのかな。
しかし、unixは結局pollになるんだよなあ。。
0480デフォルトの名無しさん
2007/05/16(水) 22:31:13制限はなかった。
0481デフォルトの名無しさん
2007/05/16(水) 22:36:51同様の仕組みがUnix系にも導入されつつあるのをご存知?
例えば
http://developers.sun.com/solaris/articles/event_completion.html
とか。
理由はもちろん(手動でキューから取り出して実行スレッドに振り分けるのと比べての)効率。
0482デフォルトの名無しさん
2007/05/16(水) 22:51:16それぞれIO待ちになっているんだけど、スレッドが消費するリソースを軽減させるために、IO待ちを一つのスレッドにまとめて、IOが完了したら再び各スレッドに処理を渡すみたいなのを考えてるんだけど、色々と難があるなあ・・
0483デフォルトの名無しさん
2007/05/16(水) 23:46:27ttp://www.hyuki.com/yukiwiki/wiki.cgi?TheC10kProblem
0484デフォルトの名無しさん
2007/05/17(木) 00:46:45えーと、まず複数スレッドでI/O待ちという状態が
片方でaccept,片方でconnectみたいな全然別のものというならまだしも
もし、1接続1スレッドなどということを考えているのなら
select系で効率を求める以前に、作り方が非効率すぎるだけ。
もちろん、作るのはその方が簡単だけど。
0485デフォルトの名無しさん
2007/05/17(木) 01:15:02>select系で効率を求める以前に、作り方が非効率すぎるだけ。
うぅん?同期タイプの設計って、普通1スレッド1コネクションだと思うど。。
ServletとかApacheとかもそうだし。シングルスレッドでselectが良いと
言うこと?squidとかはそうだけど。
非効率じゃない設計ってのがなにを想定してるのかよくわからんなあ・・
0486デフォルトの名無しさん
2007/05/17(木) 01:28:42だから、あんな非効率(ただし移植性と互換性重視)な作りにしてる。
ていうか、Servletこそスレッドプール使ってるじゃん。
「最小限+α程度のスレッドを用意して、必要なときに必要な数のスレッドを動かす」
がスレッドプールの使い方だよ。
「どのスレッドがどのコネクションに対応している」なんて
Servletには無いはず。
リクエストが来た時点で、空いているスレッドで処理を開始するだけ。
いや、糞実装は知らないけど、普通のAP鯖は、ね。
もしかして、その程度も知らなかったの?
0487デフォルトの名無しさん
2007/05/17(木) 01:32:47acceptするたびに毎回スレッド作っていると思っていたのかね。
squidの作りが、「シングルプロセッサでディスクI/Oが無ければ」
「充分に効率を求めている」と言える作りだよ。
これにマルチプロセッサ(とI/O待ち時間)を生かすことを考えると、
普通はスレッドプールになる。
0488デフォルトの名無しさん
2007/05/17(木) 01:51:23サーバとか作ってみるとわかると思うけど、
1. 同期・ブロックタイプ。各スレッド/プロセスでコネクションを処理
2. 非同期タイプ。シングルスレッドで非同期にrecv/sendを繰り返し処理
の大きく2つに分かれてて、他にもハイブリット的な設計もあると思う。
>もしかして、その程度も知らなかったの?
いや、別に知識くらべをしたかったわけじゃなくて、もしかして詳しい人
かなと思ってて。まあいいや。。
0489デフォルトの名無しさん
2007/05/17(木) 02:03:05「毎回はスレッドを作らない」という意味ではなくて
「沢山のジョブを、少数のスレッド群で処理するやり方」という意味合いがこめられてるの。
だから、数千〜数万のコネクションがあっても利用するスレッドは少数で
実際にリクエストが来て処理を開始する時点で、任意のスレッドに処理させるの。
このリクエストは、コネクション数とは直接は関係しないわけ。
「スレッドプール」という単語、検索してみた?
たぶん、あなた、俺の言ってること全然わかってないよ。
0490デフォルトの名無しさん
2007/05/17(木) 02:08:57効率を求めると、現実にはどうしても
http://pc11.2ch.net/test/read.cgi/tech/1157814833/441
となってしまうのよ。
あなたは、これの上から3番目の状態ね。
0491デフォルトの名無しさん
2007/05/17(木) 02:21:29してるからそういう勘違いをするんじゃない?
例えばtelnetみたいなの考えてみなよ。つなげっぱだったらどうなると思う?
スレッドプールが10で、10クライアントが接続してきてそのまま接続継続して
て、次がきたらどうなる?接続がスレッドを占有する場合もあるんだよ。
HTTPだってKeep-Aliveが長かったり、HTTPプロキシだったら上位のレスポンスが遅れればそれに近い状態になるんだよ。
ネットワークの場合はスレッドプールが単なる計算タスクの処理群とかと違って、接続数とスレッド数が絡んでくるんだよ。
0492デフォルトの名無しさん
2007/05/17(木) 02:25:20表示させているのですが、何故かスクロールバーが自動で下までスクロールされません。
//char配列の表示
SendMessage(hLog_s, EM_SETSEL, 0, -1);
SendMessage(hLog_s, EM_SETSEL, -1, -1);
for(i=0; i<10; i++){
if(lstrcmp(logs[num][i], "*")!=0){
SendMessage(hLog_s, EM_REPLACESEL, 0, (LPARAM)logs[num][i]);
SendMessage(hLog_s, EM_REPLACESEL, 0, (LPARAM)"\r\n");
}
}
return 0;
しかし、ボタンを押したときにこれと同じ動作をさせると、
スクロールバーが自動で下に移動し、最後の行が表示される状態になります。
これは何故WM_CREATEだとスクロールしないんでしょうか?
0493デフォルトの名無しさん
2007/05/17(木) 02:41:44何言ってんの?
もしかして、TCPで細分化されてしまうと
別のスレッドで続きを再開することが出来ないとでも思ってるの?
いや、あなたの書くコードがそういう糞コードだというなら、そうかもしれないけど。
telnetだろうがHTTP/1.1で複数こなそうが
あるいは、HTTP/1.1パイプラインで結合されようが
「スレッドとコネクションが密接な関係がある」なんて
グローバル変数使いまくりのコードでもなきゃ、有りえないって。
コネクションと、それに伴うデータ(中途まで受信したリクエストも含む)は深い関係がある。
でも、「そのリクエストを全て受け取った時点のスレッド」、つまり
「そのリクエスト内容を処理するスレッド」は、
コネクションとは何の因果関係も無いよ。
SOCKETさえ持っていれば、どのスレッドで処理しようと構わない。
途中まで受け取ったスレッドと今回のスレッドが別、
プロセッサも別でも一向に構わない。
それに、そもそもリクエストがどうではなくて
スレッドプールを利用できるかどうかは、処理の粒度に依存するものであって
細切れで待ちが多いネットワーク処理がスレッドプールに最適というだけだから。
まあ、こんなに丁寧に説明してるのにまだ理解できないというのは
全く理解する気が無いのだろうから、もう説明は止めるよ。
あなたの言う事が正しい、で結構。
0494デフォルトの名無しさん
2007/05/17(木) 02:48:23擬似コードでいいから、ちょっと書いてみてよ。
なんか知識はあるけど、やったことない人なのかなんなのかよくわからんなあ。
Apacheよりも効率のいいサーバ設計とやらを書いてみてよ。
0495デフォルトの名無しさん
2007/05/17(木) 03:01:29telnetで10スレッドで10接続、この時に「スレッドが占有される」と言うけれど
「スレッドプールでのネットワーク処理」は、これ自体がありえないわけ。
つまりね、スレッドはrecvでブロックしないの。
ボススレッドでselect系を使って、recv可能であることを判定する。
そして、(recv自体をボススレッドで行うかはともかく)recvしたデータの処理はワーカースレッド群に任せる。
recv可能、あるいはsend可能であると判明したら(selectから戻ったら)
その旨を(SOCKETと共に)記してキューにためる。
そして、ワーカースレッド群に対して「処理があるからどれでもいいから起きて」と伝える。
ワーカースレッド群は、条件変数なりで待機していて、
ボススレッドからの指令がキューに貯まったら(処理が可能になったら)ブレークして処理する。
(「処理」とは単に1文字recvすることかもしれないし、HTTPレスポンスの動的作成かもしれない)
ここでsendする必要があるなら、これもボススレッドのselectに委ね、
続きの処理は再開したスレッドに任せることにして待機。
処理が完全に終わった時も、再び待機。
普通にネットワーク処理の効率を求めると
このようなやり方になる。
これが「スレッドプールを使ったネットワーク処理」で
これを効率よく行うためにIOCPがある。
0496デフォルトの名無しさん
2007/05/17(木) 03:08:34(ディスクI/Oはあっても、ネットワークではブロックしない)
少なくとも、「そういう形に作ることが可能である」ということ。
ここがちゃんとわかっていれば、>>491みたいな発言は絶対出ない。
0497デフォルトの名無しさん
2007/05/17(木) 03:30:11俺が言ってるのはUNIXネットワークプログラミングのp.729 27.12のTCP事前スレッド生成サーバあたりだよ。これ教科書に載ってるような内容だぞ?なんで知らないんだ?どっちかっていうとスレッドプールのサーバってこっちの方が一般的だろうに。。
0498デフォルトの名無しさん
2007/05/17(木) 03:46:15で、ちゃんとgoogleの一番最初の項目くらいは目を通したよね?
俺はちゃんと最初から「」付きで書いてるし
少なくとも「俺の使っている意味」も>>489で説明もしている。
で、まあ、当然、事前生成から応用することも想定できそうなもんだけど。
まあ、servletがどうのと言っていながら
AP鯖が同時接続数と同数のスレッド(数千単位)を動かしていると思っている位だから
想像力を想像する力が俺に足りなかったのかね。
あと、改行してよ。
0499デフォルトの名無しさん
2007/05/17(木) 03:56:18「効率のためにはまずスレッドプールありき」ではなくて
「効率のためにはまずselect系ありき」なわけ。
だから、シングルプロセッサでI/O待ちが無いなら、スレッドなんか使わないほうが効率が良いの。
だけどマルチプロセッサを生かしつつselect系の利点を生かすためにスレッドを使い、
それを効率よく利用するために
「スレッドの再利用」ではない「スレッドプール」という方法になるの。
確かに単に「スレッドプール」と言うだけじゃ「タスクキュー」は含まれないかもしれない。
これは俺が悪かったね。
でも当然「必然的に伴ってくる概念」だとわかっていると思ったから。
0500デフォルトの名無しさん
2007/05/17(木) 04:04:58プールを拡大解釈しすぎなんだよ。スレッドプール自体にワーカスレッドで
ノンブロックソケットにするなんて意味はないんだって。。
0501デフォルトの名無しさん
2007/05/17(木) 04:26:16つーか、どこに「スレッドプールとはノンブロックソケットにすること」と書いてある?
勝手に決め付けないでくれる?
だいたい、あなたこそ「自分の知ってるやり方だけが正しい」と決め付けてない?
俺は「効率よくやるにはselect+スレッドプールになる」。
では「スレッドプールを使って」「効率よく」やるにはどうするか
これを突き詰めていけば自然と>>495のやり方になる、と言ってるだけだよ。
もちろん、他のやり方もあるよ。
あなたの言う、コネクション要求が来たら、切断されるまでそのスレッドを占有するやり方も。
でも>>491みたいに「必ず占有される」わけではなく
>>495みたいに「占有されずにやる」方法もあるわけ。
>>490のリンク先を書いた人の言う、「非同期処理を伴うスレッドプール利用」は
間違いなく後者。
あなたが、そういうやり方を知らなかった、それだけでしょ。
「効率」というキーワードが無ければ、「あなたが想像したservletの処理」も正しいけど
servletがどうやって効率を求めているか想像出来なくて
当然それをsocket処理全般に応用する方法も想像出来なくて
「自分の今まで知っているやり方でやっているに違いない」と思い込むならそれで良いよ。
「ネットワークで」「効率の良い」方法、
つまり、「select」と「スレッド」をうまく複合させること
これを一度でも考えたら
普通は>>495のやり方でスレッドプールを使う形に行き着く。
それをわかっている人なら
IOCPを「効率よい」「スレッドプール」のキーワードだけで
どんなものかおよそ想像出来るの。
0502デフォルトの名無しさん
2007/05/17(木) 05:04:31もう一言だけ付け加えておく。
かなり最初の方でIOCPの名が出る前に、>>466が「オーバーラップI/O」という単語を出してるだろ?
GetOverlappedResultで結果を得る奴。
(これはMSだけじゃなく、Winsockで標準化されている)
で、これにスレッドプールで結果を処理することを想定させた仕組みがIOCPだから。
確かに、Unix系で覚えた知識にスレッドプールという単語を加えても、意味不明だったかもしれない。
でも、Winsock2の知識、つまりOverlappedI/Oの知識があるだけでも、簡単に想像できたはず。
(>>1のWinsockFAQを読むだけでも、「効率にはOverlappedI/O」で
「IOCPはさらにそれを推し進めたもの」とわかる)
こんなことを勝手に脳内で仮定した俺が悪かったね。ごめんよ。
0503デフォルトの名無しさん
2007/05/17(木) 08:14:17まさか一定間隔ごとにスリープしてループじゃないよね?
0504デフォルトの名無しさん
2007/05/17(木) 08:45:25お前らが必死に話してることはこの辺のこと。
どっちの実装のAPサバも存在するし、どっちもスレッドプール使ってる。
しかし、お前ら自分の意見だけ必死にごりおしの典型的永久末端プログラマだな。
0505デフォルトの名無しさん
2007/05/17(木) 09:04:01これを既存のソケットで実装するにはどういう方法が一番簡単なのかというのを知りたいのですが
理屈で考えることも理想を語ることも馬鹿でも出来ることなので
作業工数との兼ね合いで一番容易な手法が一番優れた手法と言えるのですよ
0506デフォルトの名無しさん
2007/05/17(木) 10:46:58> サーバとか作ってみるとわかると思うけど、
> 1. 同期・ブロックタイプ。各スレッド/プロセスでコネクションを処理
> 2. 非同期タイプ。シングルスレッドで非同期にrecv/sendを繰り返し処理
> の大きく2つに分かれてて、他にもハイブリット的な設計もあると思う。
レベル低!
「あると思う」て
0507デフォルトの名無しさん
2007/05/17(木) 10:47:49> これを既存のソケットで実装するには
自分で実装しないのが一番。
0508デフォルトの名無しさん
2007/05/17(木) 10:55:41> プログラムで実装しようとなるとOSから組むほどのスキルと量になるわけで
そんなに難しいことでもないと思うが...
0509デフォルトの名無しさん
2007/05/17(木) 11:00:28Javaなら簡単だよね。
0510デフォルトの名無しさん
2007/05/17(木) 11:02:51の fork+exec っぽいのをスレッドでやったことしかな
いんだけど…。
セレクタが read 可能になったソケットに対してスレッ
ドプールが参照するリクエストキューに入れていくイメー
ジで良い?
read 可能になったからといって該当処理で必要となる
量のデータが read 可能かどうかはわからないと思うん
だけど、足りなかったらどういう動きになるの?
0511デフォルトの名無しさん
2007/05/17(木) 12:27:36データ受けるところとデータ処理するところを分けて、
受けるところで一旦ジョブをサスペンドするんじゃないか。
その時スレッドプールにスレッドを返せばいい。
0512デフォルトの名無しさん
2007/05/17(木) 13:07:55頭で考える理想を実際に形にしようとするとかなり細かいところまで要求される
実際に組んでみると応答順位がばらばらになったりと、即答されなかったりいろいろ問題が起る
決して簡単じゃない
もしライブラリがあるのならそれについて考えるほうがこのスレでは理想的だ
ライブラリの中身や一から作ることなどいくら議論しても無意味
0513デフォルトの名無しさん
2007/05/17(木) 13:17:57そんな安いつっこみはいいからさ、サーバ設計モデルのタイプを一回ちゃんと
考えて、まとめてみると難しさがわかると思うよ。
で、まとまったら書いてみなよ。
0514デフォルトの名無しさん
2007/05/17(木) 13:38:04そうでもない。javaだと、nioのSocketChannelとconcurrentの組み合わせになるけど、
interestingOpsの変更をワーカースレッドからやるとブロックするので、
Selector.select()と同じスレッドで実行しないとデッドロックする、など経験に頼るところが大きい。
あと、javaだと、ジョブをワーカースレッドにディスパッチするところがユーザー空間なのが弱い。
そもそも、ワーカーでの処理をnon-blockingにする、というのは、言語と無関係な技術だと思う。
>>510
ジョブの状態として保持する。具体的には、ジョブのバッファにnon-blockingでrecv可能な
データをコピーする。で、受信要求をあげて、眠る。
>>511
>データ受けるところとデータ処理するところを分けて、
>受けるところで一旦ジョブをサスペンドするんじゃないか。
そんなことしたら、スレッド効率が落ちるからしない。
CPUから見て、「時間のかかる処理」ってのは、ネットワーク、ディスク、各種デバイスとのI/Oしかない。
(メインメモリについては一貫性保持のために同期I/Oしかできないから考慮しない。)
で、あらゆるI/Oを非同期処理に置き換える。すると、一つのジョブは
CPUを使う処理→I/O進行待ち→CPUを使う処理→I/O進行待ち→
の繰り返しになる。なので、「CPUを使う処理」をある程度の数のスレッド、一般には
CPUのコア数以下のスレッドで並列処理し、「I/O進行待ち」になったら待ち行列に入れるってことになる。
I/O進行待ちを終えたジョブを、プールのスレッドに振り分ける部分ってのは、全てのジョブとスレッドが
関与する交差点になるから、ここを速くしたい、ってことでIOCPやepoll、kqueueなんかのフレームワークを作って、
カーネルモードで処理できるようになってきてる。
もちろん、全てのI/Oを非同期処理に置き換える、ってのは言うほど簡単なことじゃない。
ジョブの状態遷移図を把握して、一つの状態内で同期I/Oが必要とならないように状態を分割いていくのが定石だと思う。
0515デフォルトの名無しさん
2007/05/17(木) 14:53:210516匿名希望
2007/05/17(木) 15:42:08以下は、合計5組の2つ整数に対してその最大公約数と最小公倍数
を求めているプログラムです。
10 print "a","b"," gcm","lcm"
20 for i=1 to 5
30 read l,m
40 print l,m," ";
50 c=l*m
60 if l>=m then goto 100
70 w=l
80 l=m
90 m=w
100 r=l-int(l/m)*m
110 l=m
120 m=r
130 if r>0 then goto 100
140 c=c/l
150 print l,c
160 next i
170 data 10,20,5,25,588,133
180 data 58,369,1230,105
問 3個の整数の最大公約数と最小公倍数を求めるにはどのようにプログラムを書き直せばよいか。書きなおしたプログラムと、なぜその様に改変したかの説明を加え、提出しなさい。
この問、教えて下さいっ!!(>_<)
0517デフォルトの名無しさん
2007/05/17(木) 15:53:280518匿名希望
2007/05/17(木) 16:17:350519デフォルトの名無しさん
2007/05/17(木) 16:57:00俺命書ける(誤植ではない)ってやってたよな
これ上げる(上に)とかさ
もう20代前半かー遊んどけばよかったな
>516
マギレヤキセ
さようなら
0520デフォルトの名無しさん
2007/05/17(木) 20:25:180521デフォルトの名無しさん
2007/05/17(木) 21:09:27後半、話がずれてない?
処理単位と受け取るパケット単位のサイズにずれがある時、
特に後者が小さい時にどうするか? って質問でしょ。
アセンブルしてから処理するしかないので、
パケット到着駆動じゃ苦しいロジックになる。
0522デフォルトの名無しさん
2007/05/17(木) 21:28:170523デフォルトの名無しさん
2007/05/17(木) 21:50:13> 効率のためにはまずselect系ありき
select()って今となっちゃむしろ、効率が悪いことで有名でないの?
ビットマスクのサーチをしなきゃいかんし、
selectとともに使われる昔ながらのnon-blocking I/Oの仕組みに比べて
asynchronous I/Oのほうが効率が良いことは>>3のUnix Network Programming
なんかでも述べられてるよね。
それでもUnixの世界では移植性や実装の枯れ具合から、
poll() + non-blocking I/Oが使われることが多いかと思いますが。
Win32ではkernelレベルで実装された汎用キューイングシステムである
IOCP + asynchronous I/OがNT3.5の頃から利用できて、MSもずっと
それを推奨してるわけだよね。これはselect()のような古い仕組みとは
全く違うといわざるを得ないでしょう。
select()やpoll()を使った手法はReactorパターン、
IOCP asynchronous I/Oを使った手法はProactorパターン
という呼び名でも知られていて、
ACEのようなライブラリを使えば、システム依存性をライブラリに吸収させ、
パターンレベルでそれらの機能を利用することが出来る。
kqueueが使えるシステムではそれを使ってくれたりするわけだ。
JavaのWin32のnioは、残念ながらIOCPを使ってはいないようだね。
0525523
2007/05/17(木) 21:53:17×ビットマスク
○ビットベクタ
0526デフォルトの名無しさん
2007/05/18(金) 07:49:09"the principle of policy and mechanism separation"が弱い。
まあWindowsはバカチョンAPIしか提供しない方向だから仕方ないな。
0527デフォルトの名無しさん
2007/05/18(金) 10:16:04kqueueとかと大して変わらなくないか?
0528デフォルトの名無しさん
2007/05/18(金) 10:37:040529デフォルトの名無しさん
2007/05/18(金) 10:52:57スレッドつくらずにJavaで同期と非同期つなげるのは無理だと思います。
ファイルのInputStreamを、FileChannelに置き換えるとかしないと。
>>523
499じゃないけど、select系ってのは、スレッドをジョブに1対1で貼り付けるのとの対比の意味で、
適当なトリガで引っ掛けてジョブを取り出して、もしくはコールバックしてもらって、指定したスレッドで処理する方式
のことを指してるんだと思う。
>>523の分類よりも上位の分類。
JavaのnioのSelectorは、現在のインターフェイスだと、>>523の分類で言うReactorパターン、c10kの文書でいう
レベルトリガパターンしか表現できないから、IOCP使うのは無理ですね。nio2で対応してくるんでしょうか。
0530デフォルトの名無しさん
2007/05/18(金) 11:14:02> JavaのnioのSelectorは、現在のインターフェイスだと、>>523の分類で言う
> Reactorパターン、c10kの文書でいうレベルトリガパターンしか表現できないから、
> IOCP使うのは無理ですね。nio2で対応してくるんでしょうか。
posixでaioが規定されてるとは言え、win以外でのasync I/Oは
まだ移植性、信頼性他の面で色々と問題があるってことなんでないの。
待ってから改めてread()/write()でkernelバッファとの間でコピーするステップが
不要な分、効率いい筈なんだけどな。
0531デフォルトの名無しさん
2007/05/18(金) 11:53:54設計に時間がかかってた。
http://jcp.org/en/jsr/detail?id=203
0532デフォルトの名無しさん
2007/05/18(金) 12:02:14おお、情報提供Thx。
0533デフォルトの名無しさん
2007/05/18(金) 14:19:41PipedInputStream
0534デフォルトの名無しさん
2007/05/18(金) 14:28:52なんか違うぞ、それ。
0535デフォルトの名無しさん
2007/05/18(金) 16:03:49こことかはPiped使ってNIO非同期モデル上に同期ServletAPI
を構築する手法が書いてる。しかし、ジョブの粒度は
大きくなって、Request/Responseを完了するまでが
1つのジョブになるから、並行性は全て非同期のモデル
よりも落ちる。
でも、ここのソース抜粋すると
public synchronized boolean notifyRequestDone() throws IOException {
if (clientInputStream.available() <= 0)
requestReady = false;
ってなってるな・・・
これなら同期モデルでも次のリクエストなかったらキューに
戻すようにすれば、ほぼ近い形になるんだがな。
0536デフォルトの名無しさん
2007/05/18(金) 21:02:490537デフォルトの名無しさん
2007/05/18(金) 23:33:440538デフォルトの名無しさん
2007/05/19(土) 02:24:55pollで十分に感じるんだけど
教えてください
0539デフォルトの名無しさん
2007/05/19(土) 05:13:00結果もすべてのディスクリプタを走査して探す必要がある。
・poll → 呼ぶたびに監視するディスクリプタを再設定する必要はない。
結果はすべてのディスクリプタを走査して探す必要がある。
・epoll → 呼ぶたびに監視するディスクリプタを再設定する必要はない。
結果は対象ディスクリプタだけが返るので、走査して探す必要がない。
0540デフォルトの名無しさん
2007/05/19(土) 05:41:37#define FD_SETSIZE 1024
ってなってる・・だめだめだな
0541デフォルトの名無しさん
2007/05/19(土) 13:09:30それはkernelでサポートしてない場合に使う汎用版(sysdeps/generic)だよ。
0542デフォルトの名無しさん
2007/05/19(土) 16:56:00各fdが読み書き可になったというシグナルを返すモードがあるんじゃなかったかな。
後者は何故作られたのかというと、要は
複数のスレッドで直接同じfdset(pollfd)を待って、どれか1つだけがブレークする、というのを実現し
ボススレッドでの振り分けを不要にすることを目的としているんじゃないかと。
確認してない俺の想像だから
違ったらごめんよ。
0543デフォルトの名無しさん
2007/05/19(土) 17:49:58レベルトリガとエッジトリガですね。
Linux限定のようですが、aioとio_setup(),io_getevents()...の組み合わせが
WindowsのAsyncI/O + IOCPに一番近いように見えます。
0544デフォルトの名無しさん
2007/05/19(土) 21:35:280545デフォルトの名無しさん
2007/05/19(土) 22:47:08TcpClientはではSocketをラップしているようなので大丈夫だとは思うのですが
0546デフォルトの名無しさん
2007/05/20(日) 02:12:44バカが想像で言うなよ
0547デフォルトの名無しさん
2007/05/20(日) 03:43:28サーバーはスレッドを一つ使い、accept()をずっとループさせています。
クライアントからの接続を受けると、そのクライアント用にスレッドを1つ作成し、
そのスレッドの中でrecv()をずっと回しています。
クライアントが終了したり接続したりするたびにスレッドの破棄、生成を行うわけですが、
_beginthread()と_CloseHandle()でそれを行うと次第に動作が不安定になってきます。
何かいい方法はないでしょうか?
0548デフォルトの名無しさん
2007/05/20(日) 04:38:58余程のことが無い限りやるべきではない動作のひとつ。
0549デフォルトの名無しさん
2007/05/20(日) 10:10:54_beginthreadexなら別の話
0550デフォルトの名無しさん
2007/05/20(日) 11:50:46sunのスレッドライブラリにケチつけるの?
本気で?
0551デフォルトの名無しさん
2007/05/20(日) 12:41:28外部からソケットをクローズしてやると
recvがエラー終了するから
それを検知して内部からスレッドを終了する
0552デフォルトの名無しさん
2007/05/20(日) 13:43:13>_endthread は、スレッド ハンドルを自動的に終了しますが、
>_endthreadex は自動的に終了しません。このため、_beginthread
>および _endthread を使用するときには、Win32 CloseHandle API
>を呼び出してスレッド ハンドルを明示的に終了しないでください。
事実上、_beginthreadexを使うしかWinでは選択肢はない
0553デフォルトの名無しさん
2007/05/21(月) 00:08:04TCPのコネクションをcloseする際、タイミングによっては
A B
FIN−>
<−FIN
ACK−>
という風にオープン時のような3wayで終わっている場合があります。
RFCや文献を見ますと終了時はFIN,ACK,FIN,ACKと4TCPセグメントを
交換して終わる(それに応じてTCPの状態が遷移して
最後にCLOSEDになる)のですが、上記の場合ですと、AはCLOSING
から抜け出せない気がするんですが実際にはCLOSEDになっている
ようです。
おそらくこれは2番目のFINパケットを1番目のFINのACKとしても使用
しているから(オープン時と同様の3way hand shakeのように処理して
いる?)だと思いますが、だとすると疑問が残ります。このように
処理した場合、1番目のFINに対するACKパケットと2番目(Bから)の
FINパケットの到達順序がたまたま逆になった場合と、区別が付く
のでしょうか?
0554デフォルトの名無しさん
2007/05/21(月) 00:46:40> おそらくこれは2番目のFINパケットを1番目のFINのACKとしても使用
違います。TCPの状態遷移図とにらめっこしましょう。
0555553
2007/05/21(月) 02:09:30の図の補足ですが、1番目も2番目もACKフラグが立
っているFINパケットです。
RFC793の状態遷移図をみているのですが、
>>554さんのご指摘ですと、相手のFINを受けた
後はCLOSINGに遷移し、それぞれ相手にACKを
投げる同時クローズになる気がしますが、>>553
に書いたようにACKは片方しか出ていませんです。
0556デフォルトの名無しさん
2007/05/21(月) 10:24:30> FIN,ACK,FIN,ACKと4TCPセグメントを交換して終わる
> FINパケット
> ACKパケット
(用語を)正確に理解しようとしないから、理解が齟齬して、
言葉も誤用してしまうんだよ。
FINやACKはTCPセグメント上どう実現されているのか考えてみてくれ。
それからパケットダンプをよく観察せよ。
0557デフォルトの名無しさん
2007/05/21(月) 20:30:040558デフォルトの名無しさん
2007/05/22(火) 03:38:36acceptをずっとループさせているのですが、使用しているソケット数が10になったら
それ以上接続を受け付けないようにしたいのですが・・・。
11人目にはINVALID_SOCKETを返したいのですが、どうやら11人目は接続待ちキューに
ずっと待たされているようです。listen(sock, 0)にしてもやはりずっとキューで待たされています。
どうにかして待たさないように設定出来ないのでしょうか?
0559デフォルトの名無しさん
2007/05/22(火) 03:56:14これは絶対に1人はキューでずっと待たされるって事ですよね・・・一体どうすれば???
0560デフォルトの名無しさん
2007/05/22(火) 05:40:09ソース晒してごらん
0561デフォルトの名無しさん
2007/05/22(火) 06:03:45listen(sock0, 5);
len_s = sizeof(client_s);
//接続要求を受け付ける
while(1){
for(i=0; i<connect_num; i++){
現在に接続者数を数える();
if(10人以下だったら){
if(sock[i]がconnectされていない){
sock[i] = accept(sock0, (struct sockaddr *)&client_s, &len_s);
//受信用のスレッド作成
hThread_recv[i] = (HANDLE)_beginthread(recv_server, 0, NULL);
}
}
}
}
0562デフォルトの名無しさん
2007/05/22(火) 07:52:4510になったらlistening socketを閉めるとか。
0563デフォルトの名無しさん
2007/05/22(火) 08:40:02バックログで制限するより、>>562の方法が良いんじゃないかと。
以下、MSDNのlistenのところから引用。
Compatibility
The backlog parameter is limited (silently) to a reasonable value as determined
by the underlying service provider. Illegal values are replaced by the nearest
legal value. There is no standard provision to find out the actual backlog value.
0564デフォルトの名無しさん
2007/05/22(火) 10:49:09基本的な部分で手間かけるよりOSに丸投げしたい
0565デフォルトの名無しさん
2007/05/22(火) 16:30:21行う事で目的の動作を果たす事が出来ました。ありがとうございました。
バックログは何かよく分かりませんので、適当にググっておきます。
それはさておき、クライアント側で接続/切断ボタンを超クリックしまくると、時々表示が変になります。
エラーは何も出ないのですが、最前面に出ているのにアクティブじゃなくなって、ウィンドウの一部が消え
背景にあるウィンドウが少しだけ見えるような状態です。これはログウィンドウに大量の文字がある時に起きるっぽいです。
ログウィンドウの最大サイズを3000バイトに制限したら正常に動作し、30000バイトにすると上記の不具合が起きます。
ボタンを連打出来ないような仕様にしてもいいのですが、出来ればあまりしたくありません。
どのようにすればいいでしょうか?
ちなみに接続ボタンを押すと接続/受信用スレッドが立ち上がり、切断ボタンを押すとスレッドが終了します。
0566デフォルトの名無しさん
2007/05/22(火) 19:10:27クライアントで、socket通信を別スレッドに分けて、GUIスレッド(メッセージループをまわしてるスレッド)
の処理を滞らせないようにすれば良いと思う。
WinSockでウィンドウメッセージを使った非同期処理しても、socket送受信後、GUI表示への処理が
重ければ、その間メッセージループはとまる。
0567デフォルトの名無しさん
2007/05/22(火) 19:44:50一応ソケット通信は別スレッドに分けています。
接続ボタン → サーバーに接続&メッセージ受信用のスレッドを作成
切断ボタン → そのスレッドを終了させる
recvをwhileでずっとまわしているので、メッセージによる非同期処理はしていません。
ボタンの処理や再描画等はウィンドウプロシージャで行っています。
メッセージループはWinmain()関数内で行っています。
0568デフォルトの名無しさん
2007/05/22(火) 20:59:210569デフォルトの名無しさん
2007/05/22(火) 21:29:15制限はaccept後にcloseした方がいいです。
0570デフォルトの名無しさん
2007/05/22(火) 21:35:360571デフォルトの名無しさん
2007/05/22(火) 21:38:460572デフォルトの名無しさん
2007/05/22(火) 21:49:56connectが内部でリトライするだけの話だろう。
0573デフォルトの名無しさん
2007/05/22(火) 21:51:18acceptしてcloseするのが正しい。
それが嫌だったら、メルコルータつかえ。www
0574デフォルトの名無しさん
2007/05/22(火) 22:13:35まあ運良くつながる場合もあるだろうけどさ。
しかし、バックログにあるやつがcloseされたりもするだろう。
とにかくそれはサーバの起動停止を繰り返してるわけだから、もう
クライアントからみたら大変なことになってるわけだ。
0575デフォルトの名無しさん
2007/05/22(火) 22:24:170576デフォルトの名無しさん
2007/05/22(火) 22:30:42accept
if(num>10){
close;
}
}
0577デフォルトの名無しさん
2007/05/22(火) 22:50:400578デフォルトの名無しさん
2007/05/22(火) 22:59:040579デフォルトの名無しさん
2007/05/22(火) 23:07:16listenし直さないと10人以下になったときに再度accept出来ないので。
0580デフォルトの名無しさん
2007/05/22(火) 23:25:510581デフォルトの名無しさん
2007/05/22(火) 23:32:30ダメダメダメダメダメダメダメダメダメダメダメダメダメダメダメダメ。
お前才能無い。
0582デフォルトの名無しさん
2007/05/22(火) 23:37:060583デフォルトの名無しさん
2007/05/22(火) 23:59:09「今忙しいから後にしてね」って答える手もある。
HTTPだと、503 Service Unavailable 辺りに相当。
0584デフォルトの名無しさん
2007/05/23(水) 01:17:45listenじゃなくてsocket()とbind()だけでまたaccept出来るようになるんですか?
0585デフォルトの名無しさん
2007/05/23(水) 02:35:210586デフォルトの名無しさん
2007/05/23(水) 20:30:46できないね
0587デフォルトの名無しさん
2007/05/24(木) 00:25:590588デフォルトの名無しさん
2007/05/24(木) 06:58:43Socket socket = server.accept();
if (num > 10) {
socket.close();
}
}
0589デフォルトの名無しさん
2007/05/24(木) 12:04:110590デフォルトの名無しさん
2007/05/24(木) 12:38:430591デフォルトの名無しさん
2007/05/24(木) 18:51:44新たな10人目はどのように接続すればいいのですか?
0592デフォルトの名無しさん
2007/05/24(木) 19:06:190593デフォルトの名無しさん
2007/05/24(木) 20:50:48acceptしてclientソケットを破棄しても
流れるパケットはまったく同じですおw
0594デフォルトの名無しさん
2007/05/24(木) 20:54:09バカバカバカバカバカバカバカバカバカバカバカバカバカバカバカバカ。
お前やっぱり才能無い。
0595デフォルトの名無しさん
2007/05/24(木) 20:56:12意味が分からない。死んだほうがいいんじゃない?
0596デフォルトの名無しさん
2007/05/24(木) 20:58:550597デフォルトの名無しさん
2007/05/24(木) 21:02:29Rubyスレとかバカが発狂してひどい事になってるし。
0598デフォルトの名無しさん
2007/05/24(木) 21:12:20576の通りにしても出来なかったのですが・・・
何か勘違いしてませんか?俺が。
0599デフォルトの名無しさん
2007/05/24(木) 21:21:37for(;;) {
Socket socket = server.accept();
if (num > 10) {
socket.close();
}
++num;
ThreadStart
}
ThreadStart(){
...
--num;
}
0600デフォルトの名無しさん
2007/05/24(木) 21:31:490601デフォルトの名無しさん
2007/05/24(木) 22:54:110602デフォルトの名無しさん
2007/05/24(木) 22:59:59!!!!!!!
そっちのソケットの話でしたか・・・。ようやく意味が通じました。ありがとうございます。
だとしたら、プログラムの仕様上、ソケットのディスクリプタを書き換えないといけないのですが、
sock[i] = sock[j]のような書き方で書き換える事は可能でしょうか?
0603デフォルトの名無しさん
2007/05/24(木) 23:42:200604デフォルトの名無しさん
2007/05/24(木) 23:45:530605デフォルトの名無しさん
2007/05/25(金) 00:00:280606デフォルトの名無しさん
2007/05/25(金) 01:29:27スレッド起こす前に。
なんで書き換える話がでるんや・・・
0607デフォルトの名無しさん
2007/05/25(金) 01:55:040608デフォルトの名無しさん
2007/05/25(金) 02:23:55ってか、sock[i] = sock[j]で出来ました!
長い間付き合ってくれてありがとうございました m(_ _)m
0609デフォルトの名無しさん
2007/05/25(金) 03:28:14ウィンドウを閉じるなどの動作で終了した場合は、終了前にsend()を行う事で相手は終了を知る事が出来ます。
しかし、回線を抜くだとか、異常終了した場合、あいてはそれをどうやって知ればいいのでしょうか?
2つのプログラムを立ち上げて、普通にチャットをしてみました。そして、一つのパソコンの回線を抜いて、
もう一つのパソコンでsend()を実行したのですが、SOCKET_ERRORはかえって来ませんでした。
どうすれば相手の終了を検知できるのでしょうか?
0610デフォルトの名無しさん
2007/05/25(金) 03:31:220611デフォルトの名無しさん
2007/05/25(金) 03:35:34pingとか打つのってなんか抵抗あるんですが、別に悪い事ではない?んですよね?
0612デフォルトの名無しさん
2007/05/25(金) 03:38:06生きてるかどうかを確認するためだけのやり取りをするってことね。
0613デフォルトの名無しさん
2007/05/25(金) 03:39:20ちょっと探してきます!
0614デフォルトの名無しさん
2007/05/25(金) 03:40:040615デフォルトの名無しさん
2007/05/25(金) 03:41:36自分の作ったプログラムじゃないのか?
0616デフォルトの名無しさん
2007/05/25(金) 03:44:07サーバークライアント型です。サーバーにメッセージを送って、
マルチキャストしてるのですが、そのマルチキャストの過程でSOCKET_ERRORを返した
ソケット(スレッド)は終了処理を行いようにしたいのですが、SOCKET_ERRORを何故か返してくれません。
0617デフォルトの名無しさん
2007/05/25(金) 03:48:46(send/recv以外の非同期完了を同じ方法でできないかなと考えているのですが)
0618デフォルトの名無しさん
2007/05/25(金) 04:10:57を返してこなければ、死んでると考える
0619デフォルトの名無しさん
2007/05/25(金) 04:26:21各クライアント毎にパケットを受け取った最終時刻をメモっておいて
一定時間(上の期間の倍程度)受け取っていない相手は落ちたとみなす
0620デフォルトの名無しさん
2007/05/25(金) 05:09:59またはクローズイベントが帰ってくる
定期的に何でもいいから意味のないデータを送ってみる
0621デフォルトの名無しさん
2007/05/25(金) 05:13:130622デフォルトの名無しさん
2007/05/25(金) 05:16:55TCPの性質上順次処理になるから過負荷がかかってる時に応答がタイムアウトする
0623デフォルトの名無しさん
2007/05/25(金) 06:30:25送るパケットのサイズによってはフラッシュされずにエラーにならないとか
0624デフォルトの名無しさん
2007/05/25(金) 09:22:42pingを行う関数をワーカースレッドで呼び出してスレッド内でICMPの生ソケットを
作成しpingを送信してselect()でTimeOut値を最大に設定してpingの応答があるまで
スレッドが終了させないようにしています。
一台のクライアントに対してselect()はping応答があるまで待機するのですが
そのうち一台でもping応答があるとすべてのクライアントに発行している
ping応答が返ってくるという現象に悩まされています。
複数台のうち全部のクライアントがping応答しない場合は問題ないのですが
pingをマルチスレッドで複数実行する場合に何か注意しなければならない
ことでもあるのでしょうか?
ご存知の方ご指摘をよろしくおねがいします。
申し遅れましたがやりたいことは一台のPC(Windows)から60台程度の
クライアント(Windows)の活死を確認したいのです。
0625デフォルトの名無しさん
2007/05/25(金) 09:27:18スレを汚して申し訳ないですが改めてお願いします。
WinSock2プログラミングという書籍を参考に複数のクライアントに
pingを行う関数をワーカースレッドで呼び出してスレッド内でICMPの生ソケットを
作成しpingを送信してselect()でTimeOut値を最大に設定してpingの応答があるまで
スレッドが終了させないようにしています。
一台のクライアントに対してselect()はping応答があるまで待機するのですが
複数台の場合その中の一台でもping応答があるとすべてのクライアントに
発行しているping応答が返ってくるという現象に悩まされています。
また複数台のうち全部のクライアントがping応答しない場合は問題ないのです。
pingをマルチスレッドで複数実行する場合に何か注意しなければならない
ことでもあるのでしょうか?
ご存知の方ご指摘をよろしくおねがいします。
申し遅れましたがやりたいことは一台のPC(Windows)から60台程度の
クライアント(Windows)の活死を確認したいのです。
0626デフォルトの名無しさん
2007/05/25(金) 10:40:47for でループして
192.168.0.0 - 192.168.0.255
まで廻してない?
0627デフォルトの名無しさん
2007/05/25(金) 10:46:32そんな感じです。
全クライアント並行してリアルタイムに
Ping応答を受信しようと目論んでおります。
40台のクライアントがあれば
スレッドはforで40回廻して作成しています。
それが問題なのでしょうか?
0628デフォルトの名無しさん
2007/05/25(金) 11:13:39サーバへ、udpでn秒に一度程度生存確認パケットを送るようにしたら?
n*m秒以上生存確認パケットが届かなければ死亡と見なすとか。
0629デフォルトの名無しさん
2007/05/25(金) 12:14:16生存確認パケットの送信も検討したのですが、
そのサービスの生存と切り分けてPCの生存のチェックをしたい。
との理由でpingを思い立ちました。
マルチスレッドのpingが無理なら
めんどうですが直列にpingを発行するしかないのでしょうか。
0630デフォルトの名無しさん
2007/05/25(金) 12:20:460631デフォルトの名無しさん
2007/05/25(金) 13:01:32>複数台の場合その中の一台でもping応答があるとすべてのクライアントに
>発行しているping応答が返ってくるという現象に悩まされています。
ここの意味がわからない。
ping応答がある、というのが、パケットモニタで見て、ICMP ECHO REPLYメッセージが
返ってくる、という意味なのか、
select()で、socketが選択されるという意味なのか。
select()されるという意味なら、実際にrecvfromで受信して、ソースアドレスを調べればOK。
WinSockのICMP書けるソケットがどんなもんかわからんが、
SOCK_RAWってアドレス選択受信できなかった気がする。
0632デフォルトの名無しさん
2007/05/25(金) 13:08:56実際にselect()でのタイムアウト待ちではなく
setsockopt()による受信タイムアウトの設定と
recvfrom()によるソースアドレスも調べてみました。
すると、電源が落ちているPCのIPアドレスが入っていました。
もちろんコマンドプロンプトからPINGを打って応答が無いIPです。
0633デフォルトの名無しさん
2007/05/25(金) 14:03:160634デフォルトの名無しさん
2007/05/25(金) 17:31:17回線を抜くなどして終了した場合に、サーバーが非常に重くなるのですが
これは仕様ですか?
0635デフォルトの名無しさん
2007/05/25(金) 17:40:37ここはサーバ運用についての質問スレではないと思うが?
0636デフォルトの名無しさん
2007/05/25(金) 17:54:31http://www.bullopensource.org/posix/
0637デフォルトの名無しさん
2007/05/25(金) 18:47:47ごめんなさい、説明不足過ぎました。サーバークライアント型のチャットプログラミングをしています。
サーバー側は、クライアントからのconnect()があると受信用のスレッドを立ち上げます。
その受信用スレッドのアルゴリズム的な問題じゃないかなとか思ったり・・・。
簡単に書いたので見てみて下さい・・・。
void recv_server(LVOID pParam){
変数いろいろ;
//クライアントからメッセージを受信
while(end_flag==0 && recv(sock[num], recvbuf, sizeof(recvbuf), 0)!=SOCKET_ERROR){
lstrcpyn((PSTR)code, recvbuf, 10); //コード抽出
if(lstrcmp(code, "****")==0){
マルチキャスト();
}
//配列の初期化
memset(recvbuf, 0, sizeof(recvbuf));
memset(addition_c, 0, sizeof(addition_c));
}
//終了処理
lstrcpy(any->name, "*");
any->flag = 0;
closesocket(sock[num]);
sock[num] = NULL;
}
0638デフォルトの名無しさん
2007/05/25(金) 19:01:18正直、省略だらけのソースなので全然分からんけれど、
一つだけ質問。
プログラム上では、どうやって
「回線を抜くなどして終了した場合」を
検出しているの?
0639617
2007/05/25(金) 19:20:18いや、確かにそれを使っているのですが・・・
そのaio_readなりaio_writeなりを使って、
connect/accept/closeなどの非同期完了を通知したいんです。
0640デフォルトの名無しさん
2007/05/25(金) 19:58:50クライアントは終了直前(WM_DESTROY)に終了コード(9バイトの文字列)を送ってきます。
サーバー側では、それを受信したらend_flagを1にして、recvのループを抜けるように設計しています。
それとは別に接続フラグがありまして、accept完了したらフラグを1に、クライアントが接続終了したら0にします。
>>637のマルチキャストの時に
if(send()==SOCKET_ERROR && 接続フラグ==1){
回線を抜くなどして終了したとみなす
}
のようにしています。(接続してるはずなのにSOCKET_ERRORが出たときに異常終了とみなす)
ただ、これは思ったとおりに動かないので今はただfor(;;)send();のようにしています。
0641637
2007/05/25(金) 20:32:49そのスレッドは終了します。が、その2分の間がサーバーの動作が非常に重くなります。
これはなぜなのでしょうか・・・。
0642デフォルトの名無しさん
2007/05/25(金) 20:42:490643デフォルトの名無しさん
2007/05/25(金) 20:47:320644デフォルトの名無しさん
2007/05/25(金) 20:50:040645デフォルトの名無しさん
2007/05/25(金) 20:53:400646デフォルトの名無しさん
2007/05/25(金) 21:00:07ループを調べたところ、特にrecvのところでループしていませんでした。
>>643
調べてみます。
>>644
それは通常終了の時にしか0を取得出来ないような気がしますが・・・
accept周りを調べた後にやってみます
0647デフォルトの名無しさん
2007/05/25(金) 21:07:48acceptの方もループの問題はないようです。
あと、>>644ですが、recv()から進まないので意味ないですね・・・。
0648デフォルトの名無しさん
2007/05/25(金) 21:38:00ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4059.txt
もう・・・ダメぽ・・・
0649デフォルトの名無しさん
2007/05/25(金) 21:54:05まあ、関係ないとは思うけど。
0650デフォルトの名無しさん
2007/05/25(金) 22:04:380651デフォルトの名無しさん
2007/05/25(金) 22:05:02Visual Basicではじめるネットワークプログラミング超入門
という本、書店で見掛けないなぁ。ネットワーク関連はそういうものなのか。
川崎のヨドバシ、あおい書店、丸善を見たけど置いていなかった。
PC書籍コーナー大きいんだけどな。
0652デフォルトの名無しさん
2007/05/25(金) 22:15:42一応その部分を変えてみましたが、やはりサーバーが凄く重くなってしまいます。。。
0653デフォルトの名無しさん
2007/05/25(金) 22:32:220654デフォルトの名無しさん
2007/05/25(金) 22:49:36・なんで、SOCKET_ERRORの判定を遅らせてるんだ
・異常終了時と正常終了時の処理を共通化しろよ。
0655デフォルトの名無しさん
2007/05/25(金) 22:49:48デバッグ以外では�@のメッセージしか受信できません。何が理由か全然分からないので教えてください
�@220-Welcome to the Yahoo! JAPAN GeoCities FTP server.
�A220-Need help? Get all details at:
220-http://help.yahoo.co.jp/help/jp/geo/
220-
220-No anonymous logins accepted.
220 Yahoo!
0656デフォルトの名無しさん
2007/05/25(金) 23:06:09recvからの戻り値は受信バイト数ですが、それを使う場面がないのでそのようにしています。
また、SOCKET_ERRORの判定を遅らせているとはどこのことでしょうか?(汗
正常終了と異常終了時の処理は共通化してみます
0657デフォルトの名無しさん
2007/05/25(金) 23:08:050658デフォルトの名無しさん
2007/05/25(金) 23:18:05-1or0だとエラーで終了、それ以外だと通常の処理、ですか?
ではそのようにしてみます。
ちなみに無限ループ系ではありませんでした。全てのループする可能性のある場所に
MessageBoxを仕掛けて確かめてみました。
0659デフォルトの名無しさん
2007/05/25(金) 23:40:140660デフォルトの名無しさん
2007/05/25(金) 23:44:380661デフォルトの名無しさん
2007/05/25(金) 23:55:16どっかからサンプルコード拾ってきて、自分のコードと比べてご覧。
0662デフォルトの名無しさん
2007/05/26(土) 00:05:19本買うお金がないので、ネットにある情報だけを寄せ集めてがんばりました。
recv()に関しては他のサンプルと違う点は'\0'をつけるかつけないかくらいだと思うのですが・・・。
終端文字もsendしてるので私の場合はそれをしてないくらいかな・・・。
しかし、それが回線を抜いた時に重くなる事と関係しているのでしょうか?
0663デフォルトの名無しさん
2007/05/26(土) 00:07:280664デフォルトの名無しさん
2007/05/26(土) 00:16:01サーバーが重いのはそのせいのような気がしてきました。もしsock[i]の先のクライアントが回線を抜いた場合、
そのソケットにsend()したらどうなりますかね?SOCKET_ERRORは特に返ってこないっぽいのですが、
相手は落ちてるのにSOCKET_ERRORが返ってこないなんてことはあるんでしょうか?
0665デフォルトの名無しさん
2007/05/26(土) 01:23:07どうやら、回線を抜いたクライアントのソケットに対してsend()をしたのが原因だったようです。
0666デフォルトの名無しさん
2007/05/26(土) 01:39:050667デフォルトの名無しさん
2007/05/26(土) 01:41:540668デフォルトの名無しさん
2007/05/26(土) 01:57:59スレッドが同じだから前後の調和がおかしくなる
タイムアウト設定するとカーネル外部でループするからCPUが100%になる
ブロックにすればカーネルでイベント処理するから負担がない
0669デフォルトの名無しさん
2007/05/26(土) 02:09:10重いんじゃなくて単にブロックしてただけじゃん…
0670デフォルトの名無しさん
2007/05/26(土) 02:39:51非同期やっかいそうですね・・・。同期にして良かったですw
>>669
ごめんなさい。この場合、send()はすぐにSOCKET_ERRORを
返してくれるものだと思っていました。
0671デフォルトの名無しさん
2007/05/26(土) 13:20:39判断のしようがない。イーサネットとはそういうもの
0672デフォルトの名無しさん
2007/05/26(土) 13:25:520673デフォルトの名無しさん
2007/05/26(土) 21:50:060674デフォルトの名無しさん
2007/05/27(日) 00:26:09以前(2000年ごろ?)こういうので悩んでたなあと懐かしくなったよ
0675デフォルトの名無しさん
2007/05/27(日) 09:17:260676デフォルトの名無しさん
2007/05/27(日) 10:06:490677デフォルトの名無しさん
2007/05/29(火) 23:17:46accept した socket に、最初の EVFILT_WRITE イベントが来た
タイミングで send で EAGAIN が返るまで書き込んだ後、
EVFILT_WRITE が来なくなるんだが、そんなもんなんだろうか?
0678デフォルトの名無しさん
2007/06/01(金) 20:34:23長文ですがよろしくお願いします。
今UDPを使っての通信対戦つき2D格闘ゲームを設計しています。(スト2みたいなものです)
現在自分で考えた設計は以下のようなものなのですが、一般的な方法と剥離していないでしょうか?
・子は自分のコマンドを親に送る
キー入力そのものを送ると、通信ロスで抜けが出た場合うまくいかないと考えられる。
なので「昇竜拳コマンドが正しく入力されたか」はクライアントでチェックして、その結果を送る
・子からコマンドが届いた親は、そのタイミングでコマンドが成立したものとしてゲームに反映する
・親は常に「ゲーム全体の状況(キャラの座標、モーション、HPなど全て」を子に送りつづける
・子は親から送られてきた状況を画面に反映する(すでに反映した内容より古いものについては破棄)
。。。
子はキー情報を送る。親は状況情報を送る。という感じです。
子は完全なビュアーです。(予測画面遷移はさせます。昇竜拳の途中でラグってピタっととまるのは格好悪いので)
32bitあれば十分子から親にコマンド情報が送れる状況です。
ただ、毎フレーム子のコマンドを送るだけだと、届かなかった時「コマンド入力したのに技がでない!」という状況になってしまいます。
UDPは576バイトまでのデータなら(順序が入れ替わることなく)送れるようなので
毎フレーム「最新のコマンドから、100フレーム分くらいまでの過去のコマンドまでをまとめて送ってやる」
これなら100回のうち1回でも届けば、(100フレーム分の遅延があったことになりますが)コマンドが親に届くかなと期待しています。
ここまでひっぱっておいてなんですが、この方法だと遅延が起こるたびにどんどん遅延が累積してしまいます。
『「子はコマンド情報を送る」という考え方は間違いなのかなぁ』と悩んでいるところです。
何かしらアドバイスや、参考図書の紹介などをしていただけると幸いです。
よろしくお願いします。
0679デフォルトの名無しさん
2007/06/02(土) 23:40:07過去100フレーム分つけて送ればいいじゃん
0680デフォルトの名無しさん
2007/06/03(日) 00:28:16インターネットなんていろんな遅延しまくるネットワークを複合的に使ってるから、タイミングとか同期とか無理。
マカはとりあえず氏ね。
0681デフォルトの名無しさん
2007/06/03(日) 00:47:58例えば、通常は変更のあったキャラ座標などのデータのみ送信して、
一定時間ごとに全情報の送信を行い同期を取るようにする…とか。
あと気になるんだが、32Bit分のデータを1フレームごとに送りつけるとか言わないよな?
LAN以外でまともに動かなくなるぞ。
>>680
ネットワークゲームにはLAN専用という素晴らしい逃げ道もあるんだぞ。
ちゃんと設計ができていれば、
インターネットでナローバンド環境でも問題なく動くゲーム作れるし。
0682あい
2007/06/03(日) 00:54:07ある試験の100人分の点数だったとする。試験の合格点は65点以上で、
40点未満は追試がおこなわれる。このデータを集計するためのに以下のようなプログラムを作成せよ。
int atai[100] = { 37, 65, 74, 61, 51, 90, 89,78, 68, 69, 74, 74, 69, 44, 70, 78, 75, 70, 50,
25, 30, 72, 79, 67, 98, 98, 75, 79, 68, 45, 70, 66, 59, 61, 68, 34, 19, 71, 74, 76, 43, 72, 53, 48, 50,
87, 57, 85, 91, 74, 85, 61, 69, 61, 61, 32, 85, 86, 45, 71, 64, 83, 87, 59, 73, 75, 92, 59, 77, 54, 79, 98, 50, 61, 39, 53, 62, 62, 90, 33, 88, 73, 88, 86, 78, 38, 98, 97, 97, 79, 77, 97, 83, 44,
91, 72, 81, 85, 77, 45 };
(1)全員の平均点を求める
(2)合格者の人数を求める
(3)合格者の平均点を求める
(4)追試者の人数を求める
(5)追試者の平均点を求める
実行結果
全員の平均点は、68.6点です。
合格者は64名、平均点は79.8点です。
追試者は 9名、平均点は31.9点です。
このプログラミング作ってください。
0683デフォルトの名無しさん
2007/06/03(日) 00:55:25そんなものこの世から消えてなくなるといいですね
0684デフォルトの名無しさん
2007/06/03(日) 00:56:23英語でおk
0685デフォルトの名無しさん
2007/06/03(日) 02:36:160686デフォルトの名無しさん
2007/06/03(日) 06:19:47つ えくせる
0687デフォルトの名無しさん
2007/06/03(日) 06:49:28http://japan.cnet.com/news/media/story/0,2000056023,20349834,00.htm
0688デフォルトの名無しさん
2007/06/03(日) 11:38:06スペースは全角スペースになってるから、自分で適当になおして。
#include <stdio.h>
void main(void){
int atai[100]={,,,,}; //ここは自分でコピペして
int i, sum=0, ok=0, ng=0, ave;
for(i=0; i<100; i++){
sum += atai[i];
if(atai[i]>=65){
ok++;
}else if(atai[i]<40){
ng++;
}
}
ave = 72;
printf("全員の平均点は%dです。", ave);
ok = 64;
printf("合格者は%d名、平均点は79.8点です。\n", ok);
ng = 9;
printf("追試者は%d名、平均点は31.9点です。\n", ng);
}
0689デフォルトの名無しさん
2007/06/03(日) 11:39:12>>682氏ね
0690デフォルトの名無しさん
2007/06/03(日) 12:50:16文字コードは UTF-8 な。歯磨いて寝ろよ。
begin-base64 644 682.cpp.gz
H4sICDA6YkYAAzY4Mi5jcHAArVTLattAFN3rK4YEwqhRXNuyZMl28yMlGHk0SURlyejhQoMhDoR2
Uyh01UWh3fSxaRddBVr6McZtPqP3zh05shO3pVQwaObeM+eeOfPYjRIRl6FkgyjNi0wG40NjdxWb
SlGkWT2SlGOZRaIeEuOgOD00jCgpWFAE0cMj9oCdGQw+u2sx17FYtwP/lsUcaH7TYp4PMQ9i2HxL
YRGjcJDrYL9JmK5DfQda2yGsjbk2NMC6UMP3qCmsT7wdjcW5rgvzfdKAORv4W6ihRTW7LmE7NvE6
8O94VNMDfgeaB9w+4RUWx4qv4oVmtwnnuao+8iusCzU8W3NhXZu0+m09xrjmRf2+rq04fdLjtqmh
f7atNXjEhX+siX7Z2gu/S61b+avHqAP9VWtBvS3SjPmOY8z6hiHiIM9ZGE2jUGZ6K3F381IImefD
UZpBYthfJTKZR8V6OC/CXo/OzwAgh3ur2dvyRALlJ+UojkRPwbQIvpXO2sZkqvn49TaFc9cxrXXR
vNOEUIXjurNCcaJkZzND0U7TKGTpRGYBVOUmV+6INJMmE2mSF9o05c8xVxk22JRh1lAbyDVtmzj8
CNCYlPnpcBSIRzTT7K8BZ6vRjMk4lxs8lZzfsBDDTJ2KMIV9kSxLyyTktEodmgZxKS29crRikkkR
5VGaVNI1sJDjCTwOascm6WPeajbgNN+g++QuGKEowYhmffGZLMosYQdq/nGcgvUHBLxH1Pus2XBM
dl+NaBW3Vq5J9msk+38kMWar9QdT2PUTqR24ffhgUGnWpRQmEKIcl3FQSA6IxkieRAmH84UDCYZC
F8zAshjJoyeSgx0zelbHAYI162ZJKAO7FuZ8T72+zSOLUQ9J0mOOfeStDQFkHpl3X8TqWGzJqoOn
94ksTLOhDMQp1zJullYF9PJWV7m6uHSnzDqZSMuCDQZsZ3n5Yfny7WL+aXn1Zfn66c+Lq8X88+J8
voNZOoLVRugyUKFlqrkK/H4xf7U4v1B4RQ0q4v5dlV48+/Hm6/X5JRQgNOnTe6Axz7H2xi1UmZq8
O7TdvCP/pO36+7frj+9IGyN69Oy/SCP3/0rYzPgFTs4uOCcIAAA=
====
0691デフォルトの名無しさん
2007/06/03(日) 15:27:31どんなにくるしくても
おいしいものたべて
うんこしたらなおるよ! ∧ ∧∩
( ゚∀゚ )/
ハ_ハ ⊂ ノ ハ_ハ
('(゚∀゚ ∩ (つ ノ ∩ ゚∀゚)')
ハ_ハ ヽ 〈 (ノ 〉 / ハ_ハ
('(゚∀゚∩ ヽヽ_) (_ノ ノ .∩ ゚∀゚)')
O,_ 〈 〉 ,_O
`ヽ_) (_/ ´
ハ_ハ な お る よ ! ハ_ハ
⊂(゚∀゚⊂⌒`⊃ ⊂´⌒⊃゚∀゚)⊃
0692デフォルトの名無しさん
2007/06/03(日) 18:33:24>>679さん
フレーム番号は添えますが、問題は「遅延して送られてきたコマンドは有効にするべきか」です。
遅延して送られてきたコマンドを全て有効とするならば、遅延が発生するたびにその後の全てのコマンドが遅延することになります。
ですが逆に切り捨ててしまうと、コマンドの「歯抜け」が発生してしまい「入力したはずが技が出ない」となってしまいます。
古過ぎる(20フレーム以上遅延している)コマンドは無効化。とかがいいんでしょうかね
>>680さん
確かに厳しいものの、最近は大抵の対戦ゲームが通信対応。なるべく対応したいなと思います。
後の方がおっしゃっているとおり、最悪「LANではいけますが、インターネットだと厳しいですけど、おまけ機能と思ってお楽しみください」という逃げ道もありますし。
>>681さん
サーバーが吐くデータは、現在の状況全てなのですが、意外とバイト数少なそうなのです。
キャラの座標。どっち方向向いてるか。モーションID。現在のモーションフレーム番号。その他ちょいちょいで32バイトもあれば十分そうです。
>あと気になるんだが、32Bit分のデータを1フレームごとに送りつけるとか言わないよな?
ダメでしょうか?ど素人ですいません。
UDPで友達(友人ケーブル。私光回線)と64bitのデータを送信しあうテストをしてみたところ、データは全て受信、遅延は21msという状況でした。
21msならば、1フレームちょい。入力から画面反映の遅延は、3フレーム程度なら違和感が無かったので十分かなと思ったのですが…。
0693デフォルトの名無しさん
2007/06/03(日) 18:59:04たとえば
236+P が送られて、コマンドが解釈されて波動拳が出るまでのシーケンスは
1フレ目 2
2フレ目 3
3フレ目 6+P
として、これが発動して波動拳が出るまではモーションが8フレームある
入力が2,3と来て、その後3フレーム遅延してから6+Pが来たとするとき
2フレーム前から波動拳は成立したとして、モーションを頭2フレーム分
削って波動拳を出したことにすれば 操作感もフレームも損ねることなく
ゲームは進行可能。
書いてて穴だらけでげんなりしてきたが、まあこういうkとおをやろうと
してるんだよね?
0694デフォルトの名無しさん
2007/06/03(日) 19:07:15細かくありがとうございます。
そのとおりです。CPU対戦であっても、通信対戦のホストであっても、入力から必ず入力は3フレーム遅らせてからゲームに反映させます。
ただ、
>入力が2,3と来て、その後3フレーム遅延してから6+Pが来たとするとき
ここの部分は違います。
これですと遅延のせいで技が出なくなってしまうと考えられるので、クライアントには以下のようなコマンドを送るようにさせます
1フレ目 「下キー押されてるぜコマンド」
2フレ目 「下キー押されてるぜコマンド」「右キー押されてるぜコマンド」
3フレ目 「右キー押されてるぜコマンド」「P押されてるぜコマンド」「波動コマンド成立してるぜコマンド」
コマンドはそれぞれ1bitで管理し、種類は現在20個ちょいあります。(32bitに十分収まりそうです)
そこ以外はおっしゃるとおりです。
「3フレーム分の猶予」の中から、遅延分を差し引いてゲームに反映させます。
裏を返せば、3フレームしか猶予がないので、3フレーム以上の遅延が出る通信状況ではラグっていることが目に見えてわかることになります。
0695デフォルトの名無しさん
2007/06/04(月) 20:16:15UDPなのがガンなんじゃね?
0696デフォルトの名無しさん
2007/06/05(火) 00:21:38それに入力されたコマンドを全部反映させてやろうとすることによる遅延は、TCP/IPだともっとひどいことになるぞ
0697デフォルトの名無しさん
2007/06/05(火) 00:59:07PUSHもしらんのか?
TCP/IPって書き方もやめろよ。
それから>>694のような状況でTCPが一番無駄なのは、不必要な場合の再送。
「遅延」だなんて片腹痛い。
0698デフォルトの名無しさん
2007/06/05(火) 12:13:59PUSHとか関係なく、経路の遅延のことを言っているんじゃないか?
0699デフォルトの名無しさん
2007/06/05(火) 19:22:06TCPなら遅延しないかというとそんなこともないわけで
0700デフォルトの名無しさん
2007/06/05(火) 20:43:310701デフォルトの名無しさん
2007/06/05(火) 21:01:51どこを調べれば解るのでしょうか?
0702デフォルトの名無しさん
2007/06/05(火) 21:37:12ソース
まあセーフなんだけどね
0703デフォルトの名無しさん
2007/06/05(火) 23:05:57前waitに入った後に別スレッドでctlでディスクリプタ足した場合は
それは有効なのかどうかがわからんときも困った。
どうも平気そうなんだけど保証がとれないんだよなあ。
0704デフォルトの名無しさん
2007/06/06(水) 09:26:30マニュアル・リファレンスを信じることが出来るか、という話だよね。
マニュアルが信じられないなら ソースを見るしかない。
0705デフォルトの名無しさん
2007/06/06(水) 09:41:43明示されてないことが多いんだよねえ
0706デフォルトの名無しさん
2007/06/06(水) 14:48:00それは明示する必要ないッス。
他の「スレッド」からcloseしたら、そのディスクリプタは閉じられるッス。
0707デフォルトの名無しさん
2007/06/06(水) 19:25:37ありがとうございます。
とりあえずソース読みます
0708デフォルトの名無しさん
2007/06/06(水) 20:45:44じゃなくて、そもそも書いてないって話だろ
参考にはなるけどソースは一実装だからそれこそ信じられない。
それよりも仕様を明示するべきだろうに。
0709デフォルトの名無しさん
2007/06/06(水) 21:55:49見つけにくいところにこっそり書いてあるんですよ。これが。
0710デフォルトの名無しさん
2007/06/07(木) 01:29:570713デフォルトの名無しさん
2007/06/09(土) 00:12:370715デフォルトの名無しさん
2007/06/10(日) 18:14:230716デフォルトの名無しさん
2007/06/11(月) 21:44:270717デフォルトの名無しさん
2007/06/13(水) 09:53:29このwpeproみたく、socketの盗み見、編集をするためのAPIの名前のヒントをください。
dllのinjectionで割り込むのがスジでしょうか。
http://wpepro.net/
NEGiES version 1.57
みたいなやつを作ろうとおもってます。
ttp://hp.vector.co.jp/authors/VA036210/
参照はioctlsocketにSIO_RCVALLでできるのまでわかっています。
でも、これだと編集はできないです。
winpcapを利用しても参照はできても盗み見るだけで、編集はできないと思っています。
過去ログはHTTP Errorで読むことができませんでした。
どなたか本スレの過去ログ場所を知っておられたら、そちらも教えていただけないでしょうか。
0718デフォルトの名無しさん
2007/06/13(水) 15:53:350719デフォルトの名無しさん
2007/06/13(水) 18:44:340720デフォルトの名無しさん
2007/06/13(水) 23:04:31過去ログ
ttp://makimo.to/cgi-bin/search/search.cgi?q=%83l%83b%83g%83%8F-%83N%83v%83%8D%83O%83%89+%83%7E%83%93%83O%91%8A%92k%8E%BA+&andor=AND&sf=2&H=&view=table&shw=&D=tech
0721デフォルトの名無しさん
2007/06/14(木) 20:11:07recvfrom()で止まったまま受信してくれないことがあるんです。
手動起動の場合はちゃんと問題なく受信してくれるので一回目のrecvfrom()を
Windowsの起動時間で判断して遅延して行うことで逃げてるんですが
他に何か解決策はありますか。
0722デフォルトの名無しさん
2007/06/14(木) 21:06:42過去ログはHTTP Errorで読めません。読む方法があるのですか?
>>718
ドライバ フィルタから以下をぐぐって呼んでみました。
ttp://ruffnex.oc.to/kenji/windriver/packet/
希望する実装ができそうです。ありがとう。
しかし、NEGiESはサービスの起動もしていないようですし、
ドライバとしてではなくフィルタリングしているようにみえます。
どういう実装でされているか知っておられるかたおられませんか。
以下だとアプリケーションレベルですが、あくまでフィルタリングの設定でパケットの改ざんができないなと。
ttp://ruffnex.oc.to/kenji/text/fire_a/
>>719
その方法でもできますね。調べてみます。
0723デフォルトの名無しさん
2007/06/15(金) 01:47:38そこいらへんはネットワークじゃなくてwindowsプログラミング。
0724デフォルトの名無しさん
2007/06/15(金) 06:20:03NEGiESは思いっきりドライバ使ってるが?
0725デフォルトの名無しさん
2007/06/15(金) 08:01:38スレ違い、ですかね?
>>724
Version 1.57から使ってます?
sysファイルがあるってことはつかってるってことか・・・。
ども、レスありがとうございます。
0726デフォルトの名無しさん
2007/06/15(金) 10:24:53ほとんどのソフトでできないようなきがする。できるソフトがあったらおしえてください。
0727デフォルトの名無しさん
2007/06/15(金) 10:44:330728デフォルトの名無しさん
2007/06/15(金) 11:19:580729デフォルトの名無しさん
2007/06/15(金) 19:48:16Unixでtcpdumpなら普通に出来る。
$ tcpdump -i lo
0730デフォルトの名無しさん
2007/06/15(金) 23:26:02の第二引数のeventsって自分でメモリ確保しないとダメなの?
環境によって動いたりEFAULT返したりするんだけど・・・
もしかして今まで動いてたのはメモリ破壊起こしてたのにたまたま動いてたってことなのかな?・・・
0731デフォルトの名無しさん
2007/06/16(土) 00:18:15自分で確保。 確保してくれるんだったら struct epoll_event **events じゃなければ
受け取れんだろうが。
0732デフォルトの名無しさん
2007/06/16(土) 08:39:29linuxだったらとれるね。windowsだったらとれないね。
フィルタドライバつくったらとれるのかどうかは知らん。
0733デフォルトの名無しさん
2007/06/16(土) 15:03:24現行のWindowsではフィルタドライバでは多分無理。
MSのネットワークモニタでも、WinPcapでも実現できていない。
Windowsでループバック・インターフェースを利用する場合はドライバを経由しないからかな?
ttp://homepage2.nifty.com/spw/tips/PacketDump.html
WinSockでもIPヘッダまではキャプチャできるみたいだけど、ループバックは無理みたい。
0734デフォルトの名無しさん
2007/06/17(日) 07:36:06WindowsのLoopback Adoptorをsniffするなんてほとんど意味ないんじゃないの?
0735デフォルトの名無しさん
2007/06/17(日) 11:39:42というかできないならできない理由を知りたい。
0736デフォルトの名無しさん
2007/06/17(日) 12:23:51有効な物理Adaptorがない時でも、
無条件でWinsockを初期化しようとするアプリを動かすために、
Loopback Adaptorというのを作った。
BSDのloopback interfaceとは、もともとの目的が違う。
だから、BSDのloopback interfaceの視点から見れば、不完全なもの。
0737デフォルトの名無しさん
2007/06/17(日) 20:19:49このWPFでとれないものかね?
0738デフォルトの名無しさん
2007/06/27(水) 17:02:42tcpdumpってどうやってインターフェイスから直接パケットを拾っているんですか?
0739デフォルトの名無しさん
2007/06/27(水) 17:11:420740デフォルトの名無しさん
2007/06/27(水) 20:57:36ぜんぜん「直接」じゃない。 わざわざそうするための特別なソケットにパケットを分岐させて
ユーザーランドに送り出す機能がカーネルに実装されている。 Winは良く知らんが。
0741デフォルトの名無しさん
2007/06/27(水) 21:52:55横流ししてもらう。
0742デフォルトの名無しさん
2007/06/27(水) 23:02:44構造の違いかな。
0743デフォルトの名無しさん
2007/07/06(金) 10:51:50WSACleanup();は、WSAStartup()と対で、
一つのプログラムに、一つでいいんですよね。
プログラムの最後とか。
で、プログラムでマルチスレッドの作っていたのですが、
WSACleanup();は、他のスレッドの通信も切断してしまったんです。
WSACleanup();って、どうせプログラムの最後にしか書かないし、
もう、いらないんじゃないかと思ってきました。
WSACleanup();無しで、終了すると不具合とかありますか?
レベルが引く質問ですみません。よろしくお願いします。
0744デフォルトの名無しさん
2007/07/06(金) 11:52:35それは素人だましなので無視してOK
0745デフォルトの名無しさん
2007/07/06(金) 12:53:58それはない。
0746デフォルトの名無しさん
2007/07/06(金) 13:12:12TCPと比べて信頼性が低いとの事ですが、どれほどのものなのでしょうか?
ネットワークの状態にもよるとは思いますが、一般的にどれくらいの率で送信失敗するのでしょうか?
また、どのような理由で送信失敗することが多いのでしょうか?
0747デフォルトの名無しさん
2007/07/06(金) 13:16:00電気的ノイズで落ちたりHubが落としたり途中経路のルータが落としたり
通信相手や自分の送受信バッファ溢れで落としたりと、
環境や状況依存なのでパケットロス率は実環境で長期的に計測しないとわからない。
0748デフォルトの名無しさん
2007/07/06(金) 13:40:21ありがとうございます。とりあえずネットワーク的に繋がっていれば
何か特別な異常がない限り基本的にはパケットロスしないと考えてもいいのでしょうか。
UDPだとパケットロスした事も気付けないので、あまり信頼しすぎても問題なのですが。
一応、30人以上を想定した多人数でのチャットソフトを考えているのですが、
TCPによるユニキャスト送信の繰り返しをループで繰り返すのはどうかと思いまして・・・。
0749デフォルトの名無しさん
2007/07/06(金) 13:53:080750デフォルトの名無しさん
2007/07/06(金) 13:58:35昔TCPでチャット作った事あるのですが、send()をループに入れたら動作が怪しかったです。
for(i=0; i<10; i++);みたいな感じでsend()してもメッセージが届かなかったり・・・。
ループの間にSleep(500)とかはさんだら普通に動いたんですけど、遅延がなぁ・・・
0751デフォルトの名無しさん
2007/07/06(金) 14:19:32プロトコル、OSの問題だと考えたがるものだね
0752デフォルトの名無しさん
2007/07/06(金) 14:46:47それを考慮しないコードは全てウンコだろ
0753デフォルトの名無しさん
2007/07/06(金) 15:15:50for(j=0; j<5; j++){
send(sock[j], sendbuf, sizeof(sendbuf), 0);
}
}
こういう書き方はよくないんですか?
0754デフォルトの名無しさん
2007/07/06(金) 15:34:03sendの戻り値チェックを怠ってるし、アウトだね。
sendがエラーのときはどうする?送信バイト数が少なかったときは?
それらをわかってて無視してるならいいけど
0755デフォルトの名無しさん
2007/07/06(金) 15:44:35特にエラーを返さなかったです。なので手の打ちようがなかった記憶が・・・
0756デフォルトの名無しさん
2007/07/06(金) 16:05:390757デフォルトの名無しさん
2007/07/06(金) 16:41:11考えてよくありません。
0758デフォルトの名無しさん
2007/07/06(金) 16:41:57仕様にそう書いてあるなら、ありえます。
0759デフォルトの名無しさん
2007/07/06(金) 17:01:44仕様書こそが聖典なのだ。
そしておきゃく様こそ神。
0760デフォルトの名無しさん
2007/07/06(金) 17:08:40>>758の言っているのはAP:I仕様書。
0761デフォルトの名無しさん
2007/07/06(金) 17:28:12対戦型アクションゲームや動画のストリーミングなら、(考慮した末に?)
ロスしたデータは無かったことにして動作するようにしても良いと思う。
「クライアントAが8フレーム前に技出してたんだ」とか「3秒前に表示すべきだった画面の左上、今届いたな・・」
とか後から気付いてもどうしようもない。
>>746
ピア間の実効帯域を超えて send すると盛大にドロップする。
そうでないときにはほとんどドロップしない。
0762デフォルトの名無しさん
2007/07/06(金) 17:30:13LinuxのSocketプログラムの基本は理解しているのですが、
WinSockは初めてです。
初心者本として以下のもはどうでしょうか?
他にも何かお勧めがあれば教えてください。
WinSock2プログラミング―Windows Sockets APIによるネットワークプログラミング
のすべて
0763デフォルトの名無しさん
2007/07/06(金) 17:33:500764デフォルトの名無しさん
2007/07/06(金) 18:17:28それがあれば十分。後はMSDN。
0765デフォルトの名無しさん
2007/07/06(金) 19:07:11処理するプログラムを作成しています。
opendirでファイル名を取得してfreadで読みこんでいるんですが、
ファイルの書きこみが終了したタイミングがわからないので
3つファイルがあったら、2つめまでを読みこむようにしています。
他に何かいい方法はないでしょうか。
アドバイスお願いします。
0766デフォルトの名無しさん
2007/07/06(金) 20:58:15fflush();
0767デフォルトの名無しさん
2007/07/06(金) 21:08:45データコネクションが閉じられたときなわけで、自明じゃん。
、と思てしもた。
0768デフォルトの名無しさん
2007/07/06(金) 21:33:040769デフォルトの名無しさん
2007/07/06(金) 21:37:54ファイルの更新時刻で適当に判断するなり、送信完了時にフラグファイルを
送るなり、ftpdをハックするなり、好きにすればいいんじゃね
0770デフォルトの名無しさん
2007/07/07(土) 00:25:20そしたらこっちはパッシブクローズして、アプリ層でTCPからEOF受け取るまで
データ読み出せばOKかな・・・?
0771デフォルトの名無しさん
2007/07/07(土) 01:28:55Cプログラミング初心者スレに行け。
0772デフォルトの名無しさん
2007/07/07(土) 02:15:000773デフォルトの名無しさん
2007/07/07(土) 02:15:54同じ様にルーターでIPマスカレードしてる別のLAN内のPCへ、
間にサーバーマシンを経由せずに、直接TCP接続する方法ってあるかな??
相手側のルーターでパケット破棄されちゃうから、無理だよね??
0774デフォルトの名無しさん
2007/07/07(土) 05:36:160775デフォルトの名無しさん
2007/07/07(土) 15:13:400776デフォルトの名無しさん
2007/07/07(土) 17:54:060777デフォルトの名無しさん
2007/07/07(土) 19:07:120778デフォルトの名無しさん
2007/07/07(土) 19:47:250779デフォルトの名無しさん
2007/07/08(日) 05:33:00UPnPU
│э│
└─┘
0780デフォルトの名無しさん
2007/07/08(日) 06:21:39UPnPU
│э│<ネプグラ君だよ ヨロシク
└─┘
0781デフォルトの名無しさん
2007/07/08(日) 16:27:350782デフォルトの名無しさん
2007/07/08(日) 16:28:180783デフォルトの名無しさん
2007/07/08(日) 22:00:010784デフォルトの名無しさん
2007/07/09(月) 00:01:06UPnPU
│э│<冷たくしないでヨ
└─┘
0785デフォルトの名無しさん
2007/07/09(月) 11:56:31UDP にすべきか TCP にすべきかは「抜けても大丈夫か」
で分ける。一回/日の時刻同期とか「抜けてもいいや」
なら UDP。
データに対して ACK なり再送なりを要求するなら TCP。
UDP で再送とかを実装するくらいなら TCP 使えよ、って
TCP の RFC にも書いてあった希ガス。
0786デフォルトの名無しさん
2007/07/09(月) 12:08:120787デフォルトの名無しさん
2007/07/10(火) 09:57:260788デフォルトの名無しさん
2007/07/14(土) 03:01:26#include <sys/socket.h>
をインクルードして
struct ip ip_header;
とやると、
error: storage sizeof ip_header isn't known
となります。
netinet/in.hにstruct ipがあるのに
何でサイズが解らないなんてエラーがでるんでしょうか?
0789デフォルトの名無しさん
2007/07/14(土) 10:37:220790デフォルトの名無しさん
2007/07/14(土) 11:00:47struct ipの中で使ってる型が不明
0791デフォルトの名無しさん
2007/07/14(土) 15:32:550792デフォルトの名無しさん
2007/07/14(土) 17:17:05返信ありがとうございます。
struct ipの定義をコピペして、メインのコードに直接定義したら
コンパイルが通りました。
謎です。
どのように解決すればいいのでしょうか?
0793デフォルトの名無しさん
2007/07/14(土) 17:37:40ip.hはincludeしてるのか?
0794デフォルトの名無しさん
2007/07/14(土) 17:44:48環境は?
0795デフォルトの名無しさん
2007/07/15(日) 09:58:48ヘッダーが山ほどあっていつも迷うから
思いついたもんは片っ端からインクルードしてる
これって良い習慣?
0796デフォルトの名無しさん
2007/07/15(日) 10:05:33いいんじゃね
0797デフォルトの名無しさん
2007/07/15(日) 19:18:00お勧めのライブラリってなに?
Linuxだけど
0798デフォルトの名無しさん
2007/07/15(日) 19:21:140799デフォルトの名無しさん
2007/07/15(日) 21:30:590800デフォルトの名無しさん
2007/07/15(日) 22:30:083個もglobal IPなんて日曜プログラマが自由につかえるかっつの
自由に使えるランデブーサーバーとかないのかよ
それにしてもUDP hole punchingでさえNATによっては使えないとか
機種の何%かは動かないのがあるとかなんなんだこれは…大した研究分野だよ
skypeとかだってほとんど中継ばっかなんだろホントは
0801デフォルトの名無しさん
2007/07/15(日) 23:50:16自宅内で複数ネットワーク組めば?
0802デフォルトの名無しさん
2007/07/15(日) 23:51:350803デフォルトの名無しさん
2007/07/16(月) 00:10:200804デフォルトの名無しさん
2007/07/16(月) 00:13:29飛んでったパケットがそのまんま帰ってくるのを許す機能
0805デフォルトの名無しさん
2007/07/16(月) 01:05:52サーバー1つで良いはずだが? ネットワーク環境3つって意味?
っていうか 今ではUDP自体セキュリティ的に飛びにくいから実用的ではないよ・・特に企業がらみ
ルーター買って設定無しで付けてるエンドユーザー向けならば
UPnPをソケットで直接叩いた方がまだ可能性は高い
0806デフォルトの名無しさん
2007/07/16(月) 01:55:04こんな信頼性の欠片もない技法、実際に使う環境で動くことが証明できなきゃ意味内
>>805
2つのNATの外側とランデブーサーバーであわせて3つ
0807デフォルトの名無しさん
2007/07/16(月) 02:01:080808デフォルトの名無しさん
2007/07/16(月) 02:12:49最初に理想環境でテストしとかないと
実環境のときにトラブルシュートできないよ?
こういうのって学校や職場で最初に習わないのかなぁ
0809デフォルトの名無しさん
2007/07/16(月) 02:16:190810デフォルトの名無しさん
2007/07/16(月) 02:24:51固定グローバルという意味でなくて外側という意味ね 納得
あまりお勧めできないけど・・
自宅のPCで穴あけてサーバーにして
両クライアントはネット喫茶等々でテスト
どっちみち信頼性得るには 日曜プログラマレベルでは荷が重いよ
ルーターによって癖あるし テストで動かすだけなら簡単だけど
ロジックうんぬんを勉強しても意味無いカテゴリだよ
0811デフォルトの名無しさん
2007/07/16(月) 02:35:47書いとくね
S=サーバー、 C1=クライアント1 C2=クライアント2
1、C1とC2が サーバーSにUDPを送る
2、(重要)C1から C2へ、C2からC1へUDPを飛ばす、このパケットはルー ターに阻止されるがルーターのテーブルに書き込まれるので
3、SはC1,C2から来たUDPのポート情報、IPアドレス返す
S->C1(C2の情報) S->C2(C1の情報)
4、C1,C2はそのIP、ポート番号を使い直接アクセス
0812デフォルトの名無しさん
2007/07/16(月) 07:41:390813デフォルトの名無しさん
2007/07/16(月) 07:48:510814デフォルトの名無しさん
2007/07/16(月) 08:33:000815デフォルトの名無しさん
2007/07/16(月) 09:51:35ほんとマジで意味無い
一部のルーターにあるマッピングのアルゴリズムの穴を「行儀がいい」だとか言って
そんな穴を突いてるだけの技術はどんだけ行儀がいいのかと思ったら
>>811
本当に超重要なのはここの
http://www.brynosaurus.com/pub/net/p2pnat/
Test Resultsの章じゃないか?
なぜこんな表見せてサポートしてるだのしてないだの議論しなきゃならんのかを考えたい
0816デフォルトの名無しさん
2007/07/16(月) 12:30:23http://yonex1.cis.ibaraki.ac.jp/~yonekura/lecture03/lecture03d.html
を参考にしながら作っていますが、
WSAAsyncSelect(sock, hWnd, uMsg, lEvent)
のhWndとはどのように取得すればいいのか、どうもよく分かりません。
また、ウィンドウにメッセージが送られた時の処理の書き方ですが、下記のような感じであってますか?
WndProcやDialogProcなど、調べたら似たようなものが多数出てきてパニクってしまいました。
(クライアントからconnectされた時に、ウィンドウにWM_USER+1のメッセージを送る)
WSAAsyncSelect(sock, hWnd, WM_USER + 1, FD_ACCEPT);
(メッセージマップ関数に↓を追加)
ON_MESSAGE(WM_USER + 1, OnCon)
(メッセージを受け取ったときの処理)
LRESULT CServerDlg::OnCon(WPARAM wParam, LPARAM lParam)
{
・・・
}
上記の記述で、クライアントからconnectされた時に、
OnCon関数を実行してくれるのでしょうか?
初歩的な質問かと思いますが、どなたか教えて頂けたら幸いです。
0817デフォルトの名無しさん
2007/07/16(月) 20:22:44http://c-au.2ch.net/test/-/soc/1152718893/i
0818デフォルトの名無しさん
2007/07/17(火) 00:37:29hWndはウィンドウハンドル
CreateWindowExの戻り値やFindWindowで取得した値を使えばいい。
0819デフォルトの名無しさん
2007/07/17(火) 01:33:13最後にIPv6のコーディングをしたのは1998年です。
0820デフォルトの名無しさん
2007/07/17(火) 01:45:29けど積極的に使ってもメリット少ないだけだからなあ
大きなデメリットも無いが
0821デフォルトの名無しさん
2007/07/17(火) 02:59:21みたいなサポートに忙殺されそうなのでスルー
0822デフォルトの名無しさん
2007/07/17(火) 04:17:10基本的にはナイショの機能扱いだな。
対応してくれって案件が来たら5分で実装完了100万円丸ゲット
が出来たらいいな って感じ
0823デフォルトの名無しさん
2007/07/17(火) 08:09:240824810
2007/07/17(火) 15:46:12ていうか 2年前ぐらいの技術だし 当時は今と逆で
P2Pって素晴らしいって風潮があったから議論する価値は
あったよ。リレーサーバーだとコストかかるし
今はP2P(UDP以外でも、UPnP使っても)というだけで過剰反応されるから閉じた環境でしか使いようがないと個人的には思ってる。
矛盾してるけど日曜プログラマの題材としては面白いと思う
もちろん名前の効いた大手がやるなら別だけど
最近 間にStorn(スペルあってる?)はさんだP2P手がけた・・・
0825デフォルトの名無しさん
2007/07/17(火) 15:53:460826デフォルトの名無しさん
2007/07/17(火) 16:35:19第三者だが、815 の論点は UDP hole punching ならともかく、
より通りにくい TCP hole punching には意味がないってことじゃ
ないかと思うんだが
0827デフォルトの名無しさん
2007/07/17(火) 17:03:44google先生にお願いし、英語ながらサンプルを見つけサーバープログラムを
動かしたのですが、クライアントの接続を1度でも受け付けた場合
WSACleanupで例外(ヒープがどうのこうの)が発生して落ちてしまいます。
何故かデバッグモードのみで発生し、リリースモードでは発生しないので
ますます困惑しています。
WSACleanupで落ちる原因等、なにか解決の糸口になりそうなことを
ご存知の方がいたら是非教えてください。
ちなみにソースは
ttp://www.codeproject.com/internet/SimpleIOCPApp.asp の
multithreaded server using IOCP - 10.7 Kb
IOCP client - 7.1 Kb
を使用しました。
0828デフォルトの名無しさん
2007/07/17(火) 17:26:43ネットワークとは関係ないところでバグってる可能性が高い。
おそらく、ヒープの管理ブロックを壊してる。
0829デフォルトの名無しさん
2007/07/17(火) 22:15:29スレッド関数内でCRTを使っているのでCreateThreadより_beginthreadexを使ったほうがいいと思う。
Description of using C Run-Time (CRT) functions and CreateThread()
ttp://support.microsoft.com/kb/104641/en-us
0830デフォルトの名無しさん
2007/07/18(水) 13:06:00そこで質問なのですが、データグラムに載せるデータが1200〜1500バイトを超えると、DatagramSocket#send()が成功するにもかかわらず
100%の確率で受信側に到達しません(ローカル to ローカルでも100%ロスします)
まだパケットキャプチャはしていませんが、この状態で何か解決策を知っている方がおりましたら、解決策をお教え願えませんでしょうか?
0831デフォルトの名無しさん
2007/07/18(水) 13:28:460832デフォルトの名無しさん
2007/07/18(水) 15:47:55>DatagramSocket#send()が成功するにもかかわらず
Javaは詳しくないんだけど、sendが成功値を返してきて、アプリが実行可能状態になっても、
それはあくまでアプリのバッファデータがTCPのバッファに全部コピーされ、アプリのバッファが
使用可能になりました・・程度の意味しかないんじゃ?
0833デフォルトの名無しさん
2007/07/18(水) 15:55:17それ以前の問題として、
UDP
だ
0834デフォルトの名無しさん
2007/07/18(水) 15:57:46ユーザデータグラムプロトコルです
もとより信頼性が低いのは承知です
しかし高々2つのIPパケットに分割される程度ですむデータグラムも100%ロスはありえないと思って質問しました
>>832
そのようですね
あのあといろいろと実験してみたところ、
とりあえずプロトコルのバッファサイズは無関係で失敗するようでした
また一度インタフェイスまで降りて上がってくるようなブロードキャストが必ず失敗する
(キャプチャすると壊れたIPパケットを受信している)ようです
そう思ってローカルホストに送りつけたところ655xxバイトまでは正常に受信できました
…となると、の手打ちようが無い気がしてきました
0835デフォルトの名無しさん
2007/07/18(水) 16:09:07最近のプロトコルスタックはフラグメント化してくれないとかいう話も
どっかで見たような気がするけどどうなんだろう・・・
(そのOSでは)ブロードキャストパケットのフラグメント化はサポートされてないってことか?
0836デフォルトの名無しさん
2007/07/18(水) 16:25:06UDPだぉ
UDPはフラグメントのサポートもへったくれもない。
そもそも1パケットサイズに入らないデータはサポートしてない。
0837デフォルトの名無しさん
2007/07/18(水) 16:25:35http://java.sun.com/javase/ja/6/docs/ja/api/java/net/DatagramSocket.html#setSendBufferSize(int)
> 注:send(DatagramPacket) を使用して SO_SNDBUF の設定より大きい DatagramPacket を送信する場合、
> パケットが送信されるか破棄されるかは実装によって異なります。
単に破棄されてただけなんじゃね?
0838デフォルトの名無しさん
2007/07/18(水) 16:37:05んなこたーない。IPレベルでフラグメント化するので関係ない。
ただ、ブロードキャストがらみでおかしくなってるのかもね。
SO_BROADCASTたてるとDFも立つとか。
ユニキャストならうまく動くのか?というかOSはなによ?
0839デフォルトの名無しさん
2007/07/18(水) 17:15:148192 バイトの UDP パケットを用いる NFS プロトコルは
実装不可能な想像上の存在か?
0840830
2007/07/18(水) 19:26:32IPヘッダのチェックサムがイカれているっぽいです
Java5/with Windows XP Professional SP2
みなさんありがとうございます
軽いサンプルをうpしましたので、環境で試していただければ一発です
http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=29571
ちなみにこちらの環境では
C:\>java UDPTest 255.255.255.255
server start
client start
0bytes received
...
sent:46080 received:1024 loss:0.9777777777777777
C:\>java UDPTest
...
sent:46080 received:46080 loss:0.0
のような感じです
0841830
2007/07/18(水) 19:30:12ちょっとだけ受信できる(再現性があいまい)ようになりました
かなり不明です。
カナリ実装依存なのでしょうか
0842830
2007/07/18(水) 19:31:020843827
2007/07/18(水) 19:55:47>>828
そうするとWSACleanup内で処理されるはずの部分を
プログラム内で勝手にいじっちゃってるんでしょうか・・。
サンプルそのままでも起きるってことは環境の問題かな。
>>829
ご指摘ありがとう。
早速_beginthreadexに書き換えてみました・・がやっぱり駄目でした。
相変わらずWSACleanupで落ちてしまいます。
デバッグ時にしか起きないのでもう目をつぶってしまおうか、とも思うのですが
それじゃ勉強にならないし、どうにも気持ち悪い・・。
0844デフォルトの名無しさん
2007/07/18(水) 20:12:360845デフォルトの名無しさん
2007/07/18(水) 20:27:37java.net.MulticastSocket 使うのはダメなんか?
0846デフォルトの名無しさん
2007/07/18(水) 21:25:23ダメなのって 255.255.255.255 だけじゃね?
ホスト部だけ全ビット1にしたブロードキャストアドレスでやったら、そのまま動いたよ。
0847デフォルトの名無しさん
2007/07/18(水) 21:32:33!!
ビンゴかもしれません
当方 Realtek RTL8139/810x を使用しているので checksum offload のON/OFFスイッチができませんが
そんな気がしてきました
ありがとうございます
>>845
IPマルチキャストは対応しているかどうかが怪しいのであまり使いたくなかったです
0848デフォルトの名無しさん
2007/07/18(水) 21:45:21当方でも確認しました
参考にさせていただきます
0849デフォルトの名無しさん
2007/07/19(木) 11:10:46Wireshark(旧Ethereal)でTCP/UDPのチェックサムがエラー
ttp://d.hatena.ne.jp/torutk/20070616/p1
0850デフォルトの名無しさん
2007/07/19(木) 11:42:12ぜんぜん違うだろ
0851デフォルトの名無しさん
2007/07/19(木) 13:02:05受信側でパケットキャプチャしたところパケットは届いているようなのですが
DataArrivalイベントが発生しないことがあり、精度が低いものになっています。
又、送信のループの中でSendDataの後にSleepを入れることで受信の精度が上がりました。
UDPとはこういうものなのでしょうか?
送信時にSleepを入れずに精度を上げたいと思うのですが
わかる方がいましたらよろしくお願いします
0852デフォルトの名無しさん
2007/07/19(木) 14:35:42お子ちゃまは黙ってTCP
0853デフォルトの名無しさん
2007/07/19(木) 15:35:04まずはこのスレ読んでみたら?
0854デフォルトの名無しさん
2007/07/19(木) 16:33:36winsockコントロールはそういう使い方駄目
0855851
2007/07/19(木) 18:52:51マルチキャストにしなきゃいけないものでして・・・
>>853
過去ログを見直してましたら同じような質問がありました・・・
失礼しました
0856デフォルトの名無しさん
2007/07/21(土) 20:14:05Cで組んだプログラムからミラーサーバ群にftpでアクセスし、そこからファイルをDLしてくる間の
TCPウィンドウサイズと輻輳ウィンドウサイズの変動を記録するようなものを作れと言われました。
TCPのウィンドウサイズはヘッダに書いてありますので、最悪あまり頭の良い方法ではないでしょうが
tcpdumpで通信監視してその結果から該当個所を引っこ抜いてくればいいかなぁと思っているのですが、
輻輳ウインドウサイズのほうはどうやって取得すればいいのか、ぐぐる先生にお尋ねしてもどうしてもわかりませんでした。
スロースタートや輻輳回避についてはそれなりに理解したつもりなのですが、結局どうすればいいのか見当が付かず、
困り果てている次第です。
どうぞお力をお貸し頂けますようよろしくお願い致します。
0857デフォルトの名無しさん
2007/07/21(土) 21:40:00setsockopt + SO_DEBUG + trpt でOK??
0858デフォルトの名無しさん
2007/07/21(土) 22:00:31なお同社は19日、柏崎刈羽原発で記録した地震観測データを公開したが、
97台ある地震計のうち旧型の63台で、本震データが消失していたことも
明らかにした。通信回線が混雑しため、本震データを東京のサーバーに
転送する前に、地震計内部で余震データに書き換わってしまったという。
3月の能登半島地震の際も北陸電力の志賀原発で同様の事象が発生していた
ため、東電では2008年度までにすべての地震計を新型に更新する予定だった。
0859デフォルトの名無しさん
2007/07/21(土) 22:06:50ttp://www.nicovideo.jp/watch/sm3711
映像来てたね
0860デフォルトの名無しさん
2007/07/21(土) 22:53:17返信、どうもありがとうございます。
すみません、私物凄く肝心なことを記載し忘れていました・・・。
実はftpのクライアントを自分で書くだけの力はないものでして、
popenを使ってftpを呼び出して使っています・・すみません。
setsockopt + SO_DEBUG + trptではどうかとのことですが、
これはPCBの情報を参照しろという意味合いでしょうか。
setsockoptを使いたければ自分でsocket()でソケットを生成しなければならない、
つまりソケットプログラミングの知識は必須ということですかねぇ・・。
折角お教えいただいたのに、今の私では生かすことが出来そうにありません。
本当に申し訳ありません。
0861デフォルトの名無しさん
2007/07/22(日) 00:39:29これって、どうゆうエラー???
だいたいWSAのエラーのベース値が、10000なんだが。
0862デフォルトの名無しさん
2007/07/22(日) 00:55:150863デフォルトの名無しさん
2007/07/22(日) 01:22:220864デフォルトの名無しさん
2007/07/22(日) 01:28:25Windows Sockets Error Codes
ttp://msdn2.microsoft.com/en-us/library/ms740668.aspx
0865デフォルトの名無しさん
2007/07/22(日) 01:47:19あらら。初歩的ミスでスマソ。
ベース値が10000なんでWSAのつくエラーはぜんぶ1万以上と思ってました。
0866デフォルトの名無しさん
2007/07/22(日) 01:55:090867デフォルトの名無しさん
2007/07/22(日) 09:23:36UDPのソケットプログラムしか書いたことがないのですが、
今回信頼性確保のためTCPを使うことになりました。
TCPでのパケット受信ではreadやrecvを使いますが
一度で全てのデータを取得できるとは限らないので
例えば、以下のようにループ処理で読むのが鉄則だと読んだのですが、
for( ; ; )
{
recv(....)
if(ループを抜ける条件) break;
}
例えば100バイト読んだらループを抜けるという条件を設定した場合
何バイト送られてくるか分からないデータはどのように読めばいいのでしょうか?
(可変長の構造体データを読みたい。受信側では何バイト送られてくるか
予測できない)
アプリ(TCPよりも上位の層)でデータの終端を示すマーカーみたいなものを
決めて、1バイトずつ調べてマーカーが現れたらループを抜けるという風にす
べきなのでしょうか?
そもそもTCPはバイトストリームなので1バイトずつチェックしながら読むのが
定石なのでしょうか?
UDPならrecvfromを一度呼び出せば、ある構造のデータ
を全て読み出せるのでこのようなことを考えなくてよいのですが。
0868デフォルトの名無しさん
2007/07/22(日) 09:55:16別にどんなやり方でも良いと思うけど
強いて言えばHTTPライクに柔軟に対応するのが無難かと。
0869デフォルトの名無しさん
2007/07/22(日) 11:35:57輻輳ウィンドウの値は、TCP/IPスタックの内部変数にしかすぎないので、
いくらキャプチャしても直接はそんな情報は出てこない。
ただし、サーバとクライアントのネットワークの間になんらかのしかけで
遅延が入るようにしておいて、パケットの送り側が一度にいくつのセグメント
を送信するかをモニターすることで、多少は予想できる・・・・カモ
0870デフォルトの名無しさん
2007/07/22(日) 12:01:27100バイトでループを抜けようと考えた根拠を知りたい
0871デフォルトの名無しさん
2007/07/22(日) 12:49:310872デフォルトの名無しさん
2007/07/22(日) 13:42:00知らなかった...
0873デフォルトの名無しさん
2007/07/22(日) 13:58:360874デフォルトの名無しさん
2007/07/22(日) 15:11:32宇宙も大したことないな。
0875デフォルトの名無しさん
2007/07/22(日) 15:14:240876デフォルトの名無しさん
2007/07/22(日) 15:17:17>>870
特に100という数字に意味はないです。
例えばです。
>>868
ストリーム志向ということで柔軟に対応します。
0877デフォルトの名無しさん
2007/07/22(日) 15:21:29固定長
固定長ヘッダにサイズをのせる。
ターミネート文字を指定する( CR+LFとか)
のあたり
0878デフォルトの名無しさん
2007/07/22(日) 15:27:160879デフォルトの名無しさん
2007/07/22(日) 19:38:280880デフォルトの名無しさん
2007/07/22(日) 21:00:06http://pc11.2ch.net/test/read.cgi/prog/1165070025
0881デフォルトの名無しさん
2007/07/22(日) 23:37:53ATMキター!
0882デフォルトの名無しさん
2007/07/23(月) 00:18:48>例えば、以下のようにループ処理で読むのが鉄則だと読んだのですが、
それが正解だけど
なぜか世間ではfdopenなどを通してFILE*にいれて
fprintfで出力など、結構いい加減にやってる。
実はデータ量少ない時は気にしなくてもいいのかも。
0883デフォルトの名無しさん
2007/07/23(月) 00:33:47「なぜか」じゃないよ、ちゃんと理由があってのことだ。
stdioは「必要なだけループ」をやってくれるから、それでいい場合は
お任せにしまっているだけ。
例えばread()やrecv()は要求したバイト数未満で制御を戻す場合が普通にあるが
fread()はそれに達するまで繰り返しread()を呼んで粘る。
fgets()なども同様で、改行が来るかバッファがフルになるまで粘る。
ただ、stdioはブロッキングかつバッファリングを行うから、
細かい制御が必要な場合には向かないし、select()などとの相性も悪い。
0884デフォルトの名無しさん
2007/07/23(月) 00:44:21標準ライブラリのお仕事だからね。
0885860
2007/07/23(月) 00:55:30レスありがとうございます。遅くなってしまってすみません。
輻輳ウィンドウの値は、おっしゃる通り送信側の内部変数ですから、
普通に考えれば受信側から参照は出来ませんよね・・。
確かにセグメントを監視することで、送信側が採用している輻輳制御の方法と、
その値はある程度予想はつくかもしれません。
(というか私もそれしか思いつきませんでした・・。)
けれども、そのためには当然通信効率の犠牲と、ある程度の時間、
ある程度のパケット量が必要になるので、実用性はどうかと問われたら
厳しいかなぁと考えています。
折角考えていただいたのにすみません・・・。
もし、輻輳ウィンドウのサイズではなく、輻輳が起こったかどうかであれば、
受信側から把握することは出来るのでしょうか。
もしご存知でしたら、ご回答いただけると幸いです。
0886デフォルトの名無しさん
2007/07/23(月) 01:16:20「いい加減」かどうかは状況によるじゃん。
行志向のデータじゃないのに、
setvbuf(..., _IOLBF, ...)になってたら問題。
ところでfprintfが問題になる状況ってどんな時ですか?
0887デフォルトの名無しさん
2007/07/23(月) 16:25:41fprintfってたしか改行でバッファフラッシュしなかったっけ。
もしそうなら NW でこれをやると効率がガクンと落ちる。
0888デフォルトの名無しさん
2007/07/23(月) 18:20:14>>877
固定長ヘッダにサイズをのせて、二段階で受信するように
します。
1回目のrecv処理 固定長ヘッダを受信
2回目のrecv処理 ヘッダのサイズ値分だけ受信
>>882
作法としてはセオリーに従うべきだと思いますので(万が一の
こともありますから)、常にループ処理にします。
0889デフォルトの名無しさん
2007/07/23(月) 18:39:21>1回目のrecv処理 固定長ヘッダを受信
ちょっとずつ読むのは帯域の無駄遣い的には最悪だから
そういうのを気にする用途では注意してね。
0890デフォルトの名無しさん
2007/07/23(月) 19:21:41数秒おきに来るコマンドに応答を返すだけなので
今回は大丈夫かと思います。
ありがとうございました。
0891デフォルトの名無しさん
2007/07/23(月) 20:03:29silly window syndromeのことをいってるの?
0892デフォルトの名無しさん
2007/07/23(月) 22:30:20違います。
>>889
OSによります。
0893デフォルトの名無しさん
2007/07/23(月) 23:56:28輻輳というと意味が広すぎるけど大きくは
1. パケットロス
2. パケット遅延
3. パケット重複
くらいかな、パッと思いつく限り。
で、パケットロスに関してだけいえば、高速再転送アルゴリズム(RFC 2581, 2582)
あたりが動作しているかどうかは、受信側のDUPACKと送信側の挙動見れば判別
つくんじゃないかな。SACKとか、その他もろもろのアルゴリズムもからんでくる
こともあるが・・・。
パケット重複も、キャプチャみればなんとか。
パケット遅延はこれまたプロトコルスタックの内部変数に依存する。
再送間隔の変化を地道にモニタリングするとか・・・。
0894デフォルトの名無しさん
2007/07/24(火) 03:28:50つ_IOFBF
0895885
2007/07/26(木) 03:13:54ご丁寧にありがとうございました。
相変わらずレスが遅くて申し訳ないです。
確かに、輻輳とだけいうと意味が広いですね、すみません・・。
(とても曖昧な質問だったのにご丁寧に回答を頂き、本当にありがとうございます)
パケットロスに関しては、色々なアルゴリズムが絡んでくるとなると難しいですね・・。
送信側から把握するというのであれば比較的簡単ですが、今回は受信側から、ですからねぇ。
パケットの重複は、おっしゃる通りパケットの特定フィールドを監視すればなんとかなりますね。
これは私みたいなのでも比較的簡単に実装できそうです。
パケットの遅延も内部変数依存ですか・・、困りました。
何か良い方法ないかなぁと探していたところ、一応それっぽいものを見つけました。
長谷川洋平・下西英之・村瀬勉
「TCPトラヒックの解析による端末/ネットワーク通信ボトルネック判定手法」
NECシステムプラットフォーム研究所
(http://www.itrc.net/report/meet17/shiryo/22A/hasegawa.pdf)
によると、RTTが増加し、且つThroughputがほぼ一定である場合、
自トラヒックが原因となる遅延が増加し、RTTが増加し、Throughputが減少した場合、
他トラヒックが原因となる遅延が増加したと判断できるとのことです。
但し、判別精度は凡そ70%弱だそうですけれど。
明示的に輻輳の通知でもしない限り、ネットワークの輻輳検知はそもそも難しいはずなので、
この70%に重複も考慮する辺りで妥協してもいいのかなぁと思わなくもありません。
地道にモニタリングする気力と根性と、そして一番肝心な時間がなさそうですごめんなさいorz
教えていただいた内容と、自分で調べた内容を踏まえて、再度教授に相談してみようと思います。
本当にどうもありがとうございましたm(_ _)m
0896デフォルトの名無しさん
2007/07/26(木) 16:24:010897デフォルトの名無しさん
2007/07/27(金) 03:00:05伝統的に「トラフィック」ではなく「トラヒック」という言葉を使うらしいよ。
http://pc11.2ch.net/network/ あたりで確かめてごらん。
0898デフォルトの名無しさん
2007/07/27(金) 03:24:34「トラフィック」ではなく
「トラヒック」という言葉を
使うらしい
〇∧〃 でもそんなの関係ねぇ!
/ ) そんなの関係ねぇ!
< \
○/
∨) はい、オッパッピ〜
/ |
0899デフォルトの名無しさん
2007/07/27(金) 03:54:20伝統的に「ナルポ」ではなく「ヌルポ」という言葉を使うらしいよ。
URL略 あたりで確かめてごらん。
0900デフォルトの名無しさん
2007/07/27(金) 03:55:46伝統的に「ウォーニング」ではなく「ワーニング」という言葉を使うらしいよ。
URL略 あたりで確かめてごらん。
0901デフォルトの名無しさん
2007/07/27(金) 04:58:440902デフォルトの名無しさん
2007/07/27(金) 07:30:000903デフォルトの名無しさん
2007/07/27(金) 10:15:55通信業界歴の長い人はトラヒックで、新しい人はトラフィックだったりするけど、
同じ人でも場の空気読んでトラヒックとトラフィックを使い分けたりするんで、
このトラヒックとトラフィックのニュアンスの違いを言葉で表現するのは難しい。
言葉を使う場面(聴衆の前でのプレゼン、社内、社外との打ち合わせ、など)、
その言葉で表す事象、でてくる装置などによって、
「トラヒック」と「トラフィック」を適切に使い分けることができるようになったら一人前の通信業界人とも言える。
>>899-900
それは英語の発音とカタカナ表記の問題だろ。routerをカタカナでラウターって書く奴なんて見たこと無い。
0904デフォルトの名無しさん
2007/07/27(金) 10:42:450905デフォルトの名無しさん
2007/07/27(金) 11:04:560906デフォルトの名無しさん
2007/07/27(金) 11:29:02IBMではキューリーなので使い分けが必要。
0907デフォルトの名無しさん
2007/07/27(金) 15:10:481. NICを2枚差す
2. 同一プログラム内で一つのNICを送信専用、もう一つを受信専用にする
3. 送信側からパケットを投げて、受信側でいくつ受信したかをカウント
4. 送信数と受信数の差分から、通信経路上でいくつパケロスしたか
って感じのプログラムを作りたいんだけど、
そもそも2で躓いた orz
複数NICのうち、任意のNICを割り当てるのってどうするの?
どこかの資料のポインタとか教えてください
0908デフォルトの名無しさん
2007/07/27(金) 16:41:24http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html#forceif
0909デフォルトの名無しさん
2007/07/27(金) 17:31:52>3. 送信側からパケットを投げて、受信側でいくつ受信したかをカウント
で、パケットが外に飛ばないところで躓くと予想。
パケット投げるとき、宛先アドレスが自ホストのアドレスだと、NICドライバにたどり着く前に
カーネル内で折り返される。
パケットソケットでEthernetフレーム組み立てて書き込め。
0911デフォルトの名無しさん
2007/07/27(金) 20:48:52デスクトップ を ディスクトップ
インタープリター を インタープリンター
というお偉いさんがこの業界にいる
お偉いさんだけに誰にも指摘されない
0912デフォルトの名無しさん
2007/07/27(金) 21:33:590913デフォルトの名無しさん
2007/07/27(金) 21:36:070914デフォルトの名無しさん
2007/07/27(金) 22:03:100915デフォルトの名無しさん
2007/07/27(金) 22:52:36古い文献いらね
0916デフォルトの名無しさん
2007/07/27(金) 22:53:040917デフォルトの名無しさん
2007/07/28(土) 03:58:30偉いさんでなくてもいる。
http://codezine.jp/a/article/aid/1502.aspx?p=2
まだ若いのにw
0918デフォルトの名無しさん
2007/07/28(土) 05:00:47本もってるw
0919デフォルトの名無しさん
2007/07/28(土) 05:32:550920デフォルトの名無しさん
2007/07/28(土) 07:18:36昔から思ってた。
意味が通らないからイライラすんだよな。
どうしてそう勘違い出来るのかと。
「円盤上」かえ!?
ぐぐると結構出てくるんだよなぁ…。企業サイトでも。
0921デフォルトの名無しさん
2007/07/28(土) 08:16:23自分の選挙区に道路とか空港とか利益誘導ばっかり
主張するやつには投票するなよ。
世襲議員、2世議員は投票するなよ
選挙前に限って「弱者のための政治」というやつには気をつけろ!自民党のベテラン議員に多い!
委員会で質問しないようなやつには投票するなよ
業界団体の利益ばかり主張するやつに投票するなよ
ホームレスとかネットカフェ難民、介護難民問題を
取り上げる「弱者のため」の議員を探そう!!
0922デフォルトの名無しさん
2007/07/28(土) 10:40:18それ以外は同意
0923デフォルトの名無しさん
2007/07/28(土) 10:49:330924デフォルトの名無しさん
2007/07/28(土) 11:49:210925デフォルトの名無しさん
2007/07/28(土) 12:54:2324時間運営の店を取り締まるべきだな
こいつらのせいで治安が悪化してる
客も入れる店も同罪
こういう奴等は終いに徒党を組んで強盗団になるぞ
0926デフォルトの名無しさん
2007/07/28(土) 14:08:07それって、行きと帰りで通信経路違うの?
それとも送受信パケットをカウントしたいだけ?
カウントしたいだけなら、WindumpやWinpcap使えばいいだけと違うの?
0927デフォルトの名無しさん
2007/07/31(火) 02:21:25サンプルどっかにおちてなーい?
0928デフォルトの名無しさん
2007/07/31(火) 03:14:29> NECシステムプラットフォーム研究所
> (http://www.itrc.net/report/meet17/shiryo/22A/hasegawa.pdf)
URLが見つからなくなってたんだけど
> によると、RTTが増加し、且つThroughputがほぼ一定である場合、
> 自トラヒックが原因となる遅延が増加し、RTTが増加し、Throughputが減少した場合、
> 他トラヒックが原因となる遅延が増加したと判断できるとのことです。
うーん。論文読んでないのでなんともいえないが、上記読む限り条件限定しすぎてる
し、これだけ制限して70%弱の判別精度じゃ役に立たない気がする。RTTのみに着眼し
て評価することで、マクロ的な輻輳の挙動が評価できるという発想は面白いが。失敗
してる気がする。
0929デフォルトの名無しさん
2007/07/31(火) 11:54:410930デフォルトの名無しさん
2007/07/31(火) 12:23:500931デフォルトの名無しさん
2007/07/31(火) 12:54:36最後の)を削るよろし。
0932デフォルトの名無しさん
2007/07/31(火) 13:55:290933デフォルトの名無しさん
2007/07/31(火) 13:57:48問題なし。ただしfflushには気を使え。
0935デフォルトの名無しさん
2007/07/31(火) 15:48:22fdopenしてfgetsするとタイムアウトが設定できないね
ブロックするかしないかの2択しかないや
0936デフォルトの名無しさん
2007/07/31(火) 15:59:410937デフォルトの名無しさん
2007/08/01(水) 15:30:57仮にAがサーバとなりB,Cがそこに接続後、BとCが直接通信を行うとする場合で
Aはもちろんルータのポートが開いてて外部から接続可能で
B,Cについてはルータの設定などしていなく外部からの接続は出来ない場合
B,CからAに接続する事は可能ですけどB,Cに接続する事は基本的に無理ですよね。
B,CがListenしてサーバー機能が有ったとしてもルータで弾かれますので。
そこで、BがAに接続するとAと通信する為Bに適当なポートが開きますよね。
そのポートをBがListenし、CがAに接続した時、AがCにBのアドレスとそのポートを教え
CはBのそのポートにアクセスすする事でルータ越え出来るんじゃないかと思ったわけですが
実際そういう事は可能でしょうか。
0938デフォルトの名無しさん
2007/08/01(水) 15:47:57UDP hole punching で検索してみるといい。
0939デフォルトの名無しさん
2007/08/01(水) 16:28:15サンクスです、調べてきます。
0940デフォルトの名無しさん
2007/08/01(水) 20:29:26ファイヤーウォールは接続を追い掛けているので、TCPでは無理だよん。
# SYN, FINを見て
0941デフォルトの名無しさん
2007/08/01(水) 22:41:16B(Port 100) <-> A (Port 500)
ファイアウォールうんぬん以前に。上記のように接続が確立している時に(IPアドレ
スは、ルータからむし省略)、BでPort100をListenすることがそもそもできない。ポー
ト番号が使用中だから。
0942デフォルトの名無しさん
2007/08/02(木) 01:26:48SO_REUSEADDR
0943デフォルトの名無しさん
2007/08/02(木) 03:21:330944デフォルトの名無しさん
2007/08/02(木) 14:24:53httpd は 80 番ポートでたくさんコネクション張ってるわけだが。
実際は TCB で管理されるから
{ local-IP, local-port, remote-IP, remote-port }
でユニークならいい(確かリチャードの本に書いてあったはず)。
0945デフォルトの名無しさん
2007/08/02(木) 22:44:41>{ local-IP, local-port, remote-IP, remote-port }
>
>でユニークならいい(確かリチャードの本に書いてあったはず)。
いや、そうだけどさ。Listenするときはまだ接続確立うんぬん
以前の話だから。使用中のポートは、Listenできん。たとえREUSEADDR
つけようが。
0946デフォルトの名無しさん
2007/08/03(金) 00:13:070947デフォルトの名無しさん
2007/08/03(金) 00:51:280948デフォルトの名無しさん
2007/08/03(金) 02:06:56無知が罪とはいわん。だが、もう少し恥を知ったほうがいい。
0949デフォルトの名無しさん
2007/08/03(金) 10:07:19>937の話を理解してないだろ。
それが問題で無理というのは違うと言う事だ。
0950デフォルトの名無しさん
2007/08/03(金) 11:18:020951デフォルトの名無しさん
2007/08/03(金) 11:48:410952デフォルトの名無しさん
2007/08/03(金) 16:57:270953デフォルトの名無しさん
2007/08/04(土) 17:48:34connectのタイムアウトはどうやったら設定できる?
select使うのは無しの方向で
0954デフォルトの名無しさん
2007/08/04(土) 18:57:47じゃあalarm
0955デフォルトの名無しさん
2007/08/04(土) 20:38:220956デフォルトの名無しさん
2007/08/04(土) 20:55:250957デフォルトの名無しさん
2007/08/04(土) 21:00:40alarmはスレッドに弱いしpollはどうでもいいし
それにいろんな方法知っといた方が 楽しいじゃん
0958デフォルトの名無しさん
2007/08/04(土) 21:06:480959デフォルトの名無しさん
2007/08/04(土) 21:59:150960デフォルトの名無しさん
2007/08/04(土) 22:11:420961デフォルトの名無しさん
2007/08/04(土) 22:52:280962デフォルトの名無しさん
2007/08/04(土) 23:51:150963デフォルトの名無しさん
2007/08/05(日) 00:57:45この辺はFTPやらSSHあたりが並んでる。
スレタイに入れてみるのはどうでしょ?
0964デフォルトの名無しさん
2007/08/05(日) 00:58:080965デフォルトの名無しさん
2007/08/05(日) 01:17:54これだったらおっぱいぷるんぷるんだろ
0966デフォルトの名無しさん
2007/08/05(日) 09:33:19javaのrtp(かリアルタイム用のプロトコル)の実装物しらない?
とりあえずjava.net.RTPとか入れてみたけどクラスパス通しても実行できないんだ
0967デフォルトの名無しさん
2007/08/05(日) 10:09:530968デフォルトの名無しさん
2007/08/06(月) 12:40:40また bind やると、エラーになって、WSAGetLastError() やると0が返ってくんだけど、
これって、どうゆうエラー?
0969デフォルトの名無しさん
2007/08/06(月) 13:10:00ゆとり世代か?アホみたいだからヤメロ
>エラーになって
どんなエラー?
0970デフォルトの名無しさん
2007/08/06(月) 13:16:45>どんなエラー?
は?
bindのエラー復帰って、SOCKET_ERROR 以外にあるの?
0971デフォルトの名無しさん
2007/08/06(月) 13:20:27メモリがもうねーとかソケットがもうねーとか
いろいろあんじゃね?
0972デフォルトの名無しさん
2007/08/06(月) 13:25:02つまり、わかんないと。
ちなみにOSは、Me。
0973デフォルトの名無しさん
2007/08/06(月) 13:25:020974デフォルトの名無しさん
2007/08/06(月) 13:29:480975デフォルトの名無しさん
2007/08/06(月) 13:30:57WSAGetLastError() でエラーが取れない原因は知らないが、
エラーになる原因は恐らく TIME_WAIT 状態だから。
setsockopt() で SOREUSEADDR 設定してみ。
>>972
って、Me かよ。
0976デフォルトの名無しさん
2007/08/06(月) 13:32:050977デフォルトの名無しさん
2007/08/06(月) 13:39:380978デフォルトの名無しさん
2007/08/06(月) 14:00:59最初のうちはでないが。
そんで、エラーがでたらポート変えればエラーにならなくなる。
closesocketがまともに機能してない?
いいかげんな
0979デフォルトの名無しさん
2007/08/06(月) 14:04:09>>975が書いてくれてるのが読めないのか。
closesocket()した後も、TIME_WAIT状態でOSレベルでポートが使用中に
なってるんだろ。FAQ中のFAQだよ。
0980デフォルトの名無しさん
2007/08/06(月) 14:04:140981デフォルトの名無しさん
2007/08/06(月) 14:05:59だから、setsockopt()使えっての
そのためにあるんだから
Winsock特有の話だと思ってるのかもしらんが、れっきとしたTCPの仕様であって
関係ないよ
0982デフォルトの名無しさん
2007/08/06(月) 14:07:11「っ て、TIME_WAIT は通常、30 〜 120 秒で終了します。 」
うむ。じゃあ、3分ぐらいまってやってみる
0983デフォルトの名無しさん
2007/08/06(月) 14:23:47まあ、そうだと思ってましたが。
SOREUSEADDR を使うのも手ですが、ソケット用のスレッドとかがずっと残ってることになるので
できれば避けたいですね〜
0984デフォルトの名無しさん
2007/08/06(月) 14:29:17氏んでいいよというか氏ね
0985デフォルトの名無しさん
2007/08/06(月) 14:30:30お前が言っている意味がよくわからん
「同じ」ってのは、つまりどうなったんだ
それと、SOREUSEADDRってのは、bind()前に一発呼ぶだけだぞ
何で「ソケット用のスレッドとかがずっと残ってることになる」んだ?
0986デフォルトの名無しさん
2007/08/06(月) 14:36:29せめて一日は放置しろよ
0987デフォルトの名無しさん
2007/08/06(月) 14:37:08だから、またbindでエラーで、エラー値取得しても0。
>何で「ソケット用のスレッドとかがずっと残ってることになる」んだ?
TIME_WAITというのは、カーネルで残ったパケットの後処理とかやってるんでしょ。
それがずっと継続することになるじゃん。それ構わずにソケット作ってると
どんどんそれが増えてついにブルーバックに!!!
0988デフォルトの名無しさん
2007/08/06(月) 14:39:05そんなに大量かつ頻繁にソケットの開け閉めをしなきゃいかん事情がよくわからんが、
そういうことが必要なら、TCPは向いていないんじゃないのか
0989デフォルトの名無しさん
2007/08/06(月) 14:43:55だからそれじゃ、解決になってないだろが。
逃げるなお
0990デフォルトの名無しさん
2007/08/06(月) 14:44:32馬鹿馬鹿しい
0991デフォルトの名無しさん
2007/08/06(月) 14:45:59さっき、bind close を無限ループで走らせたが、エラーにならないし。
動的DLLの方もチェックしてみっかな
0992デフォルトの名無しさん
2007/08/06(月) 14:49:26CLOSEDから遷移してなかったんだろ
0993デフォルトの名無しさん
2007/08/06(月) 14:50:23なにそれ
0994デフォルトの名無しさん
2007/08/06(月) 15:07:01TCPの機能に、輻輳回避や再送高速化(sack) がありますが、アプリを書くときにこれらを
意識していますか?
0995デフォルトの名無しさん
2007/08/06(月) 15:12:21フツーの用途で気にする必要はないと思う
0996デフォルトの名無しさん
2007/08/06(月) 15:29:48たぶん君には必要ない。
0997デフォルトの名無しさん
2007/08/06(月) 16:10:45後処理しないようにすればいいよ
0998デフォルトの名無しさん
2007/08/06(月) 17:21:52どうやるのそれ
0999デフォルトの名無しさん
2007/08/06(月) 17:42:141000デフォルトの名無しさん
2007/08/06(月) 17:43:2410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。