ネットワークプログラミング相談室 Port17
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/05/30(火) 08:16:00Programming 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辺り
足りなかったら適当に付け足してね
前スレ
ネットワークプログラミング相談室 Port16
http://pc8.2ch.net/test/read.cgi/tech/1136005644/
0002デフォルトの名無しさん
2006/05/30(火) 08:17:00Port15 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デフォルトの名無しさん
2006/05/30(火) 08:18:46UNIXネットワークプログラミング〈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デフォルトの名無しさん
2006/05/30(火) 08:19:45http://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デフォルトの名無しさん
2006/05/30(火) 08:20:17★規格
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デフォルトの名無しさん
2006/05/30(火) 08:20:53ethereal - http://www.ethereal.com/
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
0007デフォルトの名無しさん
2006/05/30(火) 08:27:53otsu
0008デフォルトの名無しさん
2006/05/30(火) 08:32:16面白いから、数字だけのホスト名付けてみるかな(w
0009デフォルトの名無しさん
2006/05/30(火) 11:12:18127.0.0.1 なんてのが逆引きで得られたらアレだよなぁ。
0010デフォルトの名無しさん
2006/05/30(火) 11:31:070011デフォルトの名無しさん
2006/05/30(火) 16:39:350012デフォルトの名無しさん
2006/05/30(火) 21:51:350013デフォルトの名無しさん
2006/05/30(火) 21:53:420014デフォルトの名無しさん
2006/05/30(火) 22:16:02http://2ch.netも逆引き出来なそうだけど。
0015デフォルトの名無しさん
2006/05/30(火) 22:58:190016デフォルトの名無しさん
2006/05/31(水) 00:40:450017デフォルトの名無しさん
2006/05/31(水) 02:02:07使い方をご教示ください。
0018前スレの988
2006/05/31(水) 02:18:18>>それ以外ならホスト名
これ嘘でしたwwwwすまんwww
↓たぶんこれが正解
文字列が数値かピリオドのみで構成されてるならIPアドレスの文字列
それ以外ならホスト名
0019デフォルトの名無しさん
2006/05/31(水) 02:29:540020デフォルトの名無しさん
2006/05/31(水) 03:00:49はあ?
0021デフォルトの名無しさん
2006/05/31(水) 03:34:17バグがうまれたらどうすんだよ
0022デフォルトの名無しさん
2006/05/31(水) 08:17:15バグ生まれちゃ困るな。
0023デフォルトの名無しさん
2006/05/31(水) 13:03:54それじゃ 1.2.3.4.5.6 なんてのも IP アドレスになっちゃうじゃん。
・IP アドレスとして解釈可能なら、IP アドレスとして解釈できる。
・そうでないなら、IPアドレスとして解釈できない。
これくらいしか言えないだろ・・
0024デフォルトの名無しさん
2006/05/31(水) 13:18:09馬鹿は黙っててくれ
0025デフォルトの名無しさん
2006/05/31(水) 13:28:26貴様こそ黙れよ。
現状既に a a.b a.b.c a.b.c.d の IPv4 4形式に加えて IPv6 なんてのも
あるわけで、その環境(やアプリの仕様)に即して何が「IPアドレスとして
解釈可能」かも変るだろ。
非「IPアドレス」が即ホスト名やDQDNなわけでも無いし。
0026デフォルトの名無しさん
2006/05/31(水) 13:31:06馬鹿は黙っててくれ
0027デフォルトの名無しさん
2006/05/31(水) 13:33:32この辺で識者が正解を書いてください。
0028デフォルトの名無しさん
2006/05/31(水) 15:33:040029デフォルトの名無しさん
2006/05/31(水) 23:39:41ping 127.0.1
ping 0x7f000001
ping 017700000001
ping 2130706433
0030デフォルトの名無しさん
2006/05/31(水) 23:53:10それ以外の形式でもIPアドレスとして認識される場合があるけど
(>>29みたいに)リゾルバ依存
0031デフォルトの名無しさん
2006/06/02(金) 00:33:15WINNT4.0のPCでソケット通信中にICMP(type3 code1)ホスト到達不能を
受信した際、ソケット伝送プログラムにそのエラーが通知されることなく、
その後なにごともなく通信が継続されていました。
SVR4ベースのシステムの場合、同じくICMP(type3 code1)を受信した時点で
ソケットをクローズしてしまいます。
これはOSに依存する仕様なのでしょうか?
要はSVR4ベースのシステムもWINNT4.0の場合と同じように
即断しないようにしたいのですが。
0032デフォルトの名無しさん
2006/06/02(金) 16:21:37java と perl で取得するパケットデータが異なるっていうのはどういう現象かわかる人いますか?
javaは SocketChannel
perlはsocket()
で接続しています
0033デフォルトの名無しさん
2006/06/02(金) 16:45:13そのケース、XP だと ECONNRESET で切れるよ。
setsockopt でオプションを指定すればNT4と同じ動作にもできるけど。
0034デフォルトの名無しさん
2006/06/02(金) 17:13:01前スレ>>996のgetaddrinfoが正解
どうしてもAF_INET*依存にしたければ、
inet_pton()でも使って。
0035デフォルトの名無しさん
2006/06/03(土) 00:10:58日本語大丈夫?
どういう現象って、「取得するパケットデータが異なる」って言う現象だろ。
原因はなんかバグってんじゃねーのぐらいしかわからんが。
0036デフォルトの名無しさん
2006/06/03(土) 00:23:110037デフォルトの名無しさん
2006/06/03(土) 00:34:560038デフォルトの名無しさん
2006/06/03(土) 10:18:07バグがあることを「原因」と呼ぶと自分の責任になるだろ?
「現象」と呼ぶことによって責任を回避しているのさ
そんな >>32 の意図を読み取れないおまえこそ日本語大丈夫か?
003931
2006/06/03(土) 11:09:17どうもありがとうございます。
win、unix、Linux、さらにそれぞれのバージョンや系統によって
ICMP(type3 code1)を受けた時のうごきはデフォで違っていて
それはおそらくどのOSでもソケットのオプションによって変えられる、
という感じなんでしょうか?
>>setsockopt でオプションを指定すればNT4と同じ動作にもできるけど。
ちなみにこれはXPのことなのでしょうか?それともSVR4のことですか?
0040デフォルトの名無しさん
2006/06/03(土) 11:42:14ICMP_DEST_UNREACHでも接続を維持するというのは、
極めて異常な処理方針で、問題も起きやすいので、
どのOSでも出来ることを期待しない方がいいです。
再接続を試みてはどうでしょうか?
ICMP_FILTERソケットオプションでicmpパケットを無視できるUNIXもありますが。
> その後なにごともなく通信が継続されていました。
こっちの方がbugでしょう。(MS的には仕様)
0041デフォルトの名無しさん
2006/06/03(土) 11:47:47いろんな型でやってみたけどとれないくさい
0042デフォルトの名無しさん
2006/06/03(土) 14:25:47> 「現象」と呼ぶことによって責任を回避しているのさ
きっといいこと言ったとか思ってるんだろうなぁ。
そっとしておいてやろう。
>>39
て言うか、なんでそんな ICMP 返ってくるかを調べるほうが先じゃないのか?
>>41
> いろんな型でやってみたけどとれないくさい
どういう風にやったかを書かないのは、おじいちゃんの遺言か?
0043デフォルトの名無しさん
2006/06/03(土) 14:56:33(ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As Any, optlen As Long) As Long
optval As Any の受けを、基本型すべてで、byref、byval全部試した。
マイクロソフトに利用方法がある
ttp://support.microsoft.com/default.aspx?scid=kb%3Bja%3B237688
追加オプションのうち、&H1003〜&H1006をわざとはずしている?
' Additional options.
Const SO_SNDBUF = &H1001& ' Send buffer size.
Const SO_RCVBUF = &H1002& ' Receive buffer size.
Const SO_ERROR = &H1007& ' Get error status and clear.
Const SO_TYPE = &H1008& ' Get socket type - READ-ONLY.
以下が無い。
Const SO_SNDLOWAT = &H1003
Const SO_RCVLOWAT = &H1004
Const SO_SNDTIMEO = &H1005
Const SO_RCVTIMEO = &H1006
でも、Winsock.hにはある。
0044デフォルトの名無しさん
2006/06/03(土) 16:55:59> どういう風にやったかを書かないのは、おじいちゃんの遺言か?
いい感じにイヤミっぽいので、イヤミフォルダに保存した。
0045初心者
2006/06/04(日) 12:27:48または、Windows環境でDNATやSNATを行うプログラムって作れますか?
0046デフォルトの名無しさん
2006/06/04(日) 12:39:15ソース読め
http://osswin.sourceforge.net/#firewall
0047デフォルトの名無しさん
2006/06/04(日) 13:06:230048デフォルトの名無しさん
2006/06/04(日) 15:41:29これじゃあネットワーク関連でバグ出まくりなのは当たり前だわ。
0049デフォルトの名無しさん
2006/06/04(日) 15:50:25わかるやつはここに相談しないとおもう
0050デフォルトの名無しさん
2006/06/04(日) 21:59:26これから書くことになるのですが、
どんな勉強手順をとれば効率良く
マスターできますか?
おそらく多量で難解なRFC文書を読むことでは
ないように思います。
やるのはhttps(SSL+認証付)のSOAP応用です。
開発はVxWorksベースです。
もっぱら組み込みハード制御をやってきたので
Windowsアプリは全然組めません。
C、C++他は一通り組めます。
0051デフォルトの名無しさん
2006/06/04(日) 22:18:21まさか全部自作ってことはないよね。
0052デフォルトの名無しさん
2006/06/04(日) 22:51:39使っているVxWorksにはSOAPのライブラリ関数はありません。
SSLはOpenSSLを使った香具師が関連会社にいますが、ノウハウは不明。
たわしは、ソケット関数自体使った経験が全くないので、どこからどういう
順番(手順)で高速に勉強するか、まずそこから知りたいのです。
http://www.sist.ac.jp/~suganuma/cpp/4-bu/19-sho/19-sho.htm#mokuji
を読み始めましたが、完全理解はできていないレベルです。
0053デフォルトの名無しさん
2006/06/04(日) 22:58:080054デフォルトの名無しさん
2006/06/04(日) 23:22:40これは動かんのか?
http://www.windriver.com/japan/products/windmanage_xml-soap/index.html
0055デフォルトの名無しさん
2006/06/04(日) 23:24:17自分で作るくらいならVxWorksのメリット無いよ。linuxにしといたら?
組み込みだからこそ、10年放置しても問題ない様にRFCを熟読してきちんと仕様を満たす実装で納品して欲しい。
0056デフォルトの名無しさん
2006/06/04(日) 23:24:46VxWorksのTCPソケット関数が使える環境です。
その上位の応用レイヤは作らねばなりません。
OpenSSLもコンパイルできるかどうかも不明です。
たわしはそういうレベルの初心者です。
0057デフォルトの名無しさん
2006/06/04(日) 23:31:35そのミドルウェアは知りませんでした。
明日、今のVxWorksのVersionで動くか調べてみます。
real time linux の環境では、
GPLつきソフトを使わないことが条件です。
製品のソース開示は出来ないので、それ故、訴えられる可能性があるためです。
0058デフォルトの名無しさん
2006/06/05(月) 00:14:35いや、SSLやSOAPを実装するのはかなりの腕がないと無理。
なんちゃってになって、トラブル続出するの可能性大。
RFC読むことないって事で、それはそれでいいんだけど、
SSLとSOAPの関連仕様書はかなり膨大。(RFCになっているものもある)
0059デフォルトの名無しさん
2006/06/05(月) 01:08:07typedef UINT_PTR SOCKET;
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
要はunsinged intでしょ?
で、SOCKET_ERRORは
#define SOCKET_ERROR (-1)
-1ってことでしょ?
SOCKET s = socket(...);
で、sはunsigned intなのにエラーの場合-1が代入されるってこれOKなの?
0060デフォルトの名無しさん
2006/06/05(月) 01:51:43windowsのAPIってそんなんばっかりやん。
0061デフォルトの名無しさん
2006/06/05(月) 02:05:280062デフォルトの名無しさん
2006/06/05(月) 02:46:38明らかにスキルが足りないと思う。仕事なら違約金払ってでも断るべきだよ。
0063デフォルトの名無しさん
2006/06/05(月) 08:12:150064デフォルトの名無しさん
2006/06/05(月) 10:42:56ちなみに作者のtheoはかなりのDQNだよ。qmailの作者レベル。
0065デフォルトの名無しさん
2006/06/05(月) 11:12:39>同じ作者のOpenBSD
>同じ作者のOpenBSD
0066デフォルトの名無しさん
2006/06/05(月) 13:14:41>>>setsockopt でオプションを指定すればNT4と同じ動作にもできるけど。
>ちなみにこれはXPのことなのでしょうか?それともSVR4のことですか?
これは XP (たぶん Windows Server 2003 も) です。
>>42
>て言うか、なんでそんな ICMP 返ってくるかを調べるほうが先じゃないのか?
漏れがこれ経験したのはインターネット上の不足低多数の数百箇所程度の
クライアント向けにサーバを動かしているとき。一日数件程度発生してました。
経路上のどっかで何かがあったんでしょう。
ちなみに XP で UDP ソケット使っててこれ食らうと、OS 側スタックのどこかが
unreachable を覚えてしまって、それ以降の send も失敗します(オプションで
回避可能)。
0067デフォルトの名無しさん
2006/06/05(月) 16:32:220068デフォルトの名無しさん
2006/06/05(月) 17:18:40ipfw, ipfilter辺りで処理するのが定石かと。
0069デフォルトの名無しさん
2006/06/05(月) 19:57:420070デフォルトの名無しさん
2006/06/05(月) 22:13:21不足低多数: ふそくていたすう: fusokuteitasuu
一文字ごときの typo にいちいち突っ込むなよ。
0071デフォルトの名無しさん
2006/06/06(火) 02:19:510072デフォルトの名無しさん
2006/06/07(水) 08:03:56どのような方法がありますか?
0073デフォルトの名無しさん
2006/06/07(水) 14:10:49Winny に干渉するのが目的なら、先方の host 指定して
デタラメなホストルートでも切れば良いと思う。
0074デフォルトの名無しさん
2006/06/07(水) 15:05:13そのプロセスを殺す。
0075デフォルトの名無しさん
2006/06/07(水) 15:45:24Winnyじゃないよー
>>74
全部切れたら困っちゃう
0076デフォルトの名無しさん
2006/06/07(水) 23:13:320077デフォルトの名無しさん
2006/06/08(木) 00:13:340078デフォルトの名無しさん
2006/06/08(木) 09:28:23RSTパケットを送り付けたいです。
0079デフォルトの名無しさん
2006/06/08(木) 09:32:560080デフォルトの名無しさん
2006/06/10(土) 08:20:550081デフォルトの名無しさん
2006/06/10(土) 09:32:26> 全部切れたら困っちゃう
0082デフォルトの名無しさん
2006/06/11(日) 15:08:56ルータ等に実装されているのIPマスカレード機能をプログラムで
実装するにはどんな関数を使えばいいのでしょうか?
リバースプロキシみたいではなくsrc-dis間で総コネクション数は1つで
済ませたいのです。
環境:POSIX系OS
0083デフォルトの名無しさん
2006/06/11(日) 15:18:520084デフォルトの名無しさん
2006/06/11(日) 16:25:46ルータ実装の方が遙かに難しい気がするのですが・・
ただOS依存のネットワークAPIプログラミングで、送られてきたパケットを
IPレベルで見てsrc,dscのアドレス,ポートを書き換えて
変換したパケットを再び送信する方法ってないのかなと思ったのですが
もしかしてNICドライバ依存とかの話になってしまうのでしょうか?
0085デフォルトの名無しさん
2006/06/11(日) 18:01:54>IPレベルで見てsrc,dscのアドレス,ポートを書き換えて
>変換したパケットを再び送信する方法
あるよ
0086デフォルトの名無しさん
2006/06/11(日) 18:10:390087デフォルトの名無しさん
2006/06/11(日) 18:53:50その方法に関係する関数名、キーワードだけでも教えていただけないでしょうか
0088デフォルトの名無しさん
2006/06/11(日) 18:56:26promisc
0089デフォルトの名無しさん
2006/06/11(日) 19:30:58ありがとうございます
RAWソケットを作成することで出来るのですね
0090デフォルトの名無しさん
2006/06/11(日) 20:19:16> src-dis間で総コネクション数は1つで済ませたいのです。
っていうのはどういうこと?
0091デフォルトの名無しさん
2006/06/11(日) 20:47:45リバースプロキシならクライアントから中継ノード、
中継ノードからサーバ、でコネクション数2
になるという意味です。
0092デフォルトの名無しさん
2006/06/11(日) 21:31:36UDPは無視なの?
0093デフォルトの名無しさん
2006/06/11(日) 21:51:332層レベルで中継させたいということを説明したいがために
TCPっぽい事象に限定したような話になってしまいました。
厳密には3層の一部(ポート番号)も関係するのですが・・
言葉足らずな質問で混乱させてしまいすいませんでした。
0094デフォルトの名無しさん
2006/06/13(火) 11:52:36Windows Media Player の吐き出すHTTPDヘッダが以下のようになっているのですが
POST / HTTP/1.0
Accept: */*
User-Agent: NSPlayer/10.0.0.3802
Host: siren-vip.ddo.jp
Pragma: xClientGUID={3300AD50-2C39-46c0-AE0A-D884CE1C993C}
X-Accept-Authentication: Negotiate, NTLM, Digest, Basic
Pragma: client-id=3081659744
Pragma: client-lag=0
Pragma: stream-switch-count=1
Pragma: stream-switch-entry=ffff:2:1
Content-Length: 0
これはどのような情報かわかる人いらっしゃいますでしょうか?
もしくは、このようなヘッダ情報を説明しているページがあればご教授ください
0095デフォルトの名無しさん
2006/06/13(火) 14:36:30'D'は余分ね。
0096デフォルトの名無しさん
2006/06/14(水) 20:30:14TCPIP Socket通信にて
パケットを1バイトずつ受信して特定キーを受信したら
そこまでを1区切りのデータとして扱う処理で、
パケットで特定キーを受信しなかった場合
データを保持しておき、次のパケットで特定キーを
受信したら保持したデータを合わせて1区切りのデータと
して扱うという処理を追加したいのですが
どうコードを書けばいいかわかりません。。。
どなたか教えてくださいませんか?
0097デフォルトの名無しさん
2006/06/14(水) 21:20:460098デフォルトの名無しさん
2006/06/14(水) 21:59:200099デフォルトの名無しさん
2006/06/14(水) 22:10:370100デフォルトの名無しさん
2006/06/14(水) 22:13:06ひとそれぞれだろうけど参考までに
ttp://www.amazon.co.jp/gp/product/4274065847/
ttp://www.amazon.co.jp/gp/product/4274065820/
0101デフォルトの名無しさん
2006/06/14(水) 22:26:47こんばんは。
インターネットで有害なサイトを指定しておいて見れなくするソフトありますよね。
あれはどうやってブラウザからアドレスを取得しているんですか?
仕組みだけでいいので教えてください。よろしくお願いします。
0102デフォルトの名無しさん
2006/06/14(水) 22:36:510103デフォルトの名無しさん
2006/06/14(水) 23:25:26つーかプログラミングの話じゃないね。パソコン初心者板にでも逝け。
ICMPを捨てたら捨てたでいろいろ問題有るよ。
0104デフォルトの名無しさん
2006/06/15(木) 19:12:110105デフォルトの名無しさん
2006/06/16(金) 00:11:500106デフォルトの名無しさん
2006/06/16(金) 01:44:430107デフォルトの名無しさん
2006/06/16(金) 03:43:14パケット捨てるんじゃねーって(w
まあそのくせルータ屋として通信屋に納入するときは、大量にパケット落ちするような糞製品を作ってる悪寒(w
0108デフォルトの名無しさん
2006/06/16(金) 12:34:470109デフォルトの名無しさん
2006/06/16(金) 19:57:56IDE VS .net 2003
言語 C++
で Winsock を使っているのですが、ネットワークプログラムにおいて
実数型 (float) を送信する際はどのようにするのが一般的でしょうか ?
htonl( *(u_long*)&data ); とするのは強引ですか ?
0110デフォルトの名無しさん
2006/06/16(金) 22:55:44そういうときは、プロトコルを先に考える。
で、
・コンパクトで高速なバイナリ形式にする
・IEEE の短精度実数形式を用いる
と決めて、x86 の float は IEEE に準拠してるよね、
ということで安心してそのコードを実装として使う。
0111デフォルトの名無しさん
2006/06/16(金) 23:02:340112デフォルトの名無しさん
2006/06/16(金) 23:03:41どんな精度だってOKさ
0113デフォルトの名無しさん
2006/06/16(金) 23:14:14量が多い時は、
まず最初に相手とバイトオーダーのネゴをして、
違う場合のみバイトスワップをする。
同じ時はそのまま送る。
という方法もある。
0115デフォルトの名無しさん
2006/06/17(土) 00:36:25すぐに64bitなWinの時代だし。
0116デフォルトの名無しさん
2006/06/17(土) 03:32:40そういうこと詳しく解説してるサイトない?
0117デフォルトの名無しさん
2006/06/17(土) 04:39:19http://docs.sun.com/app/docs/doc/819-0389
Windowsだとuintptr_tがUINT_PTRだったりと名前が違ったりする(これがSOCKET型)が
留意点は基本的に同じ。
0118デフォルトの名無しさん
2006/06/17(土) 14:55:560119デフォルトの名無しさん
2006/06/17(土) 21:30:06WSAEventSelect関数で待機していると、
イベントオブジェクトがシグナル状態となるのに
イベントフラグを見ると何も発生していない(ゼロ)という現象が発生し悩んでいます。
下のサイトにも同じ投稿があったのですが、
この現象は無視してもいいのでしょうか?
ttp://forums.belution.com/ja/vc/000/308/18.shtml
0120デフォルトの名無しさん
2006/06/17(土) 21:39:40ネットワークに関する知識はどれくらい必要でしょうか?
それと、特別な通信環境を用意する必要はありますか?
サーバープログラムではIPアドレスなどを記述するようですが、
IPアドレスは固定できるのですか?
0121デフォルトの名無しさん
2006/06/18(日) 00:53:22最低でも>>1くらいは読みましたか?
0122デフォルトの名無しさん
2006/06/18(日) 01:03:350123デフォルトの名無しさん
2006/06/18(日) 01:11:12> 下のサイトにも同じ投稿があったのですが、
そのサイトは自己解決してるみたいだが…。
0124デフォルトの名無しさん
2006/06/18(日) 01:46:45基本的なことしか書いてない本でもいいので、馬鹿でも理解できる本を教えてください
0125デフォルトの名無しさん
2006/06/18(日) 01:51:43ページを次々にGETしにいく場合
socket() -> connect() -> send() -> recv() -> send() -> recv() ->
send() -> recv() -> send() -> recv() -> closesocket()
てな感じにやるのかなぁと思ってやってみたのですがうまく動きませんでした。
socket() -> connect() -> send() -> recv() -> closesocket() ->
socket() -> connect() -> send() -> recv() -> closesocket() ->
socket() -> connect() -> send() -> recv() -> closesocket()
てやるとうまく動くんですけど これが正解なんですか?
0126デフォルトの名無しさん
2006/06/18(日) 02:30:46Keep-Alive
0127デフォルトの名無しさん
2006/06/18(日) 02:37:55RFCはお読みになられましたか?
0128デフォルトの名無しさん
2006/06/18(日) 08:32:20テンプレ読んで。
0129125
2006/06/18(日) 09:11:38レスありがとうございます
RFC 2068 Hypertext Transfer Protocol HTTP/1.1
によるとConnection: Keep Aliveは永続的接続
Connection: closeは非永続性接続ということで理解しました。
自分が取得したいページはKeep Aliveでリクエストしたのですが
closeでレスポンスが帰ってきました。
HTTPサーバーの設定によってKeep Aliveが無視されるようです
なのでKeep Aliveを許していないサーバー相手は
>125のやり方で問題ないですよね?
せっかくなのでKeep Aliveが有効なサーバーでやってみたのですが
send() -> recv() -> send() -> recv() とやると
1回目のrecv()で通信が終わってしまいました(戻り値ZERO)
なのでsend() -> send() -> recv() とやるとうまくできたのですが
これが正解になりますか?
0130デフォルトの名無しさん
2006/06/18(日) 11:34:54Keep-AliveはHTTP/1.0拡張の不完全永続接続
HTTP/1.1はデフォルトでそれを改善した永続接続(persistent connection)
別物なので注意
0131デフォルトの名無しさん
2006/06/18(日) 11:41:26この自己解決に不満があったので質問しました。
ひとつイベントを受け取るたびにResetEventをする必要はないと思ったので。
0132デフォルトの名無しさん
2006/06/18(日) 12:51:17HTTP/1.0を投げる奴が多いことに驚いた。
0133デフォルトの名無しさん
2006/06/19(月) 18:19:56理解はしてても、いちいちあれ処理するの面倒じゃね?
0134デフォルトの名無しさん
2006/06/19(月) 20:46:250135デフォルトの名無しさん
2006/06/19(月) 20:53:100136デフォルトの名無しさん
2006/06/19(月) 22:03:340137デフォルトの名無しさん
2006/06/19(月) 23:27:19>1.1でcloseしろよ。
kwsk
0139デフォルトの名無しさん
2006/06/20(火) 00:40:17クライアントの環境がオーバクォリティ過ぎるから、何度もconnectしたくないな。
keep-aliveで何度も利用しないと次はいつconnectできるかわからん事もあるし。
0140デフォルトの名無しさん
2006/06/20(火) 12:35:16帯域制御の昨日はどのようなアルゴリズムが使われているのでしょうか。
0141デフォルトの名無しさん
2006/06/21(水) 10:41:37mod_bandwidthのソースでも読んでみれば?
0142140
2006/06/21(水) 13:23:590143デフォルトの名無しさん
2006/06/21(水) 21:42:11DataOutputStreamを使ってwriteBytes()メソッドで、
「GET ファイル名 HTTP/1.0」という一行目の要求を送っているのですが、
Etherealでパケットダンプしてみるとなぜか最初の「G」が一つのパケットで、
その後のデータが二つ目のパケットとして送信されています。
そのためプロトコルはHTTPと認識されているのですが、
データのフィールドに関する情報の詳細がEtherealでは見れないようになってしまっています。
結果的にレスポンスが戻ってきてはいるのですが、
これは特にJavaのプログラムのコードに依存することではなく、
特に気にする必要は無いのでしょうか。
0144デフォルトの名無しさん
2006/06/21(水) 23:35:25漏れはわざとHTTP/0.9とか投げて反応見たりする(w
0145デフォルトの名無しさん
2006/06/21(水) 23:45:40ない。
バイトストリームだから。
0146デフォルトの名無しさん
2006/06/21(水) 23:47:48ちょっとピント外れだね。
0147デフォルトの名無しさん
2006/06/22(木) 01:50:04nagleが効いてるから、ネットワーク的には大して問題にはならないだろうけど
さすがにちょっと効率悪くね?>DataOutputStream
0148デフォルトの名無しさん
2006/06/22(木) 03:04:27文字列入れてflushしないと効率悪いよ。
0149デフォルトの名無しさん
2006/06/22(木) 11:42:57一旦電文を組み立ててからまとめて write してる。
0150デフォルトの名無しさん
2006/06/22(木) 20:15:57PrintWriter使えばいい気がするが
0151デフォルトの名無しさん
2006/06/22(木) 22:47:04文字列だけってナウくない感じ。
0152デフォルトの名無しさん
2006/06/22(木) 22:55:05Don't println to a Socket
http://developer.apple.com/jp/technotes/tn1157.html
0153デフォルトの名無しさん
2006/06/22(木) 23:18:05ページの上の方にゴミみたいなデータが大量に表示されるんだけど、
どのような理由が考えられるのかな、、
0154コードぐらい晒せ。
2006/06/23(金) 00:23:030155デフォルトの名無しさん
2006/06/23(金) 01:13:20たまには部屋を掃除しなさい。
0156デフォルトの名無しさん
2006/06/23(金) 15:24:35抗菌とか抗ウイルスとかいろいろ売ってるから試してみたら。
もちろん汚れてたら洗浄しないと流量落ちるよ。
マカが居るのか。
0157デフォルトの名無しさん
2006/06/24(土) 22:46:39ネットなプログラムを書こうとしてるんだけど、お互いが固定ではないIP
の場合、相手のIPを知る必要がありますよね。手動で相手のIPを入力する
のは手間だし、メッセのデータを使えると便利かなぁとか。
0158デフォルトの名無しさん
2006/06/25(日) 01:36:23どっちかがDDNS登録すればいいじゃない。
無料でできるのとかあるしさ。
0159デフォルトの名無しさん
2006/06/25(日) 01:54:57やっぱりそうですか、残念。
暇つぶしに、固定の鯖を立てないでMMORPGみたいなチャットプログラムを作
ろうとしてたんですけど、なかなかむずいっすね。
0161デフォルトの名無しさん
2006/06/25(日) 20:13:59いつから変わったんだろ
0162デフォルトの名無しさん
2006/06/25(日) 20:27:420164デフォルトの名無しさん
2006/06/26(月) 08:07:34普通は、プロバイダが発行するIPアドレスしか存在しない。
プログラマはそれに合わせるしかないだろ。
LAN内なら、DHCPサーバが発行するIPアドレスしか存在しない。
DHCPサーバ・DHCPクライアントを自作して、特殊なIPアドレスを持たせるのは自由。
0165デフォルトの名無しさん
2006/06/26(月) 09:25:26詳しく説明してもらおうか
0166デフォルトの名無しさん
2006/06/26(月) 10:56:45???
0167デフォルトの名無しさん
2006/06/26(月) 11:20:05それをドメイン名変換するかしないかはプログラムの自由。
0168デフォルトの名無しさん
2006/06/26(月) 12:51:07馬鹿?
だからUDP使うようになったら相手は見えないんだって。-aしても。
UDPに「接続」はないから。
MSN Messenger Service ProtocolやSIPの規格読め。
0169デフォルトの名無しさん
2006/06/26(月) 12:56:41>LAN内なら、DHCPサーバが発行するIPアドレスしか存在しない。
ちょ、ここkwsk
0170デフォルトの名無しさん
2006/06/26(月) 14:40:160171デフォルトの名無しさん
2006/06/26(月) 16:04:27ところで、でんでんってもしかして云々(うんぬん)のことですか
0172デフォルトの名無しさん
2006/06/26(月) 17:13:26直接通信してりゃUDPでもパケットキャプチャしたらわかるし
TCPでも間にMSNの鯖経由して通信してるならMSN鯖のIPしかわからん
0173デフォルトの名無しさん
2006/06/26(月) 18:08:49フアイヤーウオールの設定とか色々絡んでくるから、
`MSNメッセは昔そうだったんだよ'ってのもアレなんだけど。
0174デフォルトの名無しさん
2006/06/26(月) 18:31:46UDPでも直接送られてるならキャプチャしたら分かるよ。
172の言うとおり、TCPかUDPかの問題じゃないでしょ。
0175デフォルトの名無しさん
2006/06/26(月) 18:36:31話の流れを良く読め
>>161 は
>昔はnetstatしたら相手のIP分かったよね?
と言っておる
0176デフォルトの名無しさん
2006/06/26(月) 20:26:29いやだから昔のMSNメッセンジャーはTCPでpeerに直接継いでたからnetstatしたら見えたし。
話の流れ読めてないのはUDPの話しだした>>162だろ。
0177デフォルトの名無しさん
2006/06/26(月) 20:44:55まるで今のMSNメッセンジャーが直接繋がないような言い方だな。
お前まるでプロトコル理解してないだろ。
0178デフォルトの名無しさん
2006/06/26(月) 21:02:42と言ってみる
0179デフォルトの名無しさん
2006/06/26(月) 21:03:25どうやってNATの内側同士でIPパケットを送り合えるか詳しく説明してくれ。
0180デフォルトの名無しさん
2006/06/26(月) 21:17:49UDP でいいならSkypeも使ってるUDP Hole Punching とか。
詳しい説明は自分でググれ。
0181デフォルトの名無しさん
2006/06/26(月) 21:17:59だからnetstatで相手のIP見えたんだろ?
で今はリレーノード方式になって見れなくなったとかなんじゃねえの?
そうなると余計にUDPの話を持ってきた>>162の真意が読めなくなるが
0183デフォルトの名無しさん
2006/06/26(月) 21:27:110184デフォルトの名無しさん
2006/06/26(月) 22:53:18CLOSE時に、クライアントからサーバ側にFIN(または、FINと同等のもの)を送信することはできますでしょうか?
やはり、Socketによる構築を行い、プロトコルを制御するしかないの
でしょうか?
0185デフォルトの名無しさん
2006/06/27(火) 01:55:370186デフォルトの名無しさん
2006/06/27(火) 02:05:040187デフォルトの名無しさん
2006/06/27(火) 10:01:21そこまでするほどの理由はあるのか?
0188デフォルトの名無しさん
2006/06/27(火) 13:15:37ん?
実際今はチャットとかファイル転送とかしない限り直接繋がらないでしょ?
昔はフレンドリストに入れるだけでIPわかったんよ。
0189デフォルトの名無しさん
2006/06/27(火) 22:45:36http://academy4.2ch.net/test/read.cgi/english/1151414777/l50
0190157
2006/06/29(木) 00:03:49自宅で鯖立てるのは面倒なんで、CGIが使えるレンタルサーバでも使って、
そこでIPを登録・取得とかでいけるかな。でも、ばれたら怒られそうだ。
>>188
チャットやファイル転送では直接つないでるんですか?それならパケット
みればIP分かりますね。
うーん、Etherreal消してしまったので確認できず・・・。
0191デフォルトの名無しさん
2006/06/29(木) 00:14:180192157
2006/06/29(木) 00:30:480193デフォルトの名無しさん
2006/06/29(木) 00:32:500194デフォルトの名無しさん
2006/06/29(木) 00:35:010195デフォルトの名無しさん
2006/06/29(木) 00:52:42直接繋げてみて、ダメだったら鯖経由になる。
0196デフォルトの名無しさん
2006/06/29(木) 10:33:580197157
2006/06/29(木) 13:43:190198デフォルトの名無しさん
2006/06/30(金) 01:56:06PC毎に数百個のノードを管理します。PC毎にIP割り当てを管理する専用のプロセスがいます。
そして、ノードごとに一意なIPアドレスが割り当てられるようにしたいです。
PCはハブ接続を行っています。
ルータ買わないとどうにもならないもんかな、デフォルトゲートウェイの設定とかでなんとかな
らないでしょうか・・・
0199デフォルトの名無しさん
2006/06/30(金) 02:40:49情報が足り無すぎ
0200デフォルトの名無しさん
2006/06/30(金) 03:16:24ソケット:winsock
仮にできたとしても、NICに複数IP割り当てを行わなきゃいけないんですかね・・・
0201デフォルトの名無しさん
2006/06/30(金) 03:23:53こんなこと書きたくはないし黙ってればいいのかもしれないが、>>198には
到底その仕事は無理だとおもう・・・
単に極端に日本語に不自由なだけで技術はあるならまた別だけれでも。
0202デフォルトの名無しさん
2006/06/30(金) 03:33:08思考は正しくてもアウトプットがへんてこだとアホに見られる好例
なにがしたいのか分からん
0203デフォルトの名無しさん
2006/06/30(金) 05:02:07ノードとか管理プロセスとか関係なくて、単に互いにNWアドレスの異なる複数のNWに属する
PCを単一セグメントのLANに接続したとき、どうルーティングすれば相互に通信できるのか、
っていう質問のような気がする。あってますか?
0204デフォルトの名無しさん
2006/06/30(金) 05:04:04>一つのPCに一つのネットワークアドレスを当てて
この時点でその推測は除外されるかと
0205デフォルトの名無しさん
2006/06/30(金) 05:05:470206デフォルトの名無しさん
2006/06/30(金) 05:20:49PC1 : NW 192.168.1.0/24 IP-ADDR 192.168.1.1
PC2 : NW 192.168.2.0/24 IP-ADDR 192.168.2.1
てな2台を1つのセグメントでつないで(タコHUBで繋いで)、相互に通信するには?
という質問かな、と。
これなら(Windows の場合)、
PC1 で route add 192.168.2.0 mask 255.255.255.0 192.168.1.1
PC2 で route add 192.168.1.0 mask 255.255.255.0 192.168.2.1
と互いにネットワークルートを設定すればいいような気がする。
0207デフォルトの名無しさん
2006/06/30(金) 05:58:52やってみてから書けば?
0208デフォルトの名無しさん
2006/06/30(金) 06:14:24だいたいそんな感じでできるでそ。
0209デフォルトの名無しさん
2006/06/30(金) 07:46:320210デフォルトの名無しさん
2006/06/30(金) 09:09:04TCP/IPスタックを呼び出してネットワーク通信を行う上位
プログラムの違いを理解すべきかと
0211デフォルトの名無しさん
2006/06/30(金) 17:32:080212デフォルトの名無しさん
2006/06/30(金) 18:12:58目的:各ノード(最終的には数千個)に一意なIPアドレスを振って、相互に通信させる。
まずはじめに、ネットワークテストプログラムを作成しました。この時はテストプ
ログラムで、ノードは最大でも64ノードまででした。ノードごとに使えるポートを管
理する事で相互通信をさせていましたが、
特に問題はありませんでした。
そろそろ本格的に数百のノードで実験を始めようかと思っています。最終的には
数千個のノードが稼動する予定です。
これから先を考えた場合、ポートを使ったノードの管理は不可能です。
そこで、IP単位でノードを管理したくなってきました。
現在、PCが複数台ありますのですべて使う事ができれば、負荷を分散させる事
ができます。PCを複数使う事になれば、PC毎にプロセスを作成することになりま
す。そこで、各PCにネットワークアドレスを割り振り、ネットワークアドレス単位で
各プロセスにIPを割り振らせることが一番楽な目的の解決方法だと考えています。
で、>>198のような質問をしました。
現在、PCに割り振られているIPでないとbind()が成功しない事に気づいて愕然とし
ています。WinXPですとIPアドレスを手作業でNICに結び付けれますが、数千IPだと、
無理があります。NICに範囲指定などで大量のIPを割り当てたいのですが、何か
いい方法はありますか?
0213デフォルトの名無しさん
2006/06/30(金) 18:28:26だろうな。
たぶん目的はなにかあるんだろうけど、ネットワークをまともに理解して
ないので解決方法を考えた段階ですでにねじれているように見える。
とりあえず地道に勉強しろというぐらいしかアドバイスのしようがないね。
0214デフォルトの名無しさん
2006/06/30(金) 18:46:36>目的:各ノード(最終的には数千個)に一意なIPアドレスを振って、相互に通信させる。
最終的には数千のノード(つまり数千端末)での相互通信が目的で、その運用に近い
テスト(ネットワーク負荷テスト?)を行いたいが、それだけの端末を用意できない。
だから擬似的に1台のPCに複数のIPアドレスを割当て、その割当てたIPアドレス分
のプロセスを起動させ、その起動したプロセスを擬似PCに見立てて通信テストを行い
たい、で、大量のIPアドレス割当ての簡単な方法を探している。
仮に212さんの目的とする手法が見つかったとしても、本手法では意味をなさないと
思うのだが。
最終目的は数千ノードの相互通信ですよね。
本システムを構築する為には、相当数の中継装置(ゲートウェイ・プロキシ・ファイア
ウォール等)を必要とします。
システムテストを行う場合は、実運用に近い形でテストしなとシステム稼動時に予期せぬ
トラブル、パフォーマンス不足、ネットワークトラフィック過多などが発生します。
運用テスト段階に入ってからのシステム全体の見直しとなった場合、目も当てられない
状況になります。
出来るだけ実運用に近い形でのネットワークテストをお勧めします。
0215デフォルトの名無しさん
2006/06/30(金) 18:50:34Q: PC上で動かすプロセス(数千あります)が、それぞれ固有のIPアドレスで通信できますか?
A: できませんし、そんなことを考えるのも馬鹿げています。RPC等を用いましょう。
0216デフォルトの名無しさん
2006/06/30(金) 20:28:35>一つのPCに一つのネットワークアドレスを当てて
この時点でその推測は除外されるかと
0217デフォルトの名無しさん
2006/06/30(金) 21:50:280218デフォルトの名無しさん
2006/06/30(金) 22:55:33新しくファイル共有ソフトを作りたいのよーママン」
と言っているのではないだろうか。
0219デフォルトの名無しさん
2006/06/30(金) 23:09:28>ログラムで、ノードは最大でも64ノードまででした。ノードごとに使えるポートを管
>理する事で相互通信をさせていましたが、
>特に問題はありませんでした。
>
>そろそろ本格的に数百のノードで実験を始めようかと思っています。最終的には
>数千個のノードが稼動する予定です。
>
>これから先を考えた場合、ポートを使ったノードの管理は不可能です。
>そこで、IP単位でノードを管理したくなってきました。
あほかこいつ?ポートで充分じゃん
0220デフォルトの名無しさん
2006/07/01(土) 01:35:39俺のクソゲーも少しは売り上げ伸びるかしら
0221デフォルトの名無しさん
2006/07/01(土) 04:43:400222デフォルトの名無しさん
2006/07/01(土) 10:22:27あなたがお探しの物は、IP Helper API(iphlpapi)で見つかると思います。
>現在、PCに割り振られているIPでないとbind()が成功しない事に気づいて愕然
>WinXPですとIPアドレスを手作業でNICに結び付けれますが
との記述がありますので、プログラミングが可能なお人かと思いますので、
ググって見て下さい。
ターゲットOSもWindows系に限定できるようなので、iphlpapiで検索すれば
iphlpapiを使用したサンプルを直ぐに見つかります。
後は、目的の機能を実現するユーティリティソフトを作成するだけです。
0223デフォルトの名無しさん
2006/07/01(土) 20:46:43ありがとうございます。とても嬉しいです。
現在はPlatform SDKをインストールして、AddIpAddress()の仕様を調べています。
最初の第二歩目となったサイトを置いておきますね。
IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く
ttp://www.geekpage.jp/programming/iphlpapi/
おまけとして、64bit環境のコンパイラも入手できた事はとても大きいです。
本当にありがとうございました。
0224デフォルトの名無しさん
2006/07/02(日) 20:49:46簡単に試したら受信0バイトで終了します。
データが送られるまで待つような設定ってできないのでしょうか?
0225デフォルトの名無しさん
2006/07/02(日) 21:20:04ブロッキングrecv()ならデータが来るまでずっと待機。
鯖側でaccept()が返してきたソケット閉じてない?
0226224
2006/07/02(日) 21:23:50ああなるほどです。
HTTP/1.0で試してたのでサーバー側で閉じられたんですね。
0227デフォルトの名無しさん
2006/07/03(月) 04:40:59負荷テストなら、実際と違うから本番で障害出まくりだろうし。
ゲーム鯖プログラムでも作ってるのかな?
簡単なのはベータテスト版を配布して、不特定多数に協力してもらえ。もちろん餌は必要。
世の中は完全なネットワーク環境だけじゃないよ。むちゃくちゃな環境からあの手この手でインターネットに繋げてきてる香具師がいくらでも居る。
手っ取り早くその辺の技術をパクりたければ、既に運用して課金開始してる業者で働け。
0228デフォルトの名無しさん
2006/07/03(月) 21:05:50いま、adhoc通信の研究をしているんですが、有力な候補がa, b, c方式とあがっています。
どのチームの責任者も自分の案を押すばかりで、一歩も譲ろうとしません。
んで、私はどのチームの人間とも全く関わりを持たないのですが、というか持たないから
こそかもしれませんが、私のチームでa, b, cをシミュレートするプログラムを作れと言われ
ているのです。
で、何かの縛りをつけて、どこかの方式が不利になると、また喧嘩になるので、ただシミュレート
プログラムを作れとだけ言われています。何の条件もありません。
正体がばれるとまずいのでこれくらいしか書けませんが、とりあえずやりたかったのは
簡単に言えばadhoc通信です。
0229デフォルトの名無しさん
2006/07/03(月) 21:17:49というのは、IP層より下の層の性質が結構効いてくるから。
正直OpenSourceのものを改造すれば間に合うと思う。
「ネットワークシュミレータ」でぐぐって。
適当な板やスレッドはあるのかなあ。
0230デフォルトの名無しさん
2006/07/03(月) 22:03:410231デフォルトの名無しさん
2006/07/04(火) 00:49:10ま た 趣 味 レ ー タ か !
0232デフォルトの名無しさん
2006/07/04(火) 09:38:06Simulateはシュミレートではなく、シミュレートです。
Simulatorはシュミレーターではなく、シミュレーターです。
Simuをシュミと読むのはバカ日本人だけです。
いいですか? ××× シュミ ××× 大間違い! 違います! こんな読みがまかり通るのは許せません!
シュミレーションとはなんですか? 馬鹿ですか? 何が趣味ですか?
口が回らなくて”シミュ”をうまく言えないのはまあ許してやります。
ですが、書くときまでシュミと糞間違いをするのは死刑モノです。
間違いを指摘してもらえる馬鹿は、まだましです。
五十過ぎたおやじが、「血眼」を「ちなまこ」と言っていて、誰も訂正しません。
血ナマコおやじというあだ名です。
しかも、説教でいつも興奮して言っています。
「いいか! ちなまこになって顧客を開拓しろ!」
みんな笑いを抑えるのに必死です。
シミュレーションを趣味レーションとか言っているやつも、鼻で笑われています。
馬鹿っぷりを露呈する前に、自ら正しましょう。
●シミュレーション( [simulation] 模擬実験 (コンピューターなどを使い実際の現象に似たモデルをつくって実験・研究すること。<原義は「見せかけ」>)
●趣味レーション(日本人がシミュレーションのシミュをシュミ(趣味)と誤った発音をしてしまったことから生まれたでたらめ語)
中には「「趣味レーション」でも意味が伝わればいい」などと居直る害虫野郎がいます。
意味が伝わればいいなら
戸棚を「となだ」と言っていいのですか? 雰囲気を「ふいんき」と言っていいのですか? ボトルを「ボルト」と言っていいのですか?
どうでもいいのですか? 気になるでしょう? 変でしょう?
趣味レーションなんて白痴言葉はすぐにやめなさい! 恥ずかしいから。
Simulationはシミュレーションです!
0233デフォルトの名無しさん
2006/07/04(火) 11:54:59念のため聞くけど、229の一行目を見た上で釣られてるんだよな?
0234デフォルトの名無しさん
2006/07/04(火) 17:30:12ネットワークシミュレータ の検索結果のうち 日本語のページ 約 12,900 件中 1 - 10 件目 (0.12 秒)
上に探すものがあるのか・・・?
0235デフォルトの名無しさん
2006/07/04(火) 20:57:24バカすぎて萎えるな
0236デフォルトの名無しさん
2006/07/09(日) 11:42:37途中までできて、最後まで取得できません。
以下にソースを示します。
どこが悪いのでしょうか?
int i = 0;
while(1){
err = recv(s, recvbuf, RECVSIZE, 0);
if(err == 0){
interr_code = WSAGetLastError();
printf( "Error: 受信失敗\n" );
break;
}
if( err == SOCKET_ERROR){
printf( "Error: 受信失敗\n" );
break;
}
fwrite( recvbuf, sizeof(char), strlen(recvbuf), file );
memset( recvbuf, 0, sizeof(recvbuf) );
i++;
}
0237236
2006/07/09(日) 11:46:40エラーが発生した時( err==0 )に
i の値をデバッカで見てみるのですが
100〜300 とエラーが発生するタイミングもランダムです。
WSAGetLastError() は ゼロを返します。
0238236
2006/07/09(日) 11:47:44send(s, szBuffer, strlen(szBuffer), 0);
sprintf( szBuffer, "Accept: */*" );
send(s, szBuffer, strlen(szBuffer), 0);
sprintf( szBuffer, "Accept-Encoding: gzip" );
send(s, szBuffer, strlen(szBuffer), 0);
sprintf( szBuffer, "Connection: close" );
send(s, szBuffer, strlen(szBuffer), 0);
sprintf( szBuffer, "Host: www.crystalxp.net" );
send(s, szBuffer, strlen(szBuffer), 0);
sprintf( szBuffer, "Referer: http://www.crystalxp.net/galerie/img/index.html" );
send(s, szBuffer, strlen(szBuffer), 0);
while() 前に 送っているリクエストを載せておきます。
0239デフォルトの名無しさん
2006/07/09(日) 11:53:31if (interr_code == 0) {
continue;
}
0240デフォルトの名無しさん
2006/07/09(日) 12:12:38while(recvsize > 0){
err = recv(s, recvbuf, recvsize, 0);
if( err == SOCKET_ERROR){
printf( "Error: 受信失敗\n" );
break;
}
recvsize -= err;
fwrite( recvbuf, sizeof(char), err, file );
}
こんな乗りで
0241デフォルトの名無しさん
2006/07/09(日) 12:18:01recvの戻り値は、
整数:読み取ったデータのレングス
0:TCP/IP通信の相手側がソケットのクローズをした可能性が有り、
WSAGetLastErrorで詳細を確認
SOCKET_ERROR:ソケットI/Oエラーが発生、WSAGetLastErrorで詳細を確認
バイナリデータの受信を行っているのに、受信データの有効長を
strlenで確認していることがそもそもの間違い。
バイナリデータなのだから、0x00もバイナリデータと認識すべき。
0242デフォルトの名無しさん
2006/07/09(日) 12:19:24sendlen = strlen(ss);
total = 0;
err = 0;
while(total < sendlen){
err = send(s, szBuffer, sendlen, 0);
if(err == SOCKET_ERROR)
break;
total += err;
}
0243236
2006/07/09(日) 15:39:52recvsize -= err;
ですか、いいですね
>バイナリデータなのだから、0x00もバイナリデータと認識すべき。
そのとおりですね。ちょっと暑かったので手を抜・・・げふげふ
while( recvsize > 0 ) は参考になりました
ありがとうございました。
0244デフォルトの名無しさん
2006/07/10(月) 00:36:49相手がいきなりクローズしたら無限ループになるぞ。
>>241
> 0:TCP/IP通信の相手側がソケットのクローズをした可能性が有り、
> WSAGetLastErrorで詳細を確認
recv が 0 を返した時に WSAGetLastError() なんか呼んじゃ駄目だよ。
0245工房
2006/07/10(月) 05:01:55ネットワークの知識は基本技術者レベルです。
この本を検討したんですが、内容が古いそうなのでやめました。
http://www.amazon.co.jp/gp/product/4873110610/249-2208343-5734750?v=glance&n=465392
夏休みにこの分野をおさえたいと思っています。
よろしくお願いします。
0246デフォルトの名無しさん
2006/07/10(月) 09:39:26応用でJavaに逝ってくれ。
暇ならホームページでも作ってログでも残してくれ。
0247デフォルトの名無しさん
2006/07/10(月) 10:02:120248デフォルトの名無しさん
2006/07/10(月) 10:09:12Comer本見たいな内容は書けないのでは
0249デフォルトの名無しさん
2006/07/10(月) 11:20:59packet caputureも出来るしね。>>5
そういうのは調べてから書き込みましょう。
0250工房
2006/07/10(月) 20:20:41なるほどCですか。Cも本当に基本しか知らないので、ずっとやってきたJavaでやろうと
思っていました。
Cやるんならこの際coLinuxでもいれてみようかなぁ
0251デフォルトの名無しさん
2006/07/11(火) 00:14:57>>250 PCもう1個中古で買ってLinux入れたほうがいいよ
0252工房
2006/07/11(火) 01:35:58家そんな裕福でないので、とりあえずもう一台は無理っぽいです。パソコンも
家族共用ですし…
学校のパソコンも全部Windows;;
htmlとphpとMySQLが一応使えるので、サイト構築でお金稼ごうかなと思ってたり。
アドバイスの通りCでやってみようかな、webでもCで解説しているのが多いですしね。
0253デフォルトの名無しさん
2006/07/11(火) 16:08:060254デフォルトの名無しさん
2006/07/11(火) 16:15:22マジレスするとリアル工房にそんな仕事頼む所などないぞ。
コネがありゃ別だが。
素直にバイトして金稼げ。
0255デフォルトの名無しさん
2006/07/11(火) 19:43:590256デフォルトの名無しさん
2006/07/11(火) 19:52:583万持って秋葉原行ってみ。立派なディスプレイ付中古が買えるから。
ディスプレイいらんなら、3万で新品PCが買える。
0257デフォルトの名無しさん
2006/07/12(水) 00:05:520258デフォルトの名無しさん
2006/07/12(水) 01:35:15個人的にはオーム社のTCP/IPソケットプログラミング 2冊がおすすめ
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06520-0
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06519-7
0259デフォルトの名無しさん
2006/07/12(水) 01:39:12http://www.amazon.co.jp/gp/product/4822221199
0260デフォルトの名無しさん
2006/07/12(水) 06:36:12一応カートには入れてみたものの
●表紙が気に入らない
●「いまどきの〜」というタイトルに不信感がある
とりあえず保留かな
0261デフォルトの名無しさん
2006/07/12(水) 14:48:40tool紹介とRAW socketだけいじる内容か。
しょぼいな。
0262デフォルトの名無しさん
2006/07/12(水) 15:54:43を作るための本がほしいぞ
できればセキュアなやつ
0263デフォルトの名無しさん
2006/07/13(木) 00:27:55ネットワークプログラミングの基礎知識
http://x68000.q-e-d.net/~68user/net/c-http-1.html(ソース)
のページを見ながら勉強してます。
C++ builder6で、httpクライアントhttp-client.cを
コンパイルしたら下記のようなエラーがでました。
linuxのプログラミングだからだと思うんですが、
これを動かすためには、エラーや警告が出た関数、構造体、
インクルードファイルをみて、windows用に変えればよいと
予想してますが、
・インクルードファイルを変えて、関数名をちょっと変えるぐらいで
動いたりするんでしょうか?
・きちんとプログラムを理解して大幅に変更しないとだめでしょうか?
winsock2を使うんでしょうか。
<続きます>
0264デフォルトの名無しさん
2006/07/13(木) 00:28:37エラー E2209 http-client.c 7: インクルードファイル 'sys/socket.h' をオープンでき
ない
エラー E2209 http-client.c 8: インクルードファイル 'netdb.h' をオープンできない
エラー E2209 http-client.c 9: インクルードファイル 'netinet/in.h' をオープンでき
ない
エラー E2209 http-client.c 10: インクルードファイル 'sys/param.h' をオープンでき
ない
エラー E2209 http-client.c 11: インクルードファイル 'sys/uio.h' をオープンできな
い
エラー E2209 http-client.c 12: インクルードファイル 'unistd.h' をオープンできな
い
エラー E2450 http-client.c 19: 未定義の構造体 'sockaddr_in'(関数 main )
エラー E2449 http-client.c 19: 'server' のサイズが不明、あるいはゼロ(関数 main )
エラー E2450 http-client.c 19: 未定義の構造体 'sockaddr_in'(関数 main )
エラー E2450 http-client.c 19: 未定義の構造体 'sockaddr_in'(関数 main )
エラー E2449 http-client.c 19: 'server' のサイズが不明、あるいはゼロ(関数 main )
警告 W8065 http-client.c 68: プロトタイプ宣言のない関数 'gethostbyname' の呼び出
し(関数 main )
警告 W8069 http-client.c 68: 移植性のないポインタ変換(関数 main )
エラー E2450 http-client.c 74: 未定義の構造体 'sockaddr_in'(関数 main )
エラー E2109 http-client.c 74: 許されない型(関数 main )
・・・・(倍あるので省略します)
よろしくお願いします。
0265デフォルトの名無しさん
2006/07/13(木) 00:42:44このエラーにすら対処できないようでは、このスレに来る以前のレベルだと思う。
初心者スレにでも行った方がいいと思うよ。
0266デフォルトの名無しさん
2006/07/13(木) 00:43:15それよりも、まずWinsockの本を買ってくるほうが先だと思う
ちゃんと理解してないのにPGを組もうとするのは間違ってると思わない?
0267デフォルトの名無しさん
2006/07/13(木) 00:46:01実際に上のソースがコンパイルできるかどうかは知らんけど。
0268デフォルトの名無しさん
2006/07/13(木) 00:57:32どの程度までネットワークを触りたいのか知らないけど、
先に環境などの基礎固めしておいたほうが良いと思う。
0269デフォルトの名無しさん
2006/07/13(木) 01:22:56cygwinをgui環境で使うにはどうしたらいいんですか?
0270デフォルトの名無しさん
2006/07/13(木) 01:26:02了解しました。
初心者スレに戻っていろいろ勉強してきます。
ネットワークのことなのでこちらの方が良いのか
と思って伺いました。
>>266
初心者スレで、「Winsock2.0プログラミング」進められたので、
早速本屋に行ってみました。ちょっと高かったので長時間立ち読みしました。
今回の問題が解決できないってことは、全然だめってことなんですね。
もう一回勉強してから本購入してみようと思います。
>>267
Cygwinですか。ありがとうございます。
早速調べます。
>>268
環境などの基礎固めですか。
了解しました。
0271デフォルトの名無しさん
2006/07/13(木) 01:36:000272デフォルトの名無しさん
2006/07/13(木) 02:18:36非同期で動くプロキシ処理を試しているんですが、
1.FD_ACCEPTが来たらWSAAsyncSelect()で準備。
2.クライアントのコネクションを受付け、FD_READが来たら受信する。
3.Async→ 接続要求先へconnect→ Async→ 受信データをそのままsend→
(\nだけの空行を追加送信?)→ 応答を待つ。
という流れを考えています。
大まかには↑のような流れで間違ってはいないでしょうか?
0273270
2006/07/13(木) 03:58:53コードにコメントが付いていて
しかも詳しい解説があるので、毎日のように
見に行ってしまいます。
初心者としては、あちこち調べまわらなくても
良いので毎日のように見に行ってしまいます。
WINSOCKとどのあたりが違うのか、いまいちわかりませんが
とりあえずネットワークプログラミングの感覚だけでも
掴みたいなぁと。
動かした結果も載っているんですが、自分でも
動かしたいと思いました。
0274デフォルトの名無しさん
2006/07/13(木) 05:57:58Winsockでの同じようなサイトが無いっていう意味だよね?
じゃあさ、君がWinsockでうまく動くように出来たら公開してよ。
0275デフォルトの名無しさん
2006/07/13(木) 19:47:43まだわからないことがたくさんで、
調べまくって、とにかく暗記している状態です。
winInetライブラリのhttp,ftpなど勉強しました。
linuxのシステムコールを使うためのライブラリが
あることがわかりました。
これからwinSockがんばります。
勉強始めたばかりで、
C++の知識、C++ builuderの使い方、API、linuxの知識が
ほとんど無かったので苦労してることがわかってきました。;;
感覚とか、何を勉強すれば良いのか、わかってきたので
今日また本屋に行ってみたんですが、昨日全然歯が立たなかった
本が急にポンポンわかるようになりました。
>じゃあさ、君がWinsockでうまく動くように出来たら公開してよ。
人様に説明できるぐらいの腕前になれるようがんばります。
0276デフォルトの名無しさん
2006/07/13(木) 22:24:40winsockでサーバーとクライアントの単純な物を作ったりして
練習してました。
もっと理解を深めようと、色々なサイトのサンプルを眺めていて
一つ疑問に思ったことがあります。
普通サーバーの方だと
ソケット作ってバインドしてからlisten()で待ち受ける準備して
acceptで接続を待つって感じだと思うんですが
windowsプログラムの場合だとlistenをセットしたら後は
メッセージプロシージャで待つだけみたいな感じで
メッセージ確認して初めてacceptするようなんですが
これはwindowsが勝手に、ループで接続確認をやってるのと同じことを
してくれてるということなんでしょうか?
0277デフォルトの名無しさん
2006/07/13(木) 23:01:350278デフォルトの名無しさん
2006/07/13(木) 23:51:15マルチスレッドにすればそういうの気にしなくてもよくなる
0279デフォルトの名無しさん
2006/07/14(金) 02:21:310280デフォルトの名無しさん
2006/07/14(金) 02:54:59ということはスレッド作って、そっちで接続待機してって感じで自前で?作って
windowsのメッセージ処理ではやらないってすればwindowsに頼らないで
出来るってことなのかな
windowsプログラムで作る場合は、メッセージでやる方が楽だけど
実際はどっちがいいでしょうか?
0281デフォルトの名無しさん
2006/07/14(金) 07:15:340282デフォルトの名無しさん
2006/07/14(金) 13:21:190283デフォルトの名無しさん
2006/07/14(金) 13:59:40ソケットAPIにおいての "accept" とは、正確にはソケットキューにキューイング
された接続要求を取り出すのであって、 "accept" でクライアントからの接続を
待つわけではない。
Windowsメッセージに頼ることなく、且つ、非同期処理的な仕組みを実現する場合
は、"select" と組み合わせることで可能とです。
"accept" から戻された新たな接続処理は、その接続処理を実行する関数をスレッド
として起動すれば、Windowsメッセージに頼らなくても出来ますよ。
>windowsプログラムで作る場合は、メッセージでやる方が楽だけど
>実際はどっちがいいでしょうか?
通信サーバーに特化するのであれば、Windowsメッセージに頼らない方がプログラム
の構成がシンプルになると思う。
0284デフォルトの名無しさん
2006/07/14(金) 14:01:37お前の指図を受けるいわれは無い
0285デフォルトの名無しさん
2006/07/14(金) 14:47:48google で "レジューム .c socket" で検索したのですが
見つかりませんでした
0286デフォルトの名無しさん
2006/07/14(金) 15:01:57>普通サーバーの方だと
>ソケット作ってバインドしてからlisten()で待ち受ける準備して
>acceptで接続を待つって感じだと思うんですが
それが普通で Windows が普通じゃないと思ってるから悩んでるんだろ?
じゃあ普通のやりかたしとけって言ったんだけど何か不満?
0287デフォルトの名無しさん
2006/07/14(金) 15:08:57getしてるだけ。
ライブラリになってるものが欲しければlibghttpとか、完結してる奴が見たければ
wgetとかでいいんでないの?
0288デフォルトの名無しさん
2006/07/14(金) 15:25:190289デフォルトの名無しさん
2006/07/14(金) 17:08:070290デフォルトの名無しさん
2006/07/14(金) 20:19:33windowsに頼らないでやったら、もしかしたらあまりよくないのか
よくわからなかったのですが、そんなことはないんですね
色々わかりました。ありがとう
>>286
気付いてるかもしれないけど別人です
0291デフォルトの名無しさん
2006/07/15(土) 22:10:53環境は XP、.NET 2005 で、Winsock2 を使ったネットワークプログラミングにチャレンジしています。
練習として、WSAAsyncSelect を用いた非同期の1対多のチャットソフトを作っています。
サーバにおいて、WSAAsyncSelect で指定したウィンドウに FD_READ が届いた時、
メッセージがどのクライアントから届いたのかを知るにはどうすれば良いのでしょうか?
クライアントごとにソケットを作成しているので、誰からのメッセージかが分からないと、
recv 関数の第一引数にどのソケットを指定していいかが分からずに困っています。
よろしくお願いします。
0292デフォルトの名無しさん
2006/07/15(土) 22:37:120293291
2006/07/15(土) 22:45:58ありがとうございます。解決です。
FD_READ ばかりに気を取られて、そもそも lParam に関係なく wParam の値が云々という発想にいたっていませんでした。
0294デフォルトの名無しさん
2006/07/15(土) 23:16:14ってプログラムで、まだ何にも送信してないのにFD_READが発生して
データがきたら、どうするのが普通?
受信してエラーにする?
無視する?でも、
無視した場合、送信後にrecvしたら、結局、受信することになるのか?
0295デフォルトの名無しさん
2006/07/15(土) 23:47:10としか返答できんわな
0296デフォルトの名無しさん
2006/07/16(日) 00:09:300297デフォルトの名無しさん
2006/07/16(日) 00:16:04表示するアプリを製作中ですが、デバッグしたところ不可解な現象がでました。
当初から使用していたノートPCでは動作良好だったのですが、別のディスクトップPC
で動作させてみたところ、画像が約10秒も遅れて表示されてしまいます。
ディスクトップPCはCPUもLANカードもノートPCには劣ってません。
TcpClientのプロパティを見るとNoDelayというものがありましたが、関係しますでしょうか。
NoDelayは設定してませんでしたのでFALSEになってました。
装置は今のところ使えないのでプロパティを変更して確認することはしておりません。
0298デフォルトの名無しさん
2006/07/16(日) 00:36:140299デフォルトの名無しさん
2006/07/16(日) 02:07:090300デフォルトの名無しさん
2006/07/16(日) 06:50:240301297
2006/07/16(日) 08:19:57画像データといいましたが、音響レーダーのデータです。
今ソースを見直したところ、TcpClientのReceiveBufferSizeを6000000(6M)も設定しているので
すが、ReceiveBufferSizeがフルになるまで、受信を待たされるようなことは起こるのでしょうか。
ただノートPCでは、全く同じソフトを動かして遅れないんですよ。
デスクトップ(タワー)のみギガビットイーサが搭載されているので、これが影響してるんですかね。
0302デフォルトの名無しさん
2006/07/16(日) 08:31:56ethereal辺りで通信状況を調べて原因を割り出せ('A`)
0303デフォルトの名無しさん
2006/07/16(日) 08:33:20そういう大事なことは先に言った方がいいよ
0304デフォルトの名無しさん
2006/07/16(日) 11:47:040305デフォルトの名無しさん
2006/07/16(日) 20:00:490306デフォルトの名無しさん
2006/07/16(日) 21:33:30desktop
discotop
0307デフォルトの名無しさん
2006/07/20(木) 00:22:260308デフォルトの名無しさん
2006/07/22(土) 01:55:36・・・そんな俺が書いたプログラムが、世の中にイッパイでまわってるのさ
おまえらもコネクションの切り方とか適当だろ?
0309デフォルトの名無しさん
2006/07/22(土) 03:00:590310デフォルトの名無しさん
2006/07/22(土) 03:12:50”正規解放 ソケット”でぐぐると幸せになれるかも。
0311デフォルトの名無しさん
2006/07/22(土) 05:05:070312デフォルトの名無しさん
2006/07/22(土) 07:24:320313デフォルトの名無しさん
2006/07/22(土) 09:00:34<sys/socket.h>
を使えるライブラリってありますか?
gcc ではなく bccで利用したいのですが
やはり winsocket.h で書くしかないのでしょうか?
0314デフォルトの名無しさん
2006/07/22(土) 09:32:31socket<--->Winsockなラッパーでも書いて表面上は同じように振舞わすくらいしかないんじゃね?
0315128
2006/07/22(土) 12:07:370316デフォルトの名無しさん
2006/07/22(土) 15:05:230317Mac
2006/07/22(土) 23:05:12マックでプログラミングするのって、
Windowsでプログラミングするのとちがうの?
今WindowsのCプログラミングを勉強してるんだけど、
マックでもCプログラミングを同じようにできるのかな?
誰か教えて!!
0318デフォルトの名無しさん
2006/07/22(土) 23:11:150319デフォルトの名無しさん
2006/07/22(土) 23:29:36ックでプログラミングするのって、 Windowsでプログラミングするの
とちがうの?
ワ今WindowsのCプログラミングを勉強してるんだけど、 マッ
|
クでもCプログラミングを同じようにできるのかな? 誰か教えて!!
0320デフォルトの名無しさん
2006/07/23(日) 01:11:42今、AppleTalkを勉強して極めるなんて、
マニアックjだな
0321デフォルトの名無しさん
2006/07/23(日) 02:06:32つれるか?
0322デフォルトの名無しさん
2006/07/23(日) 02:33:47Mac の方が Socket も C もオリジナルに近い
0323デフォルトの名無しさん
2006/07/23(日) 05:30:40WIN2k、VC++6.0、Winsock2で組んでいますが、
稼動中のSOCKETの総数を調べる方法がわかりません。
いくつSOCKETが動いているか調べる方法はありますか?
お願いします。
0324デフォルトの名無しさん
2006/07/23(日) 06:01:150325デフォルトの名無しさん
2006/07/23(日) 06:24:13プログラムの中で調べて、値をプログラムに反映させたいのです。
0326デフォルトの名無しさん
2006/07/23(日) 06:34:480327デフォルトの名無しさん
2006/07/23(日) 08:49:13IP Helper API(iphlpapi)で目的の情報は取得できます。
IPHLPAPIを使ってWindowsでネットワーク設定いじるプログラムを書く
ttp://www.geekpage.jp/programming/iphlpapi/
0328323
2006/07/23(日) 19:39:24IPHLPAPIってなんか難しそうですね。
ソケットを3つ作って(A,B,C)
sock_B=accept(sock_A);として
Sock_AにBが接続されたらSock_Cが別の場所に接続しに行って、
Sock_Bが切断されたらSock_Cも切断する。
Sock_Aはそのまま。
こんなのを作りたかったんですが、結構面倒なんですね。
0329デフォルトの名無しさん
2006/07/23(日) 19:49:59マルチスレッドにすればいいだけ茶宇野?
0330デフォルトの名無しさん
2006/07/23(日) 19:57:18それのどこが面倒なのかよくわからない。
0331デフォルトの名無しさん
2006/07/23(日) 20:10:42> sock_B=accept(sock_A);として
> Sock_AにBが接続されたら
この時点で意味がわからん…
0332デフォルトの名無しさん
2006/07/23(日) 21:28:100333323
2006/07/23(日) 22:03:55ソケットの総数が1個減ったらsock_Cを切断すればいいと思ったんですよ
0334デフォルトの名無しさん
2006/07/23(日) 23:14:27> sock_Bが生きてるかどうかの確かめ方がわからんから、
sock_B ってお前のプログラムが操作するんじゃないの?
> ソケットの総数が1個減ったらsock_Cを切断すればいいと思ったんですよ
ほかのプロセスがその間ソケット生成/消滅しない保証はあるのか?
0335323
2006/07/24(月) 02:56:02ありがとうございました
0336デフォルトの名無しさん
2006/07/26(水) 02:46:52あるレスポンスコードが返ってきたら、ブラウザに対して
別のページを表示する、ということがしたいのですが、
こういうことができる拡張可能なproxyってありませんか?
今のところjettyしか見つかってないんですが、他にありましたら
ご教示ください。
よろしくお願いします。
0337デフォルトの名無しさん
2006/07/26(水) 03:20:12板違い。ソフト板とかにgo
0338デフォルトの名無しさん
2006/07/26(水) 03:22:21スレ的にはレスポンスコード見てlocationを足すproxyを作れば
いいわけだ
0339デフォルトの名無しさん
2006/07/28(金) 15:52:49ネットワーク入門書のチャットのクライアント、サーバ
何度も打ち込んで覚えて、大体わかってきました。
これから、チャットとファイル交換をできるように
したいのですが、どのようにするのかわかりません。
1.ファイルの中身を読み込んで、
[ファイルの名前]:[ファイルの中身のデータ]
というう風なフォーマットにして送信。
2.データを受け取った側で、ファイルを作って
[ファイルの名]:[ファイルの中身のデータ]
を書き込むとファイルを送ったことになるのでしょうか?
これだと、ファイル名とデータの中身しかわからず、
ファイルの作成日とかその他の情報が送れないので、
ファイルそのものを送ることがしたいです。
アドバイスよろしくお願いします。
なにかお勧めの本やサンプルコードのある
サイトなどもご紹介いただけると助かります。
0340デフォルトの名無しさん
2006/07/28(金) 15:57:36というう風なフォーマットにして送信。
0341デフォルトの名無しさん
2006/07/28(金) 16:11:39回答ありがとうございます。
そういう風に送るものなんですね。
さっそくやってみます。
0342デフォルトの名無しさん
2006/07/28(金) 16:32:420343デフォルトの名無しさん
2006/07/28(金) 16:48:35了解しました。
こういう風に送ることもできるんですね。
通常はどのように送るものなのでしょうか?
田舎なので、書店に行ってもファイルを送信するサンプルが
載ってる本が無いんです。
アマゾンでもどれを買っていいのやら・・・。
0344デフォルトの名無しさん
2006/07/28(金) 16:52:49知りたければRFC読め。
0345デフォルトの名無しさん
2006/07/28(金) 18:14:10Content-Type: 拡張子
Content-Length: サイズ
Content-Created: タイムスタンプ
Content-Encoded: Base64
(改行)
---- Base64 のデータ ----
---- Base64 のデータ ----
---- Base64 のデータ ----
---- Base64 のデータ ----
---- Base64 のデータ ----
みたいなのが現在の流行
0346デフォルトの名無しさん
2006/07/28(金) 18:15:35ありがとうございます。
httpとかftpなど、さっそくRFC読みました。自分初心者で
頭も悪いのであまりわかりませんでした。
転送のデータ構造がどうなっているのか書いて
あったようなのですが難しいです。
えっと、
・ファイルそのもののデータ構造で送信
・ファイルを開いて中身を送信
する方法があるような気がしているのですが、
この解釈でよかったでしょうか?
ファイルそのもののデータ構造で送信する
ときなんですが、
int send(SOCKET sock, char* buf, int len, int flag)
このsend関数のbufにファイル構造のデータを入れて送信すれば
いいんでしょうか。
手元の本のFTPクライアントは、get関数みたいなのを
使っているんですが、ファイル構造そのものを送信しているのか
[ファイルの名前]:[ファイルの作成日とかその他の情報]:[ファイルの中身のデータ]
のようになんかのファーマットに直してから送信しているのかとか
わからないし。
いろんなことがわかりません。
脳が溶けてきました。
よろしくお願いします。
0347デフォルトの名無しさん
2006/07/28(金) 18:17:44おおお、なんか恥ずかしい返事書いているときに。
ありがとうございます。
0348デフォルトの名無しさん
2006/07/28(金) 18:29:22「ファイルそのもののデータ構造」ってのはファイルシステム(FAT,NTFS,etc)によって異なるし、
ネットワークで伝送するフォーマットも規定されていない(ことが殆ど)ので、
ファイルの中身+いくつかの属性(名前、生成日時等)を適当なプロトコルで送れば十分。
>[略]このsend関数のbufにファイル構造のデータを入れて送信すれば
>いいんでしょうか。
単一ファイルに対してそんなことが可能なファイルシステムやOSは無いと思う。
パーティション丸ごとなら送れると思うが。
0349デフォルトの名無しさん
2006/07/28(金) 21:48:05Winsock2を使って、
マルチスレッド+イベントオブジェクト
で基幹処理を組んで実験してみたところ、
WSAWaitForMultipleEventsは、
イベントが着ていても、10ms単位でしか処理が帰りませんでした。
(具体的には、イベントが検知されたときの時刻を記録したら、
最速でも10msの時間が空いていた)
ゲームのループは60fps=16ms単位でやろうとしているので、
最大10msの受信遅延は結構大きな壁になりそうで困っています。
(毎フレーム通信することに対しての突っ込みは置いておいて)
なるべく素早く反応を返したい場合、
非同期モードのウィンドウメッセージで組むべきなのですか?
それとも、イベントオブジェクトのチェック
の10msの間隔を縮める方法などがあれば教えてもらえませんか・・・?
0350デフォルトの名無しさん
2006/07/28(金) 21:54:29>最速でも10msの時間が空いていた)
なにで時間計測した?
システム時間の計測精度がそもそも10ms
0351デフォルトの名無しさん
2006/07/28(金) 22:41:30あ!!!
めんどくさがって言語の標準の時刻系関数使ってました
TimeGetTime使ったら全然違いました〜
ちゃんと1ms単位(計測精度単位)で動作してましたwwww
鋭い突っ込みありがとうございました
これで不安がなくなったー
0352デフォルトの名無しさん
2006/07/29(土) 17:24:20環境は、XP sp2、VS.net2003でManagedC++(C++/CLIじゃない)を使用してます。
サーバーを書いてます。
サーバーソケットを非同期モードにし使用してるので、-1が返るまでrecvしているのですが、
クライアントが接続後、最初のデータを正常に受信したあと(全部送り終わり、サーバー側も正常に全部受信したあと)
-1が返り、WSAGetLastErrorの戻り値を見るとWSAEWOULDBLOCKではなく、
5(アクセスが拒否されました)が返ってきます。
それ以降、このエラーを無視し処理を続け手も正常に受信できます。
その後、正常に送受信できるので無視してるのですが、無視してかまわないものなのでしょうか?
0353デフォルトの名無しさん
2006/07/29(土) 17:47:030354デフォルトの名無しさん
2006/07/29(土) 18:01:00> クライアントが接続後、最初のデータを正常に受信したあと(全部送り終わり、サーバー側も正常に全部受信したあと)
(ry
> それ以降、このエラーを無視し処理を続け手も正常に受信できます。
(ry
> その後、正常に送受信できるので無視してるのですが、
意味が分かりません。
0355352
2006/07/29(土) 19:55:56サーバー側のコードは
while( true ){
len = recv( buf );
if( len > 0 ) 受信したデータを処理
else if( len == 0 ) 終了処理
else if( len == -1 ){
if( WSAGetLastError() != WSAEWOULDBLOCK ) 例外投げるとか
}
}
省略させていただきましたが、このような感じです。
クライアント側で、
send( "ABC" );
とした場合、
サーバー側では、
1回目のループで正常に"ABC"と受信できました。
次のループでrecvは-1を返し、WSAGetLastErrorを見ると5が返ってくるのです。
その後、クライアント側で
send( "DEF" );
send( "XYZ" );
と送信処理を続けても、
サーバー側では二度とエラー( WSAGetLastErrorで5が返る現象 )は起きないんです。
あと、サーバー、クライアント両方でんagleアルゴリズムをオフにしています。
0356デフォルトの名無しさん
2006/07/29(土) 20:09:33↑をやると当然どこかおかしくなると思うけど、どんな対策が可能?
0357デフォルトの名無しさん
2006/07/29(土) 20:10:56http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp
0358デフォルトの名無しさん
2006/07/29(土) 20:12:29send()のエラーハンドリングをちゃんとやる。
WSAENOBUFS
ENOBUFS
0359デフォルトの名無しさん
2006/07/30(日) 02:52:09sendが戻ってこないか、EWOULDBLOCKかのどっちかじゃね?
0360デフォルトの名無しさん
2006/07/30(日) 10:28:59sendが長時間ブロックされることもありうるのね…
0361デフォルトの名無しさん
2006/07/30(日) 12:32:170362デフォルトの名無しさん
2006/07/30(日) 13:05:430363デフォルトの名無しさん
2006/07/30(日) 13:16:500364デフォルトの名無しさん
2006/07/30(日) 13:38:11夏だなぁ・・・
0365デフォルトの名無しさん
2006/07/30(日) 13:45:160366デフォルトの名無しさん
2006/07/30(日) 14:53:380367デフォルトの名無しさん
2006/07/30(日) 15:02:360368デフォルトの名無しさん
2006/07/30(日) 15:05:09ノンブロッキング: 結果を得るのに待たされない
関数呼び出しは、call/execute/returnの三つに分けられるが、
returnにexecuteの結果は含まれておらず、
executeの発行結果だけが含まれるのが非同期。
exeuteの結果は割り込みなどで別途得られる。
ノンブロッキングは、executeに時間がかかりそうなら、
「時間がかかりそうなので止めました」という結果をreturnする。
0369デフォルトの名無しさん
2006/07/30(日) 15:09:460370デフォルトの名無しさん
2006/07/30(日) 15:11:320371デフォルトの名無しさん
2006/07/30(日) 15:16:530372デフォルトの名無しさん
2006/07/30(日) 15:17:55>>368についてだとしたら、どのへんが嘘?
見たところ間違ってはいないと思うけど。
0373デフォルトの名無しさん
2006/07/30(日) 15:21:130374デフォルトの名無しさん
2006/07/30(日) 15:27:43じゃあそう思っとけばいいじゃん
0375デフォルトの名無しさん
2006/07/30(日) 15:29:500376デフォルトの名無しさん
2006/07/30(日) 15:39:13(asyncは非同期という意味)
文脈で使い分けるんじゃね?同期(型)通信とは言うけど、ブロッキング通信とは言わない。
0377デフォルトの名無しさん
2006/07/30(日) 15:40:47ブロック/ノンブロックはサ変動詞。
0378デフォルトの名無しさん
2006/07/30(日) 15:55:32どこがって、もう説明全体がイカサマ。
0379デフォルトの名無しさん
2006/07/30(日) 17:03:140380デフォルトの名無しさん
2006/07/30(日) 17:15:450381デフォルトの名無しさん
2006/07/30(日) 18:14:53じゃあ正しい説明書いてみたら
絶対にあーだこーだと言い逃れして書かないのは分かってるけど
0382デフォルトの名無しさん
2006/07/30(日) 18:21:32あまり使われてはないようだ@Google
"同期通信" の検索結果 約 38,200 件
"非同期通信" の検索結果 約 56,700 件
"ブロッキング通信" の検索結果 約 400 件
"ノンブロッキング通信" の検索結果 約 1,190 件
0383デフォルトの名無しさん
2006/07/30(日) 18:23:20ググレカス
0384デフォルトの名無しさん
2006/07/30(日) 18:29:40同期/非同期と
ブロッキング/ノンブロッキングは別の概念。
同期&ブロッキング
非同期&ノンブロッキング
同期&ノンブロッキング
は普通に使う。
Winsock関係やBSD socket関係のAPIにはないけど、
非同期通信で、受け側でブロッキングってのもある。
例えばHTTPでは、非同期かつブロッキングのプログラムを書く事が多い。
0385デフォルトの名無しさん
2006/07/30(日) 18:30:50ほらね。
ぐぐった説明が正しいという保証は?
0386デフォルトの名無しさん
2006/07/30(日) 18:35:21もう論理がめちゃくちゃなんだが、大きく違うところは受信の場合だな。
ブロッキングモードとノンブロッキングモードで大きく動作が異なるのは
受信すべきデータが到着していない場合。この場合、ブロッキング
モードはデータの到着を待つが、ノンブロッキングモードではすぐに
呼び出したAPIを抜ける。
受信すべきデータが到着している場合は、両者とも同じ動作をする。
ノンブロッキングモードだからといって「非同期に」データを読み取る
わけではない。
つか、マニュアル読めばわかるだろうが。
0387デフォルトの名無しさん
2006/07/30(日) 18:37:37えーと、今は非同期とノンブロッキングの違いの話をしているんですが。
0388デフォルトの名無しさん
2006/07/30(日) 18:40:09> 非同期通信で、受け側でブロッキングってのもある。
それって、受け側では同期通信とみなしてるってことでは?
0389デフォルトの名無しさん
2006/07/30(日) 18:40:160390デフォルトの名無しさん
2006/07/30(日) 18:41:020391デフォルトの名無しさん
2006/07/30(日) 18:44:14同期/非同期は概念。
ブロッキング/ノンブロッキングは手段。
でFA。
0392デフォルトの名無しさん
2006/07/30(日) 18:45:52意味もわからんかったりするのか?
0393デフォルトの名無しさん
2006/07/30(日) 18:46:03>>368と全然矛盾してないじゃん。
しかもあんたのは非同期はまったく説明できてない。
0394デフォルトの名無しさん
2006/07/30(日) 18:50:10ノンブロッキングモードでデータが到着しているときにrecvしたらどうなる?
0395デフォルトの名無しさん
2006/07/30(日) 18:52:52いや矛盾してるでしょ。
それに個人攻撃したいだけならよそでやってね。
0396デフォルトの名無しさん
2006/07/30(日) 18:56:31データ返すでしょ。
それは>>368と矛盾してないでしょ。
そのケースは説明してないだけで。(自明だからかな?)
0397デフォルトの名無しさん
2006/07/30(日) 18:58:43それなら>>368の説明で納得して終わりでいいんじゃないの?
てか、君わかってる人?わかってない人?
0398デフォルトの名無しさん
2006/07/30(日) 18:59:04具体的にどこが矛盾しているの?
たぶんそれを説明するとあなたの勘違いしている部分がはっきりすると思う。
0399デフォルトの名無しさん
2006/07/30(日) 19:00:08> もう論理がめちゃくちゃなんだが、大きく違うところは受信の場合だな。
どこが違うのか具体的に説明してね。
0400デフォルトの名無しさん
2006/07/30(日) 19:01:17矛盾してないなら、>>368も>>386も正しいってことだよね。
で、それ以上このスレで何をしたいわけ?
0401デフォルトの名無しさん
2006/07/30(日) 19:01:590402デフォルトの名無しさん
2006/07/30(日) 19:02:44ってか、お前>>368なんだろ?いい加減にしとけよ。
0403デフォルトの名無しさん
2006/07/30(日) 19:03:44勢いで書いちゃったんでしょう。あまり追い詰めるな。
0404デフォルトの名無しさん
2006/07/30(日) 19:06:16同期/非同期は概念。
ブロッキング/ノンブロッキングは手段。
でFA。
0405デフォルトの名無しさん
2006/07/30(日) 19:11:220406386
2006/07/30(日) 19:14:46すまん。
俺がひっかかったのは「時間がかかりそうなら」というくだり。
ノンブロッキングの場合は、「時間がかかりそうかどうか」で処理が異なることはない。
「時間がかかるかもしれないので」ノンブロッキングにするというなら話はわかる。
じゃ、俺はこの話から抜けるから。
0408デフォルトの名無しさん
2006/07/30(日) 19:29:01>>386 GJ
0409デフォルトの名無しさん
2006/07/30(日) 22:08:55ブロック/ノンブロックってのはAPIの関数実行に
必要な時間が可変か(ブロック)、わりと短い時間で固定か(ノンブロック)ってことで
同期/非同期ってのは相手処理が完了する時刻や
データ到着時刻と同じように影響するか(同期)そうじゃないか(非同期)
ってことでいい?
0410デフォルトの名無しさん
2006/07/30(日) 22:44:35誰かもっと具体的に説明して
0411386のまとめ
2006/07/30(日) 22:55:37嘘をつくな
378 :デフォルトの名無しさん :2006/07/30(日) 15:55:32
>>372 どこがって、もう説明全体がイカサマ。
386 :デフォルトの名無しさん :2006/07/30(日) 18:35:21
>>381 もう論理がめちゃくちゃなんだが、大きく違うところは受信の場合だな。
〜中略〜
つか、マニュアル読めばわかるだろうが。
395 :デフォルトの名無しさん :2006/07/30(日) 18:52:52
>>393 いや矛盾してるでしょ。
それに個人攻撃したいだけならよそでやってね。
397 :デフォルトの名無しさん :2006/07/30(日) 18:58:43
>>396 それなら>>368の説明で納得して終わりでいいんじゃないの?
てか、君わかってる人?わかってない人?
400 :デフォルトの名無しさん :2006/07/30(日) 19:01:17
>>398 矛盾してないなら、>>368も>>386も正しいってことだよね。
で、それ以上このスレで何をしたいわけ?
402 :デフォルトの名無しさん :2006/07/30(日) 19:02:44
粘着ウザ。 ってか、お前>>368なんだろ?いい加減にしとけよ。
406 :386:2006/07/30(日) 19:14:46
まあ冷静になって>>368を読み直したら、確かにめちゃくちゃは言い過ぎた。
すまん。
0412デフォルトの名無しさん
2006/07/30(日) 23:07:04ってか、この手の粘着、ほんとウザいわ
0413デフォルトの名無しさん
2006/07/31(月) 00:05:380414デフォルトの名無しさん
2006/07/31(月) 20:16:59struct sockaddr_inのsin_portに0を指定してbindした際、実際にどのポートが使われたか
調べるにはどうすればいいのでしょう?
実行後にsin_portに入るかと思ったんだけど、入ってない・・・
0415デフォルトの名無しさん
2006/07/31(月) 20:25:040416デフォルトの名無しさん
2006/07/31(月) 20:44:58できました!
ありがとうございます!
0417デフォルトの名無しさん
2006/08/01(火) 08:16:4510秒間にsendを100回とか大量に呼んでしまうとrecvが70回〜程度しか成功しません。
これってどうにかなりませんか?
0418デフォルトの名無しさん
2006/08/01(火) 08:48:21プロトコルはTCP? データは全部受信できているの?
なんか、送受信バッファとかsendの結果とか、チェックすべき項目がある気がする。
0419デフォルトの名無しさん
2006/08/01(火) 09:09:121秒間に1回sendを呼ぶとかなら全部受信できるんですが。。
単にsend呼ぶ回数が多すぎて失敗してるってことですかね?
仕事行ってきます(Winsockは初体験なんで戸惑い気味…
0420デフォルトの名無しさん
2006/08/01(火) 09:19:21いや、データが全部受信できているかって言うのは、「recvの回数」では分からないんだが。
recvの回数は、必ずしもsendの回数と同じになるわけではない。
単純に回数にこだわるのではなく、TCPの仕組みや、send/recvの送受信バイト数・エラーチェックなどを
見直してみると良いのでは?
0421デフォルトの名無しさん
2006/08/01(火) 15:52:54極端なことを言えば、100バイトのデータをsendを100回やって送ったとき、
recvは1回で100バイト受信したりすんべ?
0422デフォルトの名無しさん
2006/08/01(火) 19:50:52って文言みたことある?
0423デフォルトの名無しさん
2006/08/01(火) 22:54:50TCPはストリームプロトコルだから、
データの連続性は保障されてるけど、境界は保障されないよ
"This is a pen"
は
0424デフォルトの名無しさん
2006/08/01(火) 22:55:320425デフォルトの名無しさん
2006/08/01(火) 23:00:06とりあえず受信サイズを全部足す
0426デフォルトの名無しさん
2006/08/01(火) 23:11:30∩___∩ ∩___∩
♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶|
/ (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 今、どんな気持ち?
| ( _●_) ミ :/Shift+Enter:::::i:. ミ (_●_ ) | ねぇ、どんな気持ち?
___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____
ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/
/ /ヽ < r " .r ミノ~. 〉 /\ 丶
/ /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶
/ / ♪ :|::| ::::| :::|: \ 丶
(_ ⌒丶... :` | ::::| :::|_: /⌒_)
| /ヽ }. :.,' ::( :::} } ヘ /
し )). ::i `.-‐" J´((
ソ トントン ソ トントン
0427デフォルトの名無しさん
2006/08/03(木) 22:15:590428デフォルトの名無しさん
2006/08/05(土) 05:24:430429デフォルトの名無しさん
2006/08/05(土) 20:36:13同じプロトコル(リクエスト、レスポンス)を送信するって設計、問題あるでしょうか?
例えばクライアントはHELOリクエスト投げるし4XXレスポンス返すみたいな
サーバも同じようなことをする
0430デフォルトの名無しさん
2006/08/05(土) 21:27:10既存のオープンシステムとの連携を行うのであれば、そのオープン
システムが公開している規約に沿った形で電文の遣り取りを行う必要が
あるが、サーバー・クライアント双方を自前で作成するのであれば、
どのような会話手段を用いても問題ないと思う。
簡素な設計が一番。
0431デフォルトの名無しさん
2006/08/06(日) 00:58:19IRCがそれに近い。
しかしどのレスポンスがどのリクエストへの応答か判断するのが厳密にやるとむずい。
0432デフォルトの名無しさん
2006/08/06(日) 01:10:42問題ない
暗号化は忘れるな
0433デフォルトの名無しさん
2006/08/06(日) 01:13:460434デフォルトの名無しさん
2006/08/07(月) 13:13:56ソース晒せ
0435デフォルトの名無しさん
2006/08/07(月) 13:20:51問題ない。
リクエストかレスポンスか?
どのリクエストに対するレスポンスか? (トランザクションIDなど)
簡単に区別がつくようにしておいた方がいい。
それから接続状態の初期化にともなう処理について
よく考察した方がいいと思う。
0436デフォルトの名無しさん
2006/08/09(水) 19:06:27下のような質問をしたところ、「Content-Length ヘッダがあればそれを頼りに、
なければ接続が切れるまでがコンテントだぞ」と回答をいただきました。
その後、どうすれば接続が切れたことを確認できるのかわからなくて
もう一度質問したところお返事をいただけなかったので、今度はこちらの
スレでお尋ねすることにしました。
どなたか教えていただけるとうれしいです。
> 339 :デフォルトの名無しさん :2006/08/06(日) 22:14:15
> "Get /index.html HTTP/1.1"のような要求メッセージを送信して html の内容を
> 受け取るプログラムを作っています。
> 一応できましたが、タイミングによって途中までしか取得できないことがあります。
> マイナーな言語なのでソースをお見せして調べていただくことはできませんが、
> その原因がおわかりになる方がいらっしゃいましたら、どうぞご教示ください。
0437デフォルトの名無しさん
2006/08/09(水) 19:13:250438デフォルトの名無しさん
2006/08/09(水) 19:16:44read とか recv が 0 を返してきたらそこで受信できるデータは終わり。
0439436
2006/08/09(水) 19:25:54受信用の関数は受信した長さが返ってくるんですが、何も受信するものがなくなったあとは、
0ではなくその直前に受信したときの長さと同じ数値が返ってきてしまうんです。
でも考えてみれば、同じ数値が返ってきたときを終わりだと考えればいいですね。
やってみます。ありがとうございました!
(他の方法があれば教えてください)
0440デフォルトの名無しさん
2006/08/09(水) 19:39:42それわからなきゃどうしようもねえよ
ソース出せ
0441デフォルトの名無しさん
2006/08/09(水) 19:47:59それじゃあ基本的にはその関数を作ったトコに聞くしかないよ。
ここで聞いて答えが返ってくると思う神経がよくわからない(←不要な人格攻撃)
0442デフォルトの名無しさん
2006/08/09(水) 19:49:46うるせーよ、ソース坊
0443デフォルトの名無しさん
2006/08/09(水) 19:57:36せっかくTCP/IPは標準化されているのにわざわざ殺してる。
0444436
2006/08/09(水) 20:33:00私が使っているのはTCP/IPを利用するための関数ですよ。
簡単に利用できるように作られた関数だと思うので、実装が悪いのではなく
知識・能力の不足が原因だと思います。
>>440
ソースはご勘弁を。
言語に縛られない一般的な方法をお聞きしたかったんです。
C/C++ の方法でもいいんですけど。
0445デフォルトの名無しさん
2006/08/09(水) 20:43:06そんなこと言ったらこのスレの存在意義が…(ry ww
0446デフォルトの名無しさん
2006/08/09(水) 20:55:30ソースをそのまま出すのではなく、抜粋するなり、言語名を答えるなりすれば良いのに。
必要だと指摘されている情報を出さずに、答えだけを要求するとは。
スレの存在意義を言うのなら、その前に義務を果たせ。
>>444
言語に縛られない一般的な方法…。 readやrecvじゃだめなんでしょ?
疑似言語みたいにすれば良いのか?
とはいっても、マイナーな言語でのライブラリとやらに対応できるか分からないな。
C/C++の方法が適用できるのかも分からん。
>>439
> 同じ数値が返ってきたときを終わりだと
って、バイトストリームの途中で偶然同じバイト数を2回受信したときはどうするんだ?
0447445
2006/08/09(水) 21:30:50ちょ・・・オレは444じゃないぞー
0448436
2006/08/09(水) 22:16:35---------------------------------------------------------------------
timeout(変数) = 5000
条件分岐�@{[ネットワーク初期化の関数]を実行し、その返り値が0なら終了}
条件分岐�@終了
条件分岐�A{[ネットワーク接続を開く関数]を実行し、その返り値が真なら
以下の処理を実行/偽なら終了}
[文字列を送信する関数(リクエストメッセージを送信)]を実行する
待ち時間100ms
ループ
starttime(変数) = [コンピュータ起動後の経過時間を返す関数]
条件分岐�B{[受信可能なデータの状態を返す関数]を実行し、その返り値が
Raw Data を示していれば以下の処理を実行し、そうでなければ終了}
receivedsize(変数) = [データを受信する関数し受信サイズを返す]
↑ 5000Byteずつ受信
待ち時間100ms
data(変数) = data + 受信データ
条件分岐�B終了
elapsedtime(変数) = [コンピュータ起動後の経過時間を返す関数]- starttime
ループ終了(receivedsize < 5000Byte または elapsedtime > timeout の場合に終了)
[ネットワーク接続を閉じる関数]を実行する
条件分岐�A終了
data内の文字列を表示
終了
0449デフォルトの名無しさん
2006/08/09(水) 22:43:16頭が痛くなってきたw
0450デフォルトの名無しさん
2006/08/09(水) 23:07:46ぶっちゃけ、その簡単に利用できるように作られた関数を作った香具師はネットワークのスキルの無いクズだと思うよ。
ネットワークと言うかTCP/IPスタックの実装に依存するから、Cだからこれとか標準的な物は無いよ。
ネットワーク機能自体が歴史的にBSD系のUNIXでCで実装されてきたので、BSD系のTCPスタックの実装例が世の中には豊富。
なんとなくリングバッファが実装出来てなくていちいち受け取りにいく必要が有る悪寒。
0451デフォルトの名無しさん
2006/08/10(木) 00:01:18> 簡単に利用できるように作られた関数だと思うので、実装が悪いのではなく
根拠あるのか?
0452デフォルトの名無しさん
2006/08/10(木) 01:51:58初心者用の言語とかじゃないのか?
つーか、そんなことを問い詰めても解決しないだろ?
0453デフォルトの名無しさん
2006/08/10(木) 06:19:59つーか、そんなこと逝っているやつを問い詰めても解決しないだろ?
0454デフォルトの名無しさん
2006/08/10(木) 06:45:18そして未解決のまま、その事件は時効を迎えることになる。
0455446
2006/08/10(木) 09:09:31そうか、すまん。でも、煽るようなカキコはやめれ。
>>436、>>448
あやしいと思うのは、2つ。
まず、サーバーのレスポンスが遅いときがあるんじゃないの?
>>448の処理に「待ち時間100ms」とあるから、送受信の関数はおそらくブロッキングしないのだろう。
データを受信するループも、100ms待ちながら、受信関数を繰り返しているし。
"timeout"の値がいくつかは分からないが、レスポンスが遅ければ当然タイムアウトしてループは終了する。
次に、データの受信サイズ。
ループの終了判定を5000バイトより小さい場合としているのが気になる。
データがこまぎれになって送信されてきた場合は、正しく受信できないのでは。
ネットワークのことも考慮すると、5000バイトを一回で受信するんだ、
と考えないほうが良いと思う。
ということで、まずは以下のことを確認してみるとよいのではないかと。
1.その関数群の仕様を再度確認
パラメータや返ってくる値、ブロッキング、受信データの待ち方
>>448の状態だとネットワークと親和性が無いような感じだから、もう一度見直してみるといいと思う
2.現状のプログラムでタイムアウトの処理を確認
タイムアウト処理をコメントアウト、あるいはデバッガで実行
3.データの受信サイズを確認
デバッガで実行、あるいはそれぞれの受信サイズを記録できるように一時的に修正
4.待ち時間や受信データサイズの見直し
100msや5000バイトって、どこから出てきた数値?
2.と3.は、>>436の事象が発生しやすい環境で確認。
とりあえずは、これで。
0456446
2006/08/10(木) 09:21:47読み返してみたら、「サーバーのレスポンスが遅いとき」の説明が
よく分からん文章だった。
>>448の条件分岐3で、受信可能なデータの状態を返す関数の返り値がRaw Data
(おそらくは、これがデータ受信を示す)になるまでに時間がかかった場合に
タイムアウトする、ということで。
待ち時間100msも、謎なことは謎だが。
0457デフォルトの名無しさん
2006/08/10(木) 11:20:210458デフォルトの名無しさん
2006/08/10(木) 12:29:21受信するものがなくなったことを検知するための方法を他にも列挙せよ。
0459436
2006/08/10(木) 18:03:53わかりやすくまとめていただけてうれしいです。
今職場なのでまだ確認していませんが、3の問題のような気がしてきました。
帰ったら早速調べてみます。
>>458
それがわかっていれば質問はしません。
0460デフォルトの名無しさん
2006/08/10(木) 18:27:08send() したパケットが、分割されて recv() されることが有りえるんだよな?
0461デフォルトの名無しさん
2006/08/10(木) 18:28:57あり得る。
MTUという言葉を調べろ
0462436
2006/08/10(木) 19:39:44> 受信用の関数は受信した長さが返ってくるんですが、何も受信するものがなくなったあとは、
> 0ではなくその直前に受信したときの長さと同じ数値が返ってきてしまうんです。
と書きましたが、返り値の確認方法が間違っていただけでした。
全てのデータを受信した後はちゃんと0が返って来るのに、その確認がうまくできていませんでした。
>>455さんのアドバイスを読んで気付くことができました。
他のみなさんもどうもありがとうございました。
0463446
2006/08/10(木) 19:59:40まあ、良いか。早めに解決できてよかったね。
0464デフォルトの名無しさん
2006/08/10(木) 22:57:59死ね!
0465デフォルトの名無しさん
2006/08/10(木) 23:09:380466デフォルトの名無しさん
2006/08/11(金) 01:52:08accept()によって得られるTCPソケットのディスクリプタから、今のTCP状態を知る方法はないものでしょうか?
送信側からデータを送り終えた後のFINを検知して、受信側で出来るだけ早くclose()する
(=FINを送ってコネクション終了を相手にも伝える)ことを考えています。
そこで、TCPの状態がCLOSE_WAITならば直ちにrecv()とclose()を呼ぶ、という処理が実現できれば
いいかなと思いまして。
データを受信したものの、まだrecv()で吸い上げていないソケットを優先的に取り扱うなど
応用も利くと思うのですが、いかがでしょうか。
0467466
2006/08/11(金) 02:00:03補足です。
この質問をする前にnetstatコマンドのソースを見てみたのですが、/proc下のTCP情報が
入ったファイル(すみません、名前を忘れました)をsscanf()でパースして、現在の状態を取得していました。
確かにそれでも良いのですが、ファイルオープン〜サーチ〜sscanfとコストがかかりそうなので、
もうちょっと別な、直接的な方法は無いかと思って聞いた次第です。
0468デフォルトの名無しさん
2006/08/11(金) 08:47:31う〜ん。ブロッキングのrecv()を発行して待つとか、select()で待つとかじゃあダメなの?
ディスクリプタからTCP状態を取得する方法は思い浮かばないんだけど、もし出来たとして、
どのタイミングでソケットの状態を見に行くんだろう?
0469デフォルトの名無しさん
2006/08/11(金) 15:24:07なんでそんなことしたいのかよくわからんけど、
どうせ残りのデータは吸い上げないといけないんだから、
>>468 が言うようにひたすら recv() しまくって、
データがなくなったら即 close() でいいんじゃないの?
0470466
2006/08/12(土) 01:26:37>>468 >>469
返答ありがとうございます。
実は組み込みLinuxがターゲットのため、できるだけメモリ節約をしたかったからなのです。
送信が終わっているのにいつまでもコネクションを開いておくのは、受信バッファぶんのメモリが無駄になりますので。
かといってどんどんrecv()してしまうのも、メモリを浪費してしまいますし・・・。
(別モジュールへの橋渡しを担う部分のため、別モジュールの様子を伺いながらrecv()したデータを転送しなければならないのです)
というわけで、せせこましいですがポーリング用のスレッドを使ってFIN_WAITのソケットを潰して行こうと考えたわけです。
でも、どうも無理っぽいですね。色々と調べてまわったのですが見つかりませんでした・・・。
0471466
2006/08/12(土) 01:52:09すでにご存知であれば無視してください。間違っていたら指摘してもらえると嬉しいです。
いずれもLinux(2.6.11で動作確認)についてです。
1. backlogは「3way handshakeが終わり、データ通信可能になったコネクション」の保持可能な最大数を指定する。
2. 最大値はメモリ搭載量によって変化する。通常のPCだと1024だが、32MBのメモリだと128になっていた。
3. backlog内のコネクションは、accept()で取り出すまでに受信バッファサイズぶんのデータ通信を進めている。
(その後はaccept()〜recv()するまでウィンドウサイズに0を載せたACKを返し続ける)
4. backlogを超えるコネクション開設要求(SYNのこと)が届いた場合、SYN+ACKを返すものの後に届くACKやデータは全て無視する。
(データが届いても意味のないSYN+ACKを再送し続ける)
5. 受信バッファサイズをsetsockopt()で指定する場合、listen()前に指定しておかないといけない。
(listen()後やaccept()の後に指定しても、パケット上のWin値は変わらないことを確認)
上記のうち特に4.が問題で、クライアント側とサーバー側とでTCP状態のずれが発生してしまうことが分かりました。
実際に確認してみたら、確かにSYN+ACKを不用意に返していました・・・。
また5.も問題でして、これはつまり同じlisten()からaccept()したソケットの受信バッファは全て同じ値になってしまう、
言い換えると動的に受信バッファサイズを変えることができないことが分かりました。
というわけで、メモリ節約のために
「listen()前はbacklogを小さく&受信バッファを小さめにしておいて、accept()してから大きくしよう」
と思っていたのですが、出来ませんでした。
backlog指定を小さくするとコネクション異常でクライアント側はエラーになってしまいますし、
ウィンドウサイズを小さくするとその後の通信が細くなってしまいますし。
これは痛かったです。
0472デフォルトの名無しさん
2006/08/12(土) 08:24:26組み込み系はよく知らないのだけれども。
何と言うか、送信側〜>>466が作っているプログラム〜別モジュールの間の
流量のバランスが取れていない感じがする。
backlogを超えるコネクション要求が来たり、別モジュールの方が動作が遅そうだったり。
全体の流量、負荷を一回見直してみると良いのでは。
0473デフォルトの名無しさん
2006/08/12(土) 09:34:15> (listen()後やaccept()の後に指定しても、
> パケット上のWin値は変わらないことを確認)
すぐに反映されないだけでしょ?
window size指定しているわけじゃないから。
0474デフォルトの名無しさん
2006/08/12(土) 10:28:58> 上記のうち特に 4. が問題で、クライアント側とサーバー側とで TCP 状態の
> ずれが発生してしまうことが分かりました。
別にずれてはいないよ。サーバー側がクライアントからの ACK を無視してるだけ。
つまり通常の状態で、クライアントが ACK を送信してそのパケットがサーバーに
届いていない状態と同じ。
サーバー側は、(自分がドロップしているんだけど) ACK が届かないので、SYN+ACK
を再送しているのであって意味がないわけではない。
そのうちキューが空けば、クライアントからの ACK を受理して、双方ともに
ESTABLISH になるけど、空かない間は SYN+ACK の再送を繰り返してそのうちあきら
めて、RST を投げて終了する。
手元の Linux だと、
| tcp_synack_retries (integer; default: 5)
| passive な TCP 接続の SYN/ACK セグメントで再送を試みる最大数。
| この数値は 255 よりも大きくすべきではない。
で、この再送回数を制御できるみたい。
お使いのプロトコルスタックで使えるかどうかはわからんけど、調べ
てみては? ただし、システムで一律の値になるから気をつけて。
0475デフォルトの名無しさん
2006/08/12(土) 10:30:09ただ、>>472 も書いてる通りメモリ容量が厳しい状況でガンガンコネ
クション要求が来る状況がいまいちよくわからない。
ルーターなんかを作ってて本当にそういう状況になるなら出来合いの
プロトコルスタックなんか捨てて自分で実装するべきだと思う。
0476466
2006/08/12(土) 21:41:41>>473
いえ、その後もずっと反映されなかったのです。
20MB弱のデータを流してみて、accept()後のデータもEtherealでずっと追ってみたのですが変わりませんでした。
同じ書式でもlisten()前に記したsetsockopt()は有効になっているのですが・・・。
(複数人で同じソースを見直したので、(全員の目がふし穴でない限り)コーディングミスではないと思います)
でも、同じソースでもVxWorksだとすぐにウィンドウサイズが変わっています。
皆さんのLinuxだとaccept()後のウィンドウサイズって変わります?
# 書いてて気付いたのですが、もしかすると8KB→64KBといった大きい方への変更がダメなのかもしれない。
>>474
確かに、到着するパケットによる動作はお互い正常に動いていることは分かります。
ただ、もともと無視するSYNならわざわざSYN+ACKを返す必要は無いと思うんですよね。
クライアント側に「あ、コネクション張れた?」みたいな余計な期待を抱かせないで済みますし。(変な表現ですみません)
(このクライアントの誤解が後述する問題を生むことになりますし)
それならはじめからSYN+ACKなどを返さず、無視するなりRSTを返した方が良いと思うのですが、474さんはどう思います?
あ、ひょっとして再送エラーに至るまでの時間が(無視するより)短くなることを期待して返している??
あと、tcp_synack_retriesも教えていただいてありがとうございました。
実はこのパラメータは知っていたのですが、サーバー側のリトライを増やしても
先にクライアント側でエラーが発生してしまいますので、今回は使えませんでした。他にもTCPを使うモジュールもありますし。
言い忘れていましたが、クライアント側でエラーを起こしてもいけない、という条件があるのです。
0477466
2006/08/12(土) 21:43:18で、
>>472, >>475
なのですが、実はこの「がんがんコネクション要求が来る状況」って簡単に起こりうることなんですよ。
まず、次のようなケースを考えます。
クライアント側にデータ送信を担うキューがあって(プリンタに対するスプーラをイメージしてもらうと分かりやすいです)、
色んなアプリがそのキューにデータを投げ込む状況を考えたとします。
ただし、このデータはlisten()の時点で既に受信バッファで受信し切れてしまうほどのデータサイズだと仮定してください。
そのキューは、サーバーに対してデータを1つ1つ別コネクションで送ります。複数をパラレルに送信することはありません。
サーバーはデータを受信したら低速なデバイス(例えばフロッピーディスクなど)に書き込む処理を行います。
さて、このときキューはアプリからもらったデータをsend()で順次送信するわけですが、
サーバー側の受信サイズが大きいためも、accept()される前の時点でデータを送信し切ってしまいます。
すると「全てのデータは送信できた」とクライアントは判断しますので、close()をコール、つまりFINを送ります。
close()したということは、クライアントのTCPにとってはデータを無事送信できたことに他なりませんので、
次のデータを送信開始します。
以降はその繰り返しです。
このように、「close()できないコネクション要求がどんどん来る」という状況が
簡単に発生することが分かってもらえると思います。
(すみません、まだ続きます)
0478466
2006/08/12(土) 21:44:06更に、やがてサーバー側listen()のバックログを使い切ってしまいます。
しかしここでもサーバーはSYB+ACKなんて甘い言葉を返すものですから、
クライアントはデータを送信し始めてしまいます。で、送信エラーが発生します。
こうなると、もはや当初目的としていた「データは1つずつ順番に送る」という状況は崩れ去っているわけです。
というわけで、TCPでこの状況を回避するためにはlisten()時の受信バッファサイズを抑えておいて
クライアントに送信未完了のままKEEP ALIVEさせておくしかないと思います。
(どうか「アプリ層でコントロールシーケンスを付ければ良いじゃない」とかは言わないでくださいね。
それが出来ていたらこんなに苦労はしないのですから・・・)
やたら長くなってしまいました。すみません。
もしつっこみどころがあれば言ってください。
0480デフォルトの名無しさん
2006/08/12(土) 23:41:50そうするとクライアントは SYN が届いていないと思って、SYN を再送してくる。
サーバー側の都合のリトライをクライアント側に依存するのはちょっとおかしい
と思う。
> RSTを返した方が良いと思う
まあ、私も個人的には受け入れ能力がないんだからさっさと接続を拒否しろよな
と思う。特に Windows 系のクライアントは connect() で固まると GUI まで固ま
る作りの奴が結構いるから、とっととエラーにでもなってくれたほうがいいと思う。
で、要するに一回の送信で終わるぐらいのデータを送るのに毎回コネクションを
張ってるってことなの?
なんか、無理やりな状況作って TCP の実装がおかしいと言ってるだけのような気
がするけど…。
UDP を使うとか、コネクション張ったままにするとかはできないの?
0481デフォルトの名無しさん
2006/08/13(日) 01:19:58「backlogに入った状態」を無益なものというか、
「それは接続する気がないくせに無駄だ」考えに基づいて、
後から屁理屈をこねているように思う。
listen backlogに入った接続要求というのは、
接続をしてあげる予定だからこそ、拒絶しないのです。
それを「それくらいなら拒絶してくれた方がいい」というならば、
backlogの長さを0にすればいいんです。
いやサーバ側は変えられないんだということであれば、
クライアント側でタイムアウト処理を行いましょう。
0482466
2006/08/13(日) 01:24:14>>480
> サーバー側の都合のリトライをクライアント側に依存するのはちょっとおかしいと思う。
この視点は抜けてました。参考になります。
> で、要するに一回の送信で終わるぐらいのデータを送るのに毎回コネクションを
> 張ってるってことなの?
そうなんですよ。
何10MBという大きなデータが送られてくる場合もあるのですが、一番小さなサイズが10KB程度なので、場合によっては先の状況に陥る可能性があるわけです。
可能性があるものについては目を瞑るわけにもいかず・・・。
> なんか、無理やりな状況作って TCP の実装がおかしいと言ってるだけのような気がするけど…。
いや、すみません、TCPがおかしいと言っているわけではないんです(SYN+ACKを除いて)。
・・・でも、読み返すとそうとしか取れないような表現になってますね。読みにくいし。
素直にあやまります。すみませんでした。
個人的には重箱の隅の問題だとは思っているのですが、一般にはよくある話だったりしたら
怖くて、色々と書いてしまいました。
> UDP を使うとか、コネクション張ったままにするとかはできないの?
使いたいです!そうしたいです!
そうしたいのですが、クライアント側というのがWindowsの(ほぼ)基本機能なので
どうにもなりません・・・。アプリの設計問題をいかにTCPにカバーさせるか、という
手段しか持てないんですよ。納期まであと3日ですし・・・。
0483デフォルトの名無しさん
2006/08/13(日) 11:12:18> それを「それくらいなら拒絶してくれた方がいい」というならば、backlog
> の長さを0にすればいいんです。
君、論点がずれてる。backlog を超えた接続要求はもう接続できねーと言うもんだ
から拒否してもいい。昔の実装はそうなってた奴も多い。ただ Linux の実装はし
ばらくしたら空くかもしれないのでリトライしてるだけ。これは、backlog を 0
にすればいいとか言う問題じゃないよ。
0484デフォルトの名無しさん
2006/08/13(日) 11:13:13要は、アフォなクライアントがガンガンデータ送ってくるからどうすれ
ばいいの? って話かな。
まともにやるなら、クライアント側で SO_LINGER でも設定してもらえ
ばいいんだけど、そうはいかんザキなんだろうな。
送り元が流量も考えずに送りつづけるんだからサーバー側でスプール
作ってクライアントに追いつくようにガンガン recv() しまくるしかな
いと思うよ。(低速デバイスへの書き込みは別スレッドもしくは別プロセ
スでまたーりやればいい。)
> 個人的には重箱の隅の問題だとは思っているのですが、一般にはよく
> ある話だったりしたら
普通はあまりない。まともな技術者ならガンガン送るときにいちいちコ
ネクションを張るなんていう発想はしない。
> クライアント側というのがWindowsの(ほぼ)基本機能なので
ちなみにこれ何?
> 納期まであと3日ですし・・・。
おいおい…。
0485デフォルトの名無しさん
2006/08/13(日) 12:17:330486デフォルトの名無しさん
2006/08/13(日) 14:02:17winsockはwindowsの基本機能という観点からすれば
UDPもTCPでコネクション張りっぱなしも超基本機能なわけだが
0487466
2006/08/13(日) 21:46:29>>481
すみません、入れ違いになってしまいました。
backlogを0にすると「全てが拒絶していないようで拒絶している」という状態になり、クライアント側で送信エラーが発生してしまいますので・・・。ごめんなさい。
って、backlogが0でもlisten()は動くんですか?
屁理屈っぽくなっていたのは、本当にすみません。
> 要は、アフォなクライアントがガンガンデータ送ってくるからどうすればいいの? って話かな。
あはは、そんな感じです。鋭いですね。そしてガンガンrecv()したいです。メモリさえあれば・・・
> 普通はあまりない。まともな技術者ならガンガン送るときにいちいちコネクションを張るなんていう発想はしない。
これを10年前に作成した方々に言ってあげてください。
そこからクライアント、サーバー共に複数機種に派生し、それらとも互換性を
持つように動かさないといけないので、今更変えられないのです。
> ちなみにこれ何?
> windowsの基本機能って意味わからんな (>>486)
すみません、ここだけは勘弁してください。組み込み系で分かりやすいところなので、確実にバレます。
> なんか簡単にDoSで落せそうなサーバだな。
確かに。でも落とさない方が良いと思いますよ。
製品仕様(やイメージ上)LAN内でのみ使うものですので、いきなり
「犯人はこの中にいる!」状態になってしまいますから。
(でもSYN Flood防御のカーネルオプションは付けてます)
0488466
2006/08/13(日) 22:04:02socket(7)でも書いてあったのですが、SO_RCVBUFに指定した値は内部では2倍されて持つことになるんですね。見落としていました。
キャプチャデータを見ていると、どうもaccept()前に受信できているサイズが指定バッファサイズよりも大きいことに(今更)気付きまして・・・。
想定している最小データサイズだと、クライアント側で送信エラーが発生することが分かりました。
どうしよう、これ以上受信バッファを狭めるとaccept()後のスループットが落ちてしまう・・・
>>473さんへの返答でも書いたのですが、Linuxって受信バッファを途中で変えられないみたいなので、さて、困りました。
あぁ、>>484さんの、
> おいおい…。
が重くのしかかります。ぉぃぉぃ…。
0489デフォルトの名無しさん
2006/08/13(日) 23:13:32send() のエラーはリトライできないってことか?
プロトコルスタックを書き換えるぐらいしか思いつかない…。
0490466
2006/08/15(火) 20:41:51send()はエラーを出していると思います。
ただ、もともとが「エラーを出してはいけない」という要求なので・・・。
しかも、同じクライアント(PC)側ソースをWinXPで使用すると大丈夫で、Win98だとエラーになるといういやらしさ。
本当、プロトコルスタックの書き換えくらいしか思いつきません。
さて、ここまで皆さんありがとうございました。
皆さんからのそもそも話は非常に参考になりました。問題だけを追っていたら気がつかなかったことなので、ありがたかったです。
学んだことは次の製品(orファームアップデート)で活かそうと思います。
ありがとうございました。一応、ここで質問の流れは切ろうと思います。
(どうも製品仕様として収まりそうなので・・・)
何かコメントいただいた方には返信するようにしますが、こちらからの新展開はないと思います。
では皆さん、暑いので身体には気をつけてください。
ここまでのご助言、本当に感謝しています。
それでは。
0491デフォルトの名無しさん
2006/08/16(水) 09:36:41いまねっとプログラム作ってます
書いてあることがわかりました
0492デフォルトの名無しさん
2006/08/19(土) 08:35:05struct sockaddr_in sin;
のような記述を見かけるのですが、最初の struct はどういう意味でしょう?単に
sockaddr_in sin;
と書いた場合との違いは何なのでしょうか?
0493デフォルトの名無しさん
2006/08/19(土) 09:01:10死ねば良いと思うよ。
0494デフォルトの名無しさん
2006/08/19(土) 10:29:21それはネットワークプログラム特有の質問じゃなく、C言語の記述方法の質問だ。
スレ違いだから、C言語関連スレに行け。
さらにCについての疑問がなくなるまで、そうなだ・・・・最低半年はROMってろ。
0495デフォルトの名無しさん
2006/08/19(土) 10:52:520496デフォルトの名無しさん
2006/08/20(日) 12:40:46ソケット接続でサーバーと接続しているのですが、
サーバー側が接続を切ったかどうかわかる方法ってありますか?
recvとかsendする前に接続が維持されているかチェックしたいのですが・・・
0497デフォルトの名無しさん
2006/08/20(日) 14:02:140498496
2006/08/20(日) 14:18:05tcpです。
0499デフォルトの名無しさん
2006/08/20(日) 15:18:280500デフォルトの名無しさん
2006/08/20(日) 15:22:31クライアントから
・"-LOGIN test\n\n"
・"-PASS hoge\n\n"
・"(省略)\n\n"
とほぼ同時に送信した場合、サーバ側のFD_READをつかまえたときに
recv()の結果が "-LOGIN test\n\n-PASS hoge\n"
などとなってしまうことがあるのはTCP通信の仕様上仕方ないとは思うのですが
"\n\n"までが1つのデータとして受け取って、それ以降は次のデータとみなす
スマートな方法はないでしょうか。
0501デフォルトの名無しさん
2006/08/20(日) 16:01:240502500
2006/08/20(日) 16:52:29class CDataRecv {
char szBuf[MAX_SEND_LENGTH*2];
char szRecvBuf[MAX_SEND_LENGTH];
public:
char szLineBuf[MAX_SEND_LENGTH];
CDataRecv(void){szBuf[0] = szRecvBuf[0] = szLineBuf[0] = '\0';}
int Recv(SOCKET s){
int nRecvLen;
char *dem;
char szTemp[MAX_SEND_LENGTH];
nRecvLen = recv((SOCKET)s, (LPTSTR)szRecvBuf, sizeof(szRecvBuf)-1, 0 );
if(nRecvLen<0){return -1;}
szRecvBuf[nRecvLen]='\0';
strcat(szBuf,szRecvBuf);
dem = strstr(szBuf,"\n\n");
if(dem == NULL){
return 0;
}
strcpy(szTemp,dem+2);
dem[0] = '\0';
strcpy(szLineBuf,szBuf);
strcpy(szBuf,szTemp);
return strlen(szLineBuf);
}
};
0503デフォルトの名無しさん
2006/08/20(日) 22:05:22最近C#ばっかりでC++をだいぶ忘れてるが、さすがにもうちょっと
スマートに書けないか?
recv(受信データ);
バッファ += 受信データ;
while (バッファに"\n\n"あり) {
コマンド = バッファの先頭から最初の"\n\n"の手前まで;
バッファ = 最初の"\n\n"の直後からバッファの最後まで;
ディスパッチ関数(コマンド) ← コマンド処理;
}
概念的にはこんな感じで。
0504デフォルトの名無しさん
2006/08/21(月) 09:31:410505デフォルトの名無しさん
2006/08/21(月) 10:58:19http://pc8.2ch.net/test/read.cgi/tech/1153537081/
でも相談したんですが、特定の言語の話じゃないので、
こちらに書かせてもらいます。マルチになりますがすみません。
今、ストリーミングを再生・録音するソフトを作りたいと思っています。
できればC#かVB.NETで。。。
「Windows Media Player」や「Net Transport」もあるけど、
単純な機能だけに絞った再生・録音ソフトを自分で作りたいんです。
参考になる書籍とかサイトを教えていただければありがたいです。
開発を始めたら、一緒に情報共有していきたいです。(・∀・)
0507デフォルトの名無しさん
2006/08/21(月) 12:22:490508デフォルトの名無しさん
2006/08/21(月) 14:12:34おそらくmmsがらみのことになるんだろうが、
MSは仕様公開してないから厳しいだろう。
単にファイルに落とすだけなら
ヘッダー+WAVEデータでOKだから
UDPでパケット全部蓄積してから
ヘッダーに足しこんでローカル保存だな。
再生はわからんw
0509デフォルトの名無しさん
2006/08/21(月) 14:14:33Visual C++ 6.0
CAsyncSocketを使ってCreate();,Connect(SOCKADDR, sizeof(SOCKADDR));してるんだが
OnConnectのコールバックが数秒で来るホストと1分以上来ないホストがあるんだが、来ない場合のタイムアウト
処理はWM_TIMERとかを組み合わせて自前で行う必要があるの?
お願いします教えてください。
0510デフォルトの名無しさん
2006/08/21(月) 18:12:540511デフォルトの名無しさん
2006/08/22(火) 00:57:57たとえばクライアント側からデータを送って、データ受信確認のための応答をサーバ側に渡したいんですが
この場合でもソケットを繋ぎ直さずに送ることってできるんでしょうか?
0512デフォルトの名無しさん
2006/08/22(火) 02:14:380513デフォルトの名無しさん
2006/08/22(火) 05:09:35亀田乙
0514デフォルトの名無しさん
2006/08/22(火) 13:57:520515デフォルトの名無しさん
2006/08/22(火) 15:08:590516デフォルトの名無しさん
2006/08/23(水) 01:00:070517デフォルトの名無しさん
2006/08/24(木) 11:28:59とりあえずnetcatでも使ってみればいいんじゃね?
0518デフォルトの名無しさん
2006/08/24(木) 16:22:53HELLO
ときたら
OK
と返すプログラムが作るとしたら
HELLO
test
と送られてきた場合
いったん全部読むのが普通ですか?
0519デフォルトの名無しさん
2006/08/24(木) 17:05:25日本語でおk
場合によりけり。
0520デフォルトの名無しさん
2006/08/24(木) 19:04:59一行ずつ解析してフラグを作るの?
0521デフォルトの名無しさん
2006/08/24(木) 19:17:541からやりなおしてくれ
0522デフォルトの名無しさん
2006/08/25(金) 09:26:37"そういうのを作るプログラム"を作りたいのねw
0523デフォルトの名無しさん
2006/08/25(金) 11:08:32ネット上にあるのはサンプルばかりでわかりません。
どうやって終わりだと判断するのでしょうか?
例えば
HELLO\n
ときたら
recvして読み込んで
OK\n
と返すのですが
HELLO\nの後にもなにかくるかもしれないじゃないのですか?
でも なにもこないのにrecvすると止まらないですか?
0524デフォルトの名無しさん
2006/08/25(金) 11:10:380525デフォルトの名無しさん
2006/08/25(金) 11:27:00> HELLO\nの後にもなにかくるかもしれないじゃないのですか?
来ないから安心してw
0526デフォルトの名無しさん
2006/08/25(金) 12:03:46コード書いてくれません?
recvの戻り値でこない事とかわかります?
0527デフォルトの名無しさん
2006/08/25(金) 12:11:36もう来ないよープンプン\n
と送れ!
0528デフォルトの名無しさん
2006/08/25(金) 12:15:35> 確実に全部読み込むにはどうすれば?
> コード書いてくれません?
> recvの戻り値でこない事とかわかります?
recvが0を返すまで
http://www.nakka.com/lib/inet/func.html#recv関数
0529デフォルトの名無しさん
2006/08/25(金) 12:16:050530デフォルトの名無しさん
2006/08/25(金) 12:21:45え? recv() の戻りが 0 だからといって後続のパケットが無いわけじゃないのでは?
だからこそプロトコル毎に終端子とか、転送量を事前に通達するなんていうことが必要になるわけで…
0531デフォルトの名無しさん
2006/08/25(金) 12:29:270532デフォルトの名無しさん
2006/08/25(金) 12:31:47しておく。
0533デフォルトの名無しさん
2006/08/25(金) 12:33:37というか先にプロトコルを提示しなよ。
→HELLO\n
←OK\n
で終りなの?
ちなみに\nじゃなくて\r\nって明記した方がいいよ。
0534デフォルトの名無しさん
2006/08/25(金) 12:36:10上のほうのレス見ても、何を知りたいのかよくわからん
パケットを全て読み込みたいのなら、>>528の通りrecv()を戻り値が0になるまで繰り返すだけ。
まぁたぶん知りたいこととは違うんだろうけど。
0535デフォルトの名無しさん
2006/08/25(金) 12:37:010536デフォルトの名無しさん
2006/08/25(金) 12:38:49# RFC822 の line-feed があいまい杉。 後方で CRLF 出てくるから問題ないけど
0537デフォルトの名無しさん
2006/08/25(金) 12:41:45本当に\nだけかもしれない
0538デフォルトの名無しさん
2006/08/25(金) 12:43:33・\n が来るまではパケットが続く
・\n 以降のパケットは無視
ってところだな
recv() 1回目 "O" まで
しばらく recv() == 0
recv() 2回目 "K\n"
なんていう状況がありえるわけだし
0539デフォルトの名無しさん
2006/08/25(金) 12:46:41低能は黙ってろ。
0540デフォルトの名無しさん
2006/08/25(金) 12:53:08細かいところ突っ込むけど
ブロッキングならrecv()がデータ来るまで止まるし
ノンブロッキングなら-1かなにかでエラー返すんじゃなかったかな?
0を返すのはソケットがクローズされた時じゃない?
0541デフォルトの名無しさん
2006/08/25(金) 12:54:32\n出なければ正しく通らない低能の方がまとも。
0542デフォルトの名無しさん
2006/08/25(金) 12:55:46あ 0 は close か?
-1 (or ERROR) との比較と勘違いしてたかも
0543デフォルトの名無しさん
2006/08/25(金) 13:06:49HELLO\n
ときて OK\nと返すプログラムなんですけど
もしかしたら
HELLO\n
TEST\n
とくるかもしれない時がある時に
recvで確実に全部読み込む方法が知りたかったのです。
これは \n\nがきたら終了というふうにすればいいのですね?
0544デフォルトの名無しさん
2006/08/25(金) 13:09:39\n\n がきたら終了という処理をみさんはどのように書きますか?
while (1)
{
n=recv(s, buf, sizeof buf);
}
この場合
if (buf[n - 1] == '\n' && buf[n - 2] == '\n')
が普通ですか?
0545デフォルトの名無しさん
2006/08/25(金) 13:14:23かならずしも末尾に \n\n が来ることが保証できない
最悪 "\n" "\n" と2回に分断される可能性もある。
なので、自前でバッファリングし、recv() で得られた文字列を連結しつつチェックする
0546デフォルトの名無しさん
2006/08/25(金) 13:16:31> これは \n\nがきたら終了というふうにすればいいのですね?
そんな風に尋ねられても…\n\nってどこから出てきたの?
プロトコルで規定されてるの?
> この場合
> if (buf[n - 1] == '\n' && buf[n - 2] == '\n')
> が普通ですか?
nが1だったらまずいね
recv()で受信したデータは別のバッファに突っ込んだらどうかな
0547デフォルトの名無しさん
2006/08/25(金) 13:17:120548デフォルトの名無しさん
2006/08/25(金) 13:35:48HELLO
まで送ってだんまりかも
よってタイムアウト処理を組み込まざるを得ない。
0549デフォルトの名無しさん
2006/08/25(金) 13:45:150550デフォルトの名無しさん
2006/08/25(金) 15:02:490551デフォルトの名無しさん
2006/08/25(金) 15:34:340552デフォルトの名無しさん
2006/08/25(金) 15:59:56WinAPIにそんなのあったっけ
0553デフォルトの名無しさん
2006/08/25(金) 19:01:22ねーy・・・あるあるあるwwwwwwwww
ま、一番カンタンなのはrecv()用にスレッド作るか
非同期にしてメッセージ受け取るかしたらいいんじゃないですか
0554デフォルトの名無しさん
2006/08/25(金) 20:32:00さっぱりです。
0555デフォルトの名無しさん
2006/08/25(金) 20:45:090556デフォルトの名無しさん
2006/08/25(金) 21:16:52なんで今日は初歩的な話題でこんなに盛り上がってるんですか?
0557デフォルトの名無しさん
2006/08/25(金) 21:21:56上の方にも書いてたように stdinで同じことできるくらい
ストリームについて基本的な理解がないと
コードうpしてもさっぱりだとおもうよおもうよ
0558デフォルトの名無しさん
2006/08/25(金) 21:34:23ようするに recv で 1byteづつ取り入れて\nがきたらリターンする
ラッパーを作ればいいのですね?
fgets()のように
0559デフォルトの名無しさん
2006/08/25(金) 21:40:020560デフォルトの名無しさん
2006/08/25(金) 22:21:12"HELLO\n"程度のプロトコルならそれでいいでしょ。
一バイトごとにrecvしな。ただしタイムアウト付きで。
0561デフォルトの名無しさん
2006/08/25(金) 22:24:170562デフォルトの名無しさん
2006/08/26(土) 00:05:50鯖とか作って大量にデータ送るような用途ではネットワーク負荷を考慮して実装しないと痛い目をみるよ。
ルータは処理しきれなくなるとあっさり捨てるから、送り直しで大変なことに成る。
無視するかどうかチェックするわけが有るので、大量にパケット送りつけるとDoS成立。
0563デフォルトの名無しさん
2006/08/26(土) 10:19:13Nagleアルゴリズムって知っているか?
0564デフォルトの名無しさん
2006/08/26(土) 10:47:420565デフォルトの名無しさん
2006/08/26(土) 10:54:451対1のオセロ作ってるんですけど
対戦用のスレッドを作って順番に
send recvしていますが、これはおかしいですか?
send() // 自分が置いたコマの位置を送信
recv() // 相手が置いたコマの位置を受信
send()
recv()
送信用 受信用スレッドを作るのが宝石ですか?
0566デフォルトの名無しさん
2006/08/26(土) 10:58:13いいかげんにしろよ
0567デフォルトの名無しさん
2006/08/26(土) 11:10:54windowsのテルネット(telnetのポートではなく各サービスのポートで)で接続すると
送られてきた奴は即座に表示してくれるし
入力された文字は即座に送ってくれる。
あれってどうやってやってるの?
常に相手から送られる繰るのを監視して、
自分のも常に送られるようにしてる。
しかも相手が切断したら即座にテルネット側も気づいて切断されたって表示する。
どうやってるの?
0568デフォルトの名無しさん
2006/08/26(土) 11:33:28http://cvsup.pt.freebsd.org/cgi-bin/cvsweb/cvsweb.cgi/src/contrib/telnet/telnet/sys_bsd.c?rev=1.12&content-type=text/x-cvsweb-markup
*ring*()ってのは、eventのring bufferを操作する関数。(ring.c)
main loopはtelnet.cのtelnet()
0569デフォルトの名無しさん
2006/08/26(土) 12:18:14別におかしくないと思うけど、それだと相手からのデータ待ちの時に
ユーザーから操作ができなくなるので、受信スレッドを別に作ること
が多い。
>>567
・キー入力 ⇒ send()
・recv() ⇒ 画面表示
の2個のスレッドを作るなり、OS によってはキー入力とネットワーク
の監視を同時にできるものもあるからそれ使うなりすればいい。
0570デフォルトの名無しさん
2006/08/26(土) 14:33:080571デフォルトの名無しさん
2006/08/26(土) 14:57:34このアプリケーション作ったPG、もうアフォかと。
0572500
2006/08/26(土) 20:42:38今日は時間が空いたので考えてみました。
とりあえずWsaAsyncSelectを使用して
class CDataRecv{
string sBuffer;
public:
SOCKET s;
int Recv(){
int nRecvLen;
char szTemp[SERVER_SEND_LENGTH+1];
nRecvLen = recv((SOCKET)s, (LPTSTR)szTemp, SERVER_SEND_LENGTH, 0);
if(nRecvLen < 0) return -1;
szTemp[nRecvLen] = '\0';
sBuffer += szTemp;
return nRecvLen;
}
(続く)
0573デフォルトの名無しさん
2006/08/26(土) 20:46:17char *Output(char tmp[]){
char *szBuf;
char *p;
int nLen;
nLen = sBuffer.size();
szBuf = new char[nLen+1];
strncpy(szBuf, sBuffer.c_str(), nLen);
szBuf[sBuffer.size()] = '\0';
p = strstr(szBuf,"\r\n");
if(p==NULL){
sBuffer = szBuf;
tmp = NULL;
delete(szBuf);
return tmp;
}
p[0] = '\0';
sBuffer = p+2;
strcpy(tmp,szBuf);
delete(szBuf);
return tmp;
}
};
のクラスを作って、FD_READを受け取った時点で一度Recv()を実行し、
Output()がNULLを返すまで受信メッセージの処理を繰り返すというやり方で
今のところ落ち着きました。まだまだ良いアイデアを教えていただけたら嬉しいです。
連レスすみmせn
0574500
2006/08/26(土) 20:55:41Connect()とかClose()ももちろんあるんですがここでは関係ないので省略しました。
わかりにくくてすみません。
あと>>502で\n\nになっていたデリミタですが\r\nに変更したので上のコードでは
\r\nになっています。
スレ汚し本当に申し訳
0575デフォルトの名無しさん
2006/08/26(土) 21:59:55RFCは難解で難しすぎます
0576デフォルトの名無しさん
2006/08/26(土) 22:12:09つ http://pc8.2ch.net/php/
0577デフォルトの名無しさん
2006/08/26(土) 23:37:28Studying HTTPと@IT
0578デフォルトの名無しさん
2006/08/27(日) 06:06:14ネットワークと関係ないけど、
せっかくstring使ってるんだからstringのメソッド使うともっとシンプルに書けると思う
0579デフォルトの名無しさん
2006/08/27(日) 10:04:46読めばさらりと分かるほど簡単じゃない。簡単と思うような説明は難しいことは省かれてるだけ。
HTTP/0.9の実装とかね。
0580デフォルトの名無しさん
2006/08/27(日) 11:05:05だからまずはそういう説明が欲しいって言うことなんだろ。
難しいところを省くのも芸のうちだよ。
0581デフォルトの名無しさん
2006/08/27(日) 13:50:550582デフォルトの名無しさん
2006/08/27(日) 14:36:36RFC読んだけど細かい部分は読んだ奴の勝手な解釈になるってことがわかった
仕様書は細かい部分までしっかり書こうな>RFC書いた馬鹿
0583デフォルトの名無しさん
2006/08/27(日) 16:17:35やはり各ソケット毎にスレッドを作るのが当たり前ですか?
0584デフォルトの名無しさん
2006/08/27(日) 16:19:27チャット如きにスレッド使わないと思います。
0585デフォルトの名無しさん
2006/08/27(日) 16:21:31何か>>500っぽい書き方だな。
まあ、とりあえずは一回自分で作って試してみては?
0586デフォルトの名無しさん
2006/08/27(日) 16:37:25スレッド使わないと糞ソフトですがww
0587デフォルトの名無しさん
2006/08/27(日) 16:38:10スレッド使わないと糞ソフトですがww
0588デフォルトの名無しさん
2006/08/27(日) 16:44:31同意
ノンブロッキングで、来たものを全員に回すだけだしな
何か重いことやるならスレッド起こしたいが
チャット程度ならなあ
0589デフォルトの名無しさん
2006/08/27(日) 16:52:14タイムアウトはどうするんだ?ww
0590タイムアウトって何の?
2006/08/27(日) 17:00:230591デフォルトの名無しさん
2006/08/27(日) 17:07:42接続数と障害対策次第。
漏れだとソケット10個くらいならスレッド起こさない。
0592デフォルトの名無しさん
2006/08/27(日) 17:09:220593デフォルトの名無しさん
2006/08/27(日) 17:09:49別人です
0594デフォルトの名無しさん
2006/08/27(日) 18:27:520595デフォルトの名無しさん
2006/08/27(日) 18:46:560596デフォルトの名無しさん
2006/08/27(日) 21:48:33良いサンプルを見つけることができずに、なかなかうまく
行きません。
どこかに良いサンプルないでしょうか?
LinuxでもWindowsでもOKです。
0597デフォルトの名無しさん
2006/08/28(月) 01:50:48> なかなかうまく 行きません。
何をどれだけ試したのか書け。
> LinuxでもWindowsでもOKです。
・・・
0598デフォルトの名無しさん
2006/08/28(月) 02:14:08わらたw
0599デフォルトの名無しさん
2006/08/28(月) 07:24:10brainf*ckかwhitespaceかな。
0600デフォルトの名無しさん
2006/08/28(月) 19:16:100601デフォルトの名無しさん
2006/08/28(月) 20:51:21チャットサーバー作って5年の俺がマジレス。
クライアントサーバー型、OSはWindowsと勝手に解釈して説明すると、
サーバー側
これはクライアントごとにスレッド作る必要はない。スレッドを作ると
かえって面倒になる。何でかというと、チャットサーバーというのは
あるクライアントから来たデータを各クライアントに配信しなければ
ならないからです。ソケットごとにスレッド立てるとその辺の制御が
めんどくさいのです(不可能というわけではない。俺も初期のころは
スレッドの勉強ついでにそういうやり方でやってた。しかし、プログラムが
やや複雑になるのでおすすめできません)。
特殊なものでない限りせいぜいチャットなんて10人まででしょうから、
パフォーマンスもへったくれもありません。堂々とselect使ってくださいw
なお、サーバ側は無理にGUIにしなくても、コンソールで十分です。
クライアント側
なんでもお好きな方法で。GUIと相性のいい非同期だと楽。
0602デフォルトの名無しさん
2006/08/28(月) 23:04:010603デフォルトの名無しさん
2006/08/29(火) 01:42:280604デフォルトの名無しさん
2006/08/29(火) 07:20:11NIC2枚さしのPCで、自作クライアントアプリを動かすと、自分のPCのIPアドレス(NIC)を指定しなく
ても、下層で判断して通信してくれるようですが、
アプリケーションのほうで、通信対象となるNICの指定はできないものなのでしょうか?
0605デフォルトの名無しさん
2006/08/29(火) 07:25:42どうしたらいいのだ?
0606デフォルトの名無しさん
2006/08/29(火) 09:07:56bind
0607デフォルトの名無しさん
2006/08/29(火) 10:17:330608デフォルトの名無しさん
2006/08/29(火) 21:00:21> 通信対象となるNICの指定はできないものなのでしょうか?
・ソースアドレスにしたいのか、そのNICからパケットを出したいのか?
・OS
によってやり方が違う。
0609デフォルトの名無しさん
2006/08/29(火) 21:40:36> winsockで
> スレッドで
> recvしてブロックしてる状態で
まず、その変な日本語をどうにかしなよ。
0610604
2006/08/30(水) 00:48:43ありがとうございます。そのとおりでした。
また、他の質問なのですが、自作のサーバープログラム(VB6)から、これまた自作のクライアント
プログラム(VC++2005)に、TCP/IPで60000バイトのデータを、タイマーイベントを利用して周期的
に送り、クライアント側は単に受信するだけで何もしない(受信のみして捨てるだけ)ようにしたところ、
それでも、タイマー周期が30msくらい短くなると、転送がおいつかなくなるんですが、
こんなものなのでしょうか?
サーバーの送信を停止後、イーサーリアルを起動し、送信停止後、数十秒に渡ってパケットが
転送されていたのを確認しました。
あと、各送信時に送信完了を待たずに次々と60000バイトのパケットを送ると逆に大きな
遅延になったりしますか?今自宅のため確認できませんが、たしか待ちが入っていなかった
かもしれません。
cpuは共に3.0GHzでメモリも1G、イーサーネットはハブを含めて100M以上(片側のpcはギガ)
です。
0611610
2006/08/30(水) 00:50:470612デフォルトの名無しさん
2006/08/30(水) 01:00:21肝心の値が・・・
0613デフォルトの名無しさん
2006/08/30(水) 01:01:12TCP ウィンドウサイズ スロースタート とかでググってみれ。
0614610
2006/08/30(水) 01:12:39受信があった場合、ReciveCallbackという関数が自動的に呼ばれる仕組みを用いています。
あと、LINKは100Mbpsになってました。
0615デフォルトの名無しさん
2006/08/30(水) 01:30:09どういうこと?
0616デフォルトの名無しさん
2006/08/30(水) 02:41:060617デフォルトの名無しさん
2006/08/30(水) 03:16:570618610
2006/08/30(水) 07:19:41すみません。転送がおいつかなくなるとうのは適切でないかもしれません。
ただ、受信側は受信(ReciveCallback発生)があったら、変数にコピーするのみで、データを
使って何か計算するような思い処理を行っておらず、
また、>>610にも書きましたとおり、サーバーの送信を止めると、イーサーリアルでは数十秒
に渡ってパケットが流れているため、クライアントの受信処理が遅いのではなく、パケットの
到達が遅いのではと考えたんですが....
意味不明だったらすみません。今日、会社で続きやります。
0619デフォルトの名無しさん
2006/08/30(水) 07:26:22> サーバーの送信を停止後、イーサーリアルを起動し、送信停止後、数十秒に渡ってパケットが
> 転送されていたのを確認しました。
これってパケット数が多すぎて表示するのに時間かかってるだけじゃ?
60000byteが秒間30回ほどの周期で数十秒となると、送信バッファ何十MBもってるんだよって話になる。
転送が追いつかない場合はsendがエラーを返すので、そのあたりをチェックすればいいと思う
0620デフォルトの名無しさん
2006/08/30(水) 08:05:33ん〜、「数十秒に渡ってパケットが転送」っていうのは、どういう状況だろう?
例えば、送信プログラム・Ethereal・受信プログラムのそれぞれのログ(時刻、送受信バイト数など)は、
どう対応しているのか? (>>619の言うとおり、表示にかかる時間じゃなくて、送受信の時刻そのものを確認)
パケットは、どんな種類があるのか?
MTUに分割された複数のパケットが転送されて、再送されて…、なんてことは無い?
あとは、>>619も書いているけど、sendとrecvはエラーを必ずチェックすること。
sendがエラーになっているのに、チェックしていなかったからプログラムが正常終了したと
思ってしまった、ってことが無いように。
0621610
2006/08/30(水) 23:27:19どうもありがとうございます。
今日会社でいろいろやってみたところ、サーバーのほうが、送信完了(SendComplete)
を待たずに次々と送っていたため、サーバーアプリ上における送信したことを示す表示と、
実際の送信に時間差が生じていたようでした。
0622622
2006/08/31(木) 21:22:11winsockを使って、
A端末⇔B端末という、UDPベースの送受信プログラムを作成しているのですが、
A→B端末はOKでも、B→A端末へのパケット送信ができません。
Etherealというパケットキャプチャリングソフトを使って調べたところ、
やはりB→A端末へのパケットがキャプチャできていないようです。
なにが、原因なんでしょうか・・・やはりプログラムなんでしょうか?
0623デフォルトの名無しさん
2006/08/31(木) 21:27:040624デフォルトの名無しさん
2006/08/31(木) 21:38:300625622
2006/08/31(木) 21:45:21A端末、B端末ともファイアウォールは切断してあります。
0626デフォルトの名無しさん
2006/08/31(木) 22:36:42ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=33221&forum=7&start=8
>ばーど 投稿日時: 2006-08-31 22:03
>す、すごい。
>そういう所もチェックしてるんですね!
>ん〜、分かりました。
>もう少し焦点を絞って、再度質問させて頂きます。
お前馬鹿だろ?
0627デフォルトの名無しさん
2006/08/31(木) 22:47:230628デフォルトの名無しさん
2006/09/01(金) 00:16:23まあ今のままじゃ、エスパーが降臨しない限り誰も答えられないほどに情報が少ない。
0629デフォルトの名無しさん
2006/09/01(金) 08:01:41一応、>>626のリンク先を流し読みした。けど、情報少ない〜。
まずは一回、A→B→A端末の通信じゃなくて、B→A→B端末の通信が出来るかどうか、
A端末とB端末のプログラムを逆にして試してみ。pingが通っていることだし。
>>622もリンク先で言っている通り、B端末側で「Aから送信されてきたパケット内に含まれている
IPアドレスからA端末側のアドレスを取得」が、うまく出来ていないのかもしれない。
デバッガで1ステップずつ変数の中身も含めて確認してみるのも、1つの手だぞ。
0630デフォルトの名無しさん
2006/09/01(金) 08:47:040631デフォルトの名無しさん
2006/09/01(金) 19:56:120632デフォルトの名無しさん
2006/09/01(金) 20:14:090633デフォルトの名無しさん
2006/09/02(土) 00:49:22ProgA,Bとも
�@スレッド作成。
�Aそのスレッドでは、
while(1){
recv(buf);
enqueue(buf,queue);
}
�Bメインスレッドでqueueからデキューしてメッセージを解析、それに応じた処理などを行う。
sendでメッセージをおくる処理など。
※queueはキューでヒープ領域に作成して�A、�Bの両スレッドからアクセスできるようにしておく。
※queueはスレッドセーフにする。また、CPUリソースを消費しないようcond変数のシグナリングでwake upさせる機構を導入する。
「非同期メッセージパッシング、ActiveObject、
0634デフォルトの名無しさん
2006/09/02(土) 07:46:38ノンブロッキングモードを使うんだ
0635デフォルトの名無しさん
2006/09/06(水) 03:17:530636デフォルトの名無しさん
2006/09/06(水) 03:18:280637デフォルトの名無しさん
2006/09/06(水) 11:35:03前もってチェックしてもいいし、sendの返り値をチェックしてもいいし。
ただ事前チェックでokでもサイズによってはsend失敗する場合もあるから、
事前チェックが必要なければ後者だけでいいと思うが。
0638デフォルトの名無しさん
2006/09/08(金) 01:35:56いまどきSelectでポーリングとか、ノンブロッキングで強引に突破とか、マルチスレッドでごり押しとか、ダサ過ぎ。
0639デフォルトの名無しさん
2006/09/08(金) 01:54:460640デフォルトの名無しさん
2006/09/08(金) 15:25:160641デフォルトの名無しさん
2006/09/08(金) 17:28:050642デフォルトの名無しさん
2006/09/08(金) 18:46:07ダイアログでIPユーザ名ポート等を入力→ウィンドウでチャットとしたいのですが、
WSAAsyncSelectの第2引数をウィンドウの方のハンドルにすると非同期化に失敗してしまいます。
ダイアログの方のハンドルにすると成功するんですが、イベント処理させたいのはウィンドウの方なのでこれはマズいですよね・・・ 何か方法はないでしょうか。
あと、ソケットを人数分用意する方法なんですが、あらかじめ接続人数MAX分ソケットを用意するという方法しかないですよね?
(一人接続してきたらまた一つソケットを宣言みたいなのは無理なんで)
それとサーバ側もクライアントになって自分のサーバに繋ぎに行く方法にしてるんですが、まずい方法でしょうか?
初歩的な事が多いですがどなたかお願いします。
0643デフォルトの名無しさん
2006/09/08(金) 19:43:310644デフォルトの名無しさん
2006/09/08(金) 19:51:45DialogBoxParam()
0645642
2006/09/08(金) 20:55:46ハンドルに値が入るタイミング考えたら成功するようになりました。
これで何とかなりそうです。ありがとうございました。
0646デフォルトの名無しさん
2006/09/08(金) 23:07:21underflow が発生したときに、ブロックして受信を待つようなものなら簡単なんですが、ブロックせずに完了通知を待つような場合
iostreamとは相性が悪いのでしょうか。
なんか、車輪の再発明をしているような気もする。。
0647デフォルトの名無しさん
2006/09/08(金) 23:41:50その場合って、やっぱ通信部は別スレッドで処理すんの?
0648デフォルトの名無しさん
2006/09/09(土) 06:51:480649デフォルトの名無しさん
2006/09/09(土) 08:02:540650デフォルトの名無しさん
2006/09/10(日) 00:30:53Meももう終わってるよ
0651デフォルトの名無しさん
2006/09/10(日) 02:17:249598って何の事か分からなかった。
95,98なのか。もう大昔のように感じて寂しい・・
0652デフォルトの名無しさん
2006/09/10(日) 03:43:410653デフォルトの名無しさん
2006/09/10(日) 04:04:37ないってことだけはないと勝手に思ってるけど
0654デフォルトの名無しさん
2006/09/10(日) 04:51:210655デフォルトの名無しさん
2006/09/10(日) 13:55:22受信バッファ不足や送信バッファ過多の場合にブロックするか例外をだすかしかない。
0656デフォルトの名無しさん
2006/09/10(日) 14:04:200657デフォルトの名無しさん
2006/09/10(日) 14:30:25とかは、(さすがに後発だけあって)よく考えられていると思うよ。
標準的に使えるようになれば楽そうだけどね。
0658デフォルトの名無しさん
2006/09/10(日) 20:58:46サーバで起動してnetstat -aで状態を見ると、
localhost:適当なポートA→指定したポート
localhost:指定したポート→適当なポートA
という感じで接続をしています。
これはサーバ起動後、クライアントと同じ挙動をして127.0.0.1にconnectという感じで動いていると思っていいんでしょうか?
0659デフォルトの名無しさん
2006/09/10(日) 22:05:14思っていいですよ
0660デフォルトの名無しさん
2006/09/11(月) 18:05:17ども。色々納得しました。
0661デフォルトの名無しさん
2006/09/11(月) 20:06:14相手のデータ転送が終わった事を知るにはどうすればよいのでしょうか?
バイナリー(byte)転送とテキスト(asciiか互いが共通の文字コード))転送で
その方法はどこか違うのでしょうか?
どうぞよろしくお願いします。
0662デフォルトの名無しさん
2006/09/11(月) 20:15:24・プロトコルを考えましょう
・テキストはMSが残した大罪
0663デフォルトの名無しさん
2006/09/11(月) 21:00:23kwsk
0664デフォルトの名無しさん
2006/09/11(月) 21:39:490665デフォルトの名無しさん
2006/09/11(月) 21:49:55接頭辞法 とかでぐぐればでるよ
0666デフォルトの名無しさん
2006/09/11(月) 21:59:46>>664 よろしければ、一緒にオレ様プロトコルを作りませんか?
0667デフォルトの名無しさん
2006/09/11(月) 22:30:33勘違いしてない?
OSごとの改行コードの違いを吸収するか否かだよ
0668デフォルトの名無しさん
2006/09/11(月) 22:32:270669デフォルトの名無しさん
2006/09/11(月) 22:38:52>>668 結構古いことをご存知ですね。
0670デフォルトの名無しさん
2006/09/11(月) 23:42:500671デフォルトの名無しさん
2006/09/11(月) 23:58:160672デフォルトの名無しさん
2006/09/11(月) 23:59:08基本的にソケットには終端を付ける機能はないので、受信側で終端を検知することはできません
例えばHTTPプロトコルだとContent-Lengthというヘッダにデータサイズを乗せることで
終端検出しています
同じように送るデータにデータサイズを含めて送り、受け取った側がすべてのデータが揃ったことを
検知し、ソケットをクローズする
送り手は相手のクローズを検知し、送信が終了したことを知るといった方法しかありません
接続を維持したままでしたら、受信側にすべて届いたときになにかを送り返すようにして
送信側はrecvでブロックしておいて、受信完了メッセージ待てばいいです
0673デフォルトの名無しさん
2006/09/12(火) 00:48:27SOCK_SEQPACKET
0674デフォルトの名無しさん
2006/09/12(火) 02:18:39標準的な手法や仕組みがどうなっているのか気にかけていました。
的確は指摘には、のどにあったツッカエが取れたように嬉しいです。
ありがとうござます。
>>673 System (OS) からのメッセージは、奥が深いです。
0675デフォルトの名無しさん
2006/09/12(火) 02:20:33対話型なら CRLF あたりが終端子になること多いかもね
0676デフォルトの名無しさん
2006/09/12(火) 02:50:54テキストでの対話型(ASCIIやUTF16とかテキストデータの送受信)
なら終焉記号はそれ(\r\n)でも(0x00..0x19とか)何でもいいです。
一応オレ様プロトコルと仮定してですけど・・・・
バイナリーでの対話型(データ転送)で、終わりを明示したかったのですが、
終焉記号でやるより素直にサイズでやります。
テキストのように終焉記号じゃ無理です。
ところでシグナル?(例外?)もいいですね。
0677デフォルトの名無しさん
2006/09/12(火) 13:20:230678デフォルトの名無しさん
2006/09/12(火) 13:54:110679デフォルトの名無しさん
2006/09/12(火) 14:33:13昔はよくエスケープシーケンスを使いましたね。
ESC EOT → お終い
ESC ESC → ESC
など。RS-232C上のプロトコルに多かった。
0680デフォルトの名無しさん
2006/09/12(火) 15:30:160681デフォルトの名無しさん
2006/09/12(火) 16:16:15>>679 参考になります。シリアル通信に目をつけるととは、先人の知恵が満載でしょう。
0682デフォルトの名無しさん
2006/09/12(火) 17:31:18頭悪いね
0683デフォルトの名無しさん
2006/09/12(火) 18:40:12バイナリでエスケープシーケンス?
0684デフォルトの名無しさん
2006/09/12(火) 18:48:21という策もアリだと思うけど。
具体的なデータ長が、データ転送初期段階で確定しないような場合とかね。
0685デフォルトの名無しさん
2006/09/12(火) 18:55:33それと、「データ」だけ微妙に大きかったりして。
0686デフォルトの名無しさん
2006/09/12(火) 19:55:40多くの人に理解しやすいし説明せずに済む場合も多いし。
前出の長さ出力(テキストだからエンディアン問題なし)とか
ヘッダとボディ(データ)の区切り
長さが決まってない場合のchunk(あるいは強制切断)
それと、(厳密にはhttpじゃなくてCGIだけど)
POST時の空白や+や%等のエスケープの仕方とか。
0687デフォルトの名無しさん
2006/09/12(火) 20:19:260688デフォルトの名無しさん
2006/09/12(火) 20:26:260689デフォルトの名無しさん
2006/09/12(火) 20:40:43>>687 1byteといわず1bitずつチェックする方がいいと思うけど・・
今の時代とか高速大容量とか関係ないよ。
15年前はシリアルで有線
10年前はモデムで56000 bpsだったよね・・
10年後は1秒で地球何十週の速さと容量が民間へ
15年後は衛星から無線転送(GPSみたい)とかじゃないか?
それでもどこかで1byte(1bit)づつチェックすることには変わりないから。
0690デフォルトの名無しさん
2006/09/12(火) 20:41:38リナックスでもBSDでもオープンソラリスでも好きに探せば
0691デフォルトの名無しさん
2006/09/12(火) 20:42:100692デフォルトの名無しさん
2006/09/12(火) 20:45:44ビットマップ転送になると、バイナリ流したはずですぜ。
# LP-xxxx 系だったかな?
0693デフォルトの名無しさん
2006/09/12(火) 21:04:48通信チップが勝手にやるのとメインCPUでぶん廻すのとは違うよね
0694デフォルトの名無しさん
2006/09/12(火) 21:10:190695デフォルトの名無しさん
2006/09/12(火) 21:11:070696デフォルトの名無しさん
2006/09/12(火) 21:14:070697デフォルトの名無しさん
2006/09/12(火) 21:15:260698デフォルトの名無しさん
2006/09/12(火) 21:20:48あらかじめ来るサイズが分かってたら、メモリの確保量とか受信拒否とかいろいろ出来る
よってサイズを頭に付けるのが一番効率がいい
0699デフォルトの名無しさん
2006/09/12(火) 21:47:220700デフォルトの名無しさん
2006/09/12(火) 21:59:06>>693 やっている事は同じだけど、感じ方が違うかな。
面倒でも自分でやるのか、面倒だから専門チップに任せるのかの違いはあっても、
チェックはしないとね。
旧来の(通信)技術を博物館や図書館のように展示しておいて欲しい。
本だと希少とか絶版とかで入手困難だと気軽に見学できない。
0701デフォルトの名無しさん
2006/09/12(火) 22:02:33蟹チップかよ!
0702デフォルトの名無しさん
2006/09/12(火) 22:06:047bit JIS かわいそす
0703デフォルトの名無しさん
2006/09/13(水) 01:51:15それならhttpをそのまま使った方がいい。
libhttp系のライブラリ使って。
Content-Length: スタイルのやり方は、うまくいけばいいけど、
間違った「長さ」を渡された時のリカバリなど、
自前で作ると結構手間がかかる。
自作して泥沼になるくらいならエスケープの方がずっとまし。
ちなみにSolaris 2.5.1のCDE Mailアプリは、
Content-Length: があると、From行を無視して、優先して扱うので、
間違った「長さ」のメールがあるとmbox形式スプールを壊してしまった。
// From行エスケープで二文字増えたのを調整しないMUA/MTAが当時あったから。
0704デフォルトの名無しさん
2006/09/13(水) 02:19:160705デフォルトの名無しさん
2006/09/13(水) 07:31:17> 10年後は1秒で地球何十週の速さと容量
光速越えてしまいます.
0706デフォルトの名無しさん
2006/09/13(水) 11:21:25量子通信が実用化されてるということじゃなかろうかw
0707デフォルトの名無しさん
2006/09/13(水) 11:36:51ここは亜空間通信でせう。
0708デフォルトの名無しさん
2006/09/13(水) 11:43:02ところで、亜空間通信でもやっぱり先頭にはデータのサイズあるのかな?
0709デフォルトの名無しさん
2006/09/13(水) 12:21:08もっとも亜空間通信も不可能性通信も結局はTCP/IPをカプセル化して使うんだろうけどね
0710デフォルトの名無しさん
2006/09/13(水) 13:26:150711デフォルトの名無しさん
2006/09/13(水) 13:42:140712デフォルトの名無しさん
2006/09/13(水) 15:23:050713デフォルトの名無しさん
2006/09/13(水) 15:31:570714デフォルトの名無しさん
2006/09/13(水) 15:55:000715デフォルトの名無しさん
2006/09/13(水) 16:04:28httpでPOSTとかPUTとか使って送ってしまうのと、WinSockで独自プロトコルで組んでしまうのでは、どちらが効率いいでしょうか?
新たに組むほどの価値があるならばWinSockで組んでしまおうかと思うのですが、
httpdだとリジューム出来ないのが困りものです。
ちなみに、FTPは今のところ考えていません。
0716デフォルトの名無しさん
2006/09/13(水) 16:05:17> httpdだとリジューム出来ないのが困りものです。
出来ます。
0717デフォルトの名無しさん
2006/09/13(水) 16:08:24できません。
0718デフォルトの名無しさん
2006/09/13(水) 16:22:250719デフォルトの名無しさん
2006/09/13(水) 16:28:21HTTPリクエストにRangeも指定できるし。
0720デフォルトの名無しさん
2006/09/13(水) 16:29:160721デフォルトの名無しさん
2006/09/13(水) 16:57:57>HTTPリクエストにRangeも指定できるし。
は?
0722デフォルトの名無しさん
2006/09/13(水) 17:12:12開発スピードはクライアント側だけ作ればいいHTTPを使ったほうが早い
通信速度はHTTPだと多少のオーバーヘッドはあるものの、全体のサイズが数Mということであれば
ほとんど変わらない
0723デフォルトの名無しさん
2006/09/14(木) 18:37:470724デフォルトの名無しさん
2006/09/14(木) 18:50:45サーバーからクライアントに向けてhttp requestすれば
resumeもできるだろうけど
0725デフォルトの名無しさん
2006/09/14(木) 18:53:340726デフォルトの名無しさん
2006/09/15(金) 00:27:34短い文字のチャットは勉強したところですが、
winsock,TCPで大きなファイルの送信について質問です。
linuxのサーバにも送信してみたいと思います。
「SIZEごとにfreadで読み込んで送信」というふうに考えているんですが
方針として下記のようなコードで考えていけば良いでしょうか?
while((n = fread(Buf,1,SIZE,filep)) != 0) {
send(socket, Buf, (int)strlen(Buf), 0);
}
あとは、
・データが順番どおり届いているのか
・届いていないデータがあるのかどうか
など自分で実装しないといけないでしょうか?
ネットワーク初めてなので、自分で決まりを考えて実装するのは
ちょっと自信がありません。
・"もっと簡単な方法"や"書籍"、"参考になるHPページ"など
ありましたらよろしくお願いします。
0727デフォルトの名無しさん
2006/09/15(金) 01:05:49・sendの返り値をちゃんと見ろ。
番外
・freadしただけなのに、strlen? n使えよ。
0728デフォルトの名無しさん
2006/09/15(金) 01:21:18>・TCPだから順番入れ代りはない。
TCPがデータの届いた順番や確認をしてくれるっていうのは、
こういうことだったんですね。
>・sendの返り値をちゃんと見ろ。
>番外
>・freadしただけなのに、strlen? n使えよ。
的確なアドバイスありがとうございます。
また何かありましたら、よろしくお願いします。
0729デフォルトの名無しさん
2006/09/15(金) 05:56:24データとノイズ?が交じっていてもチェックできなかったようだけどさ!
0730デフォルトの名無しさん
2006/09/15(金) 05:59:12それい言っちゃお終いでしょ。
映画のタイトルも、「ざ・カビ」 「ざ・バクテリア」に変わっちゃうしさ。
0731デフォルトの名無しさん
2006/09/15(金) 07:46:54ファイルの長さを測るのなら、strlen()は避けたほうがいい。
バイナリファイルだと、途中に0があった場合、長さを間違うぞ。
0732デフォルトの名無しさん
2006/09/15(金) 09:23:37原因知らないと気づくまで、すごく時間が
掛かりそうですね。
すごい感謝です。
0733デフォルトの名無しさん
2006/09/15(金) 12:11:040734デフォルトの名無しさん
2006/09/15(金) 12:21:24よく知らないことを書き込まなくていいから。
初心者が混乱するので。
0735デフォルトの名無しさん
2006/09/15(金) 13:43:350736デフォルトの名無しさん
2006/09/15(金) 13:48:17ちゃんと書かないと取りこぼすのは本当。
0737デフォルトの名無しさん
2006/09/15(金) 15:12:530738デフォルトの名無しさん
2006/09/15(金) 15:26:240739デフォルトの名無しさん
2006/09/15(金) 16:32:280740デフォルトの名無しさん
2006/09/15(金) 16:41:240741デフォルトの名無しさん
2006/09/15(金) 21:17:47認証だけ丸見えにしないようにするならDigest認証もあるよ
0742デフォルトの名無しさん
2006/09/15(金) 22:47:520743デフォルトの名無しさん
2006/09/15(金) 23:27:58よく知らないことを書き込まなくていいから。
初心者が混乱するので。
0744デフォルトの名無しさん
2006/09/16(土) 00:19:540745デフォルトの名無しさん
2006/09/16(土) 01:46:09下記のソースだとどのへんにどのような処理を加えればよいでしょうか。
マルチスレッドではないノンブロッキングの方法は勉強しました。
よろしくお願いします。
if(pthread_create(&ChildThread,NULL,Send,(void *)NULL)==0){
//親スレッドをセットしました
ParentThread=pthread_self();
while(1){
//受信処理繰り返し
if(Rcev()==-1){
break;
}
}
pthread_kill(ChildThread,SIGINT);
pthread_join(ChildThread,&th_return);
}
else{
return -1;
}
0746デフォルトの名無しさん
2006/09/16(土) 05:59:010747デフォルトの名無しさん
2006/09/16(土) 08:32:13Rcev()とかいう関数内でselect()したら?
0748デフォルトの名無しさん
2006/09/16(土) 12:04:570749デフォルトの名無しさん
2006/09/16(土) 12:09:52マルチスレッドでタイムアウトの処理のサンプルが
見つからないのでどうしていいか全くわかりませんでした。
簡単に考えればいいんですか。
>>747
>オーバーラップドI/Oだろ。
>いまどきSelectでポーリングとか、ノンブロッキングで強引に突破とか、マルチスレッドでごり押しとか
っていうレスがあったので、マルチスレッドだとなにか特別な方法があるの
かと思ってしまいました。
Rcev()内でselectを使えばいいですか。
selectもう一回調べてみます。
ありがとうございました。
0750デフォルトの名無しさん
2006/09/16(土) 12:12:380751デフォルトの名無しさん
2006/09/16(土) 12:16:160752デフォルトの名無しさん
2006/09/16(土) 12:29:19MD5興味あるんだけどさ、SHAとかもあって調べるの面倒なので教えてくれないか。
現実的な時間って、MD5で破られるのにどれくらいかかるの?
細かい事はなしでいいからさ、何ヶ月とかだったけ?
0753デフォルトの名無しさん
2006/09/16(土) 12:34:34http://slashdot.jp/security/04/08/18/0257220.shtml?topic=28
0754デフォルトの名無しさん
2006/09/16(土) 13:04:09md5は8時間で敗れるぞ
0755デフォルトの名無しさん
2006/09/16(土) 14:24:25素直にもっと強度の高いSHAとか選べばいいと思うんだが
なんで今MD5なんか選ぶのかな
0756デフォルトの名無しさん
2006/09/16(土) 14:38:420757デフォルトの名無しさん
2006/09/16(土) 14:40:04PC性能が上がるか、スーパーコンピュータか、分散コンピュータを使うともっと短い
0758デフォルトの名無しさん
2006/09/16(土) 17:01:26C++暦4年、MFC、STLは使い慣れてます。
0759デフォルトの名無しさん
2006/09/16(土) 17:47:460760デフォルトの名無しさん
2006/09/16(土) 17:57:54目安になった。さんくす。
>>757
今の性能でも破られるまで、30分ぐらいもてばいいんじゃないか?
最低限でも、せいぜい30秒は欲しいけど。
サイズにもよるけど、
今のPC性能でもxor暗号は30分ぐらいは持ってほしいけど、無理か。
0761デフォルトの名無しさん
2006/09/16(土) 20:23:18C+ 4年もやっててソケットプログラミングしたことないのか?
0762デフォルトの名無しさん
2006/09/16(土) 20:28:42まあxor暗号でも鍵の運用がワンタイムパッドなら最強だけどね
0763デフォルトの名無しさん
2006/09/16(土) 21:02:41ハッシュと暗号を同列に語るのはどうか
0764デフォルトの名無しさん
2006/09/16(土) 23:31:32なんか強い電波でも受信されましたか?
0765デフォルトの名無しさん
2006/09/16(土) 23:41:55MD5やSHAはハッシュだが
0766デフォルトの名無しさん
2006/09/16(土) 23:49:20>>762 ああ、それそれ。
>>763 MD5をハッシュ・キーにしてるんでしょうか。
キー生成のコストはいかがですか?
>>764 なんか強いパケットでも....
0767デフォルトの名無しさん
2006/09/16(土) 23:51:30そうではなく、MD5やSHAはハッシュ関数の一種
http://ja.wikipedia.org/wiki/MD5
http://ja.wikipedia.org/wiki/SHA
0768デフォルトの名無しさん
2006/09/17(日) 00:39:050769デフォルトの名無しさん
2006/09/17(日) 02:30:35いらいらするわ
夏休み終わっただろ糞がきども
さっさと寝ろ
0770デフォルトの名無しさん
2006/09/17(日) 02:47:570771デフォルトの名無しさん
2006/09/17(日) 03:34:200772デフォルトの名無しさん
2006/09/17(日) 06:47:04暗号の素人が加えた「改良」のせいでかえって破りやすくなることなんていくらでもあるのに
0773デフォルトの名無しさん
2006/09/17(日) 07:28:130774デフォルトの名無しさん
2006/09/17(日) 07:30:36じゃあ独自のハッシュ関数で以下のハッシュが得られました
fa09
たった4桁ですどうぞ最初のパスを解読してください
0775デフォルトの名無しさん
2006/09/17(日) 10:31:54こういうのがレベル低いってやつか
hashからメッセージを復号することはできない
hashに対する「攻撃」は、同一のhashを生成するメッセージの発見に尽きるわけだが。
(もとのメッセージと同一である必要はない)
0776デフォルトの名無しさん
2006/09/17(日) 10:42:21同じじゃなくていいから、今私の手元にしかないハッシュ関数で同値をはじき出す
鍵を解読してください
0777デフォルトの名無しさん
2006/09/17(日) 11:02:46「非公開のあなたのハッシュ関数」にランダムな入力を与えた場合に、偶然一致する確率は1/65536
「公開されている逆算不可能なハッシュ関数」にランダムな入力を与えた場合に、偶然一致する確率は1/65536
もちろん、逆算不可能というのが大前提だけどね。
0778デフォルトの名無しさん
2006/09/17(日) 11:07:550779デフォルトの名無しさん
2006/09/17(日) 11:08:10馬鹿なの?
0780デフォルトの名無しさん
2006/09/17(日) 11:09:50そもそもこの馬鹿にもの言ってるだけだからね
0781デフォルトの名無しさん
2006/09/17(日) 11:12:20>>772-774の流れとはぜんぜん無関係で意味不明、意図がわからん
何が言いたいのだお前は?
0782デフォルトの名無しさん
2006/09/17(日) 11:13:13ソースはいらんから、その関数をどっかで実行できるようにしてくれ。
0783デフォルトの名無しさん
2006/09/17(日) 11:14:22サーバ間通信のログでいいかな?
0784デフォルトの名無しさん
2006/09/17(日) 11:18:17無理だなw
サーバでも盗むか?
0785デフォルトの名無しさん
2006/09/17(日) 11:21:010786デフォルトの名無しさん
2006/09/17(日) 11:26:010787デフォルトの名無しさん
2006/09/17(日) 11:51:350788デフォルトの名無しさん
2006/09/17(日) 12:43:130789デフォルトの名無しさん
2006/09/17(日) 13:31:250790デフォルトの名無しさん
2006/09/17(日) 13:46:340791デフォルトの名無しさん
2006/09/17(日) 13:47:12お前のことだよ>低レベル
0792デフォルトの名無しさん
2006/09/17(日) 13:54:300793デフォルトの名無しさん
2006/09/17(日) 13:55:48>>788-789
>>791
こいつらがスレ汚しか。
今年のお前らは、海にも行ってないだろ。
0794デフォルトの名無しさん
2006/09/17(日) 16:11:01ジーオンデュアルなら1分も必要なくパスワード生成できると思う。
0795デフォルトの名無しさん
2006/09/17(日) 16:28:140796デフォルトの名無しさん
2006/09/17(日) 16:30:16お前の言ってることは、それもSHA-1と同じコストで算出できると言ってるわけだが
それならやってみろよw
ペンタゴンに動いてるものをくださいと言って見ろよw
0797デフォルトの名無しさん
2006/09/17(日) 16:50:59| ○ | r‐‐、
_,;ト - イ、 ∧l☆│∧ だが断る!
(⌒` ⌒・ ¨,、,,ト.-イ/,、 l
|ヽ ~~⌒γ⌒) r'⌒ `!´ `⌒)
│ ヽー―'^ー-' ( ⌒γ⌒~~ /|
│ 〉 |│ |`ー^ー― r' |
│ /───| | |/ | l ト、 |
| irー-、 ー ,} | / i
| / `X´ ヽ / 入 |
0798デフォルトの名無しさん
2006/09/17(日) 16:52:550799デフォルトの名無しさん
2006/09/17(日) 16:53:56お前いい加減に2ch卒業しろよ
0800デフォルトの名無しさん
2006/09/17(日) 17:36:39ttp://pc8.2ch.net/test/read.cgi/tech/1088530204/
こっちいけ。
0801デフォルトの名無しさん
2006/09/17(日) 18:49:390802デフォルトの名無しさん
2006/09/18(月) 00:00:09int msec = 1;
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&msec, sizeof(msec));
1ミリ秒に設定してもrecv()が終了するまで500ミリ秒くらいかかるので
すが、そういうもんなんでしょうか?
0803デフォルトの名無しさん
2006/09/18(月) 00:26:44目的を言え
0804デフォルトの名無しさん
2006/09/18(月) 00:28:240805デフォルトの名無しさん
2006/09/18(月) 00:42:06どういうつもりで目的を聞きたいのか、
その意図がなんか危ない人のようだ。
もしかしてそういう偉そうな事を言うのは、
オレの代わりに全部を引き受けてくれるのか?
0806802
2006/09/18(月) 01:06:58一応どのくらいまで短くできるのか確認しておきたいのです。
0807デフォルトの名無しさん
2006/09/18(月) 01:35:150808デフォルトの名無しさん
2006/09/18(月) 08:18:21きっちり調べずにカキコ。
Windowsのタイマーって、どこまでの精度だったっけ?
確か10msくらいじゃなかった?
あと、正確にタイマーの時間で返ってくるわけじゃないはず。
メッセージのキューの状態とか、CPUが忙しいとか、そういった要素で
変わってくるはず。
タイマーの値は「最低限その時間が過ぎた」ということを示すだけだったような。
推測ばっかりで、すまん。
0809デフォルトの名無しさん
2006/09/18(月) 09:22:49recvが500msぐらいかかる
というのが分かっているんだったら、
timeoutも500ms程度の単位にしとけばいいんじゃないの?
それ以下、たとえば10msにするとして、
10ms単位で動かしたい別のタスクがあるの?
もしそうならループのつくりを変えたほうがいいと思う
0810802
2006/09/19(火) 00:18:01>>808
指定した時間で正確に返ってくるのではないんですねぇ。
タイマーを試してみましたが、SetTimer()も同様に正確ではありませんでした。
timeSetEvent()はかなり精度がよかったです。
>>809
話がとんでる気がしますが…。
1msと設定しても500ms程度かかるが、これが正しい動きであるかが知りたかったのです。
今回は30sを想定しているので特に問題はないです。
ありがとうございました。
0811デフォルトの名無しさん
2006/09/20(水) 23:59:11そのなかで、WINDOWS XPにおけるOSで実装されたウィンドウサイズの機能と、
アプリケーション側からの制御のしくみがよくわかりません。
基本的にまずTCPの場合はウィンドウサイズの調整がスループットに効いてくると思います。
そこで様々な通信アプリの振る舞いをETHEREALで確認してみました。
XPの場合レジストリにウィンドウサイズの記述がありませんが、この場合64KBまで自動調整して
くれるようです。ただし、アプリケーション側によりウィンドウサイズパラメータ(正確にはSO_RCVBUF)を
いろいろと変化させてみても、WINDOWSが追従する範囲は16KB〜64KBまでの範囲です。
アプリで8KBに設定すると64KBでアドバタイズされます。レジストリでウィンドウズスケール
オプションを有効にすると、64KB以上に調整することは可能ですがアプリが側で64KB以下の設定をしても
反映されません。
MSのサイトには優先度の高い順として
1. 接続の SO_RCVBUF WinSock オプション。
2. インターフェイス別の TcpWindowSize レジストリ設定値
3.グローバル TcpWindowSize レジストリ設定値
4. NDIS により報告されたメディアのビット レートに基づく自動判定。
のように記載されており、アプリの制御が最も優先度が高いはずなのですが思ったとおりに追従してくれません。
その理由について教えていただければ助かります。
いろいろなFTPソフトのやりとりをETHEREALで覗いてみると、TCPヘッダのウィンドウサイズのやりとりに
違いが無いにも関わらず(例えばクライアント32KB、サーバ64KB)、TCPMONでみたスループットの振る舞いが
大きくことなるものがあります。
根本的にウィンドウソケットバッファ(SO_RCVBUF)の制御は、直接TCPヘッダのウィンドウサイズに反映できる
と思っている私の考えはあっていますか?それとも、パケットキャプチャでは見えないメモリ上のやりとりを制御
しているのでしょうか?
0812デフォルトの名無しさん
2006/09/21(木) 00:09:45確認できる関数があると聞いたのですが、
それは何という関数ですか?
winsock2.h の recv(…) で取得したソケットが
まだ生きているのか否かを確認して、
死んでいたらスレッドを終了させるようなプログラムを
作りたいのですが・・・
0813デフォルトの名無しさん
2006/09/21(木) 01:06:20遅延のあるネットワークは諦めるなり、遅延を受け入れて遅延しても問題無いようにアプリを作るしか無い。
遅延がある時点で、ル−タが懸命に遅延しても良いからバッファリングして流そうとがんばっていて負荷がかかってるのに、余計に負荷かけたらあっさりパケット廃棄されるだけ。
0814デフォルトの名無しさん
2006/09/21(木) 01:36:00セッションが終了してたらrecvにエラーが帰り益男
0815デフォルトの名無しさん
2006/09/21(木) 07:01:19MSDNのsetsockoptのSO_RCVBUFの説明にあるように、
SO_RCVBUFの値と、TCP Window Sizeは無関係。
Window sizeがどこまで上がるかってのは、レジストリで上限値を設定できる
だけで、あとはOS任せ。
0816デフォルトの名無しさん
2006/09/21(木) 07:49:43糞プログラマがTCP windowをコントロールすると、
(部分的でも)経路を共有している他の接続を圧迫するプログラムを書いて迷惑なので、
> 直接TCPヘッダのウィンドウサイズに反映できる
こういうことはできない。
どうしてもやりたければ、TCPのパケット(セグメント)を自分で作って送ること。
やりかたは、http://www.kt.rim.or.jp/~ksk/wskfaq-ja/advanced.html を熟読。
>>6あたりも。
0817sage
2006/09/21(木) 15:23:36連続して実行しているとたまに
クライアント側:java.net.SocketException: Connection reset
サーバ側:ヘッダー箇所しか受信していなくデータ部を受信していない(受信データが欠落している)
というような現象が発生します。
クライアント<->サーバ間の問題??と思うのですが、
証拠がないのでしっくり来ません。
データが通信途中で欠落してしまう原因はなにかあるのでしょうか?
0818デフォルトの名無しさん
2006/09/21(木) 15:24:31orz
0819デフォルトの名無しさん
2006/09/21(木) 18:17:17自前のJavaプログラムが単にlistenしてるだけ?
それともApache?
0820デフォルトの名無しさん
2006/09/21(木) 20:11:19JavaのSocketクラスを知らない俺がカキコ。
まったく見当違いのことを言っていたらすまん。先に謝っておく。
クライアント側がリセットされているんだから、サーバの動作を調べてみたら?
サーバ側がどんなやつなのかは分からないが、例えば、ヘッダーのデータが変だったから
データチェックエラーになって、コネクションをリセットしたとか。
サーバ側、クライアント側ともにメッセージは出力しないの?
あと「データが途中で欠落してしまう」は、どうなんだろうね。
その、ヘッダー箇所しか受信していないっていうのは、どうやって判断したの?
上にも書いたけど、単に1回recvして(その時点で全データの途中まで受信して)、
ヘッダーのデータが変だったから、そこで処理終了なんて場合はないんだろうか。
その場合とかだと、データが途中で欠落しているのではないわけで。
0821820
2006/09/21(木) 20:15:13なんか、サーバ側でコネクションをリセットするケースを調べたほうが
早いような気がしてきた。
連続カキコ、すまん。
0822デフォルトの名無しさん
2006/09/21(木) 22:49:35・クライアントがPOSTするデータのサイズに嘘ついてる
・サーバがPOSTされたデータのサイズの解釈を誤っている
とか
HTTP なら Ethereal でモニタしてみれば原因はすぐわかると思うが。
0823811
2006/09/22(金) 01:22:10情報ありがとうございます。本日もいろいろと調べたところ
SO_RCVBUF does not necessarilly correspond to the size of TCP receive window
なる文書をMSDNで見つけました。
ということで、以下のように無理やり理解したのですが誤っていればご指摘ください。
ソケット処理なのでTCP処理の直後に位置することから、OSが制御するTCP処理を
直接制御することはできない。TCP受信ソケットバッファ(SO_RCVBUF)とは、OSが用意
するウィンドウサイズバッファに含まれるデータをアプリケーションに引き渡すプロセス
で利用する中間バッファである。よって、OSのウィンドウサイズ調整が適切なものに
なっていると仮定すれば、OSのウィンドウサイズバッファとTCP受信ソケットバッファは
同じ値を利用したほうが良い。もし、SO_RCVBUFを無理やりOSがアドバタイズする
TCPウィンドウサイズより小さい値にすると、場合によってはTCP層からソケット層への
データの受け渡しが非効率的となりスループットが落ちる。また、これらはソケット層の
振る舞いであるため、ETHEREAL等のパケットキャプチャでは状況を確認できない。
上記が正しいならば、高速高遅延のIP回線に対する処置はまずOSでWINDOWスケール
オプションを有効にした上で、それに見合うソケットバッファを用意すればよい。と・・・・。
どうでしょうか?
0824816
2006/09/22(金) 09:25:30高速高遅延回線でのTCPのwindowサイズコントロールアルゴリズムを
詳しく知りたい時は、
http://en.wikipedia.org/wiki/Van_Jacobson
さんたちの書いた論文でも読んでください。
ある程度データを送らないとwindowsサイズが大きくならないので、
少ししかデータを送らない場合には、UDPを検討してください。
ただ手前勝手な転送を行うと軋轢が起きて、
結局自分のパケットも失われるし、スループットの安定性もなくなる。
0825デフォルトの名無しさん
2006/09/22(金) 09:30:38レスありがとうございます。
サーバ側もjavaで組んでます。
なんでなんちゃってHTTPって感じです。
0826デフォルトの名無しさん
2006/09/22(金) 09:36:27ヘッダー箇所は
全て固定で入れていて
基本的には動いていまして
間違っていないかと思うんですよ。。。
終了判断は
\0検出か、
タイムアウトか、
受信データがなし(InputStream.read()==-1)
で判断してます。
0827デフォルトの名無しさん
2006/09/22(金) 09:37:40サーバ側で故意にリセットしてるんですかねぇ。
調べてみます。
レスサンクスです。
0828デフォルトの名無しさん
2006/09/22(金) 09:45:18Content_lengthは成功してるときも失敗してる時も
同じ値を示してて問題ないかと思います。
データ部も全く同じで。
それにjavaで作成したサーバなんで
基本的にヘッダとか意識もしないはずなんです。
まったくわからんす。。。orz
今日パケット収集してみます。
ありがとうです。
「HTTP/1.1のKeepAlive」
初ワードなんで調べてみます。
0829デフォルトの名無しさん
2006/09/22(金) 10:45:41きっと自分の思い違いだと思うからさ。
0830デフォルトの名無しさん
2006/09/22(金) 11:12:05入れ替えて試してみろよ、respectively。
0831デフォルトの名無しさん
2006/09/22(金) 12:33:03一応、HTTP/1.1に"keep-alive"は無いよ。
keep-aliveは1.0の拡張で、不完全だから1.1で改善したんだし
1.1なら何も指定しなければその上位動作のpersistent connection
0832デフォルトの名無しさん
2006/09/22(金) 13:54:410833デフォルトの名無しさん
2006/09/22(金) 14:08:19たまに原因不明のECONNRESET入るから、なんともいえないね。
原因がサーバー側(OS,apache)なのか、経路(特に家庭用ルータ)なのか
それともクライアントOSやアプリなのかも全然わかんないし。
それが起きたときの鯖側の忙しさとかも調べようが無いし
再現性もないしね。
0834デフォルトの名無しさん
2006/09/22(金) 14:19:21少なくとも>>817はクライアント・サーバの双方を作っているので、
自分のプログラムに原因がないかどうかを調べようとしている。
ECONNRESETだと、ICMPとか、RSTフラグとか、あやすい
0835デフォルトの名無しさん
2006/09/22(金) 15:24:47ローカルでもおかしくなるよ
0836デフォルトの名無しさん
2006/09/22(金) 16:45:280837デフォルトの名無しさん
2006/09/23(土) 08:11:440838デフォルトの名無しさん
2006/09/25(月) 17:29:090839デフォルトの名無しさん
2006/09/25(月) 18:19:420840デフォルトの名無しさん
2006/09/25(月) 18:38:43127.0.0.1
>>838
IpHelperなら、GetAdaptersAddressesでとれると思うけど、
winsockで、となると知らん。
0841デフォルトの名無しさん
2006/09/25(月) 19:36:01localhostで自分のアドレス取得できると思ってたorz
>>839
winsock gethostbynameでぐぐってみ
0842デフォルトの名無しさん
2006/09/25(月) 21:02:28Niceなボケだと思ってたがマジレスだったんか。orz
0843デフォルトの名無しさん
2006/09/26(火) 06:54:23Windowsでこれと同じことって出来ますかね
出来ればプログラムでやりたいですが
0844デフォルトの名無しさん
2006/09/26(火) 07:13:460845デフォルトの名無しさん
2006/09/26(火) 11:09:46TCP/IPのプロパティから追加できる。
プログラムで、となると、AddIPAddressか。動くか知りませんが。
>>844
それは、仮想アダプタ (仮想NIC)
0846デフォルトの名無しさん
2006/09/27(水) 19:19:27C++が書けなくて行き詰っていた。
C++言語をマスターしたし、TCPIPもソケット関数の使い方が
判りますた。
このC++BuilderでTCP/IP通信プログラムは組めるでしょうか?
BorlandC++4.0ももってますがこれはネットワーク通信に対応してません。
最新のBorlandC++5.5はFreeのコマンドラインツールになりましたが、
こちらは関数マニュアルが無く、TCPIP通信は無理です。
0847デフォルトの名無しさん
2006/09/27(水) 19:21:34補足:
現在は、SUN OS上で、CUIのソケット通信をプログラムできるようになりました。
VC++は経験、使用ライセンスもありません。
0848デフォルトの名無しさん
2006/09/27(水) 19:32:33インストールしてsocket() とかsendto()とかヘルプで引いてみればいいんでないの?
0849デフォルトの名無しさん
2006/09/27(水) 19:34:530850デフォルトの名無しさん
2006/09/27(水) 21:37:51\n でやっても \r\n でやってもHTTPサーバーは正常にレスを返します。
これは\nであれば、弾いてエラーを返すべきじゃないですか?
0851デフォルトの名無しさん
2006/09/27(水) 21:51:260852(^-^) ◆MONSOON/qo
2006/09/27(水) 22:06:15UNIXの改行 \r\n
Windowsの改行 \n
だから
どちらも認識した方が便利ではある
0853デフォルトの名無しさん
2006/09/27(水) 22:12:380854デフォルトの名無しさん
2006/09/27(水) 22:34:23>一般的に実装は、送信側の動作では堅実でなければならず、受信側の
>動作では寛容でなければならない。つまり、注意して適切な形のデータグラムを送信しなければな
>らないが、解釈可能なデータグラムは全て受け入れなければならない(例えば、技術的には誤りで
>あっても意図が明らかであれば黙認する)。
0855デフォルトの名無しさん
2006/09/27(水) 22:42:17あまり文句は言いたくないが、終焉コード(記号)は
寛大じゃダメだろ。それなら、\r\n \r \nの3つを終焉と定義しとけ!
0856デフォルトの名無しさん
2006/09/27(水) 22:43:040857デフォルトの名無しさん
2006/09/27(水) 22:45:440858デフォルトの名無しさん
2006/09/27(水) 23:28:07インスコしてhelp見ます。
もし経験あるかたあったらTCPソケット使えるか
おせーてくらさい。
VCは高杉で無理です。
0859デフォルトの名無しさん
2006/09/27(水) 23:43:330860デフォルトの名無しさん
2006/09/27(水) 23:49:01どの環境でもソケット使える
BSDソケットな部分なら、ネット上にサンプルもたくさん転がってる
がんばれ
0861デフォルトの名無しさん
2006/09/27(水) 23:49:29ネットに繋いだらウイルスばら撒きPCにしかならないだろうし。
0862デフォルトの名無しさん
2006/09/28(木) 00:34:580863デフォルトの名無しさん
2006/09/28(木) 06:20:06生のWinsockも使えるし、TClientSocketとかを使うことも出来るけど?
>>850
RFCで、CRLFの組を、CRを無視してLFのみとして扱うこと奨めて(SHOULDではない)いる。
もちろん、本来CRLFがあるべきところにLFのみが送られても、動くようにするため。
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec19.3
だから、サーバーがそういう動作をするのは、別に規格外というわけではなし、
エラーを返さなくても何ら問題はない。
0864デフォルトの名無しさん
2006/09/28(木) 09:58:03日本語訳だけ見てると実装の解釈を間違えるかもな。
0865デフォルトの名無しさん
2006/09/28(木) 11:01:16べつに意義は無いけど。
0866817
2006/09/28(木) 11:41:00原因わかったんで報告をば。
パケットを解析したら
ヘッダ部とボディー部が違うパケットで飛んでました。
んで色々解析した結果
socket = serverSocket.accept();
↑
│ヘッダー部のみ受信
↓
socket.getInputStream().read(1024);
⇒ヘッダー部しか受信しない
socket = serverSocket.accept();
↑
│ヘッダー部、ボディー部を受信
↓
socket.getInputStream().read(1024);
⇒OK
って感じでした。
0867817
2006/09/28(木) 11:41:54リードで受信読み取りするまでの間で
ヘッダー部とボディー部受信してたらOKだけど
ヘッダー部のみしかまだ受信できてない場合は
ヘッダー部のみしか受信読み取りしなかったみたいです。
けどこれってどうやって解決???
なんかJavaのどのクラス使っても終端コードが読めなくって
無限ループ使用して終端コードで抜けるみたいにすると
無限ループはしないんですけど処理が止まってしまうんですよ。。。
(ログ出力すると「^@」や「・」みたいのがわんさか最後にくっついてる)
なんで今は1024バイト決めうちで取ってるんですけど。。。
そうしたらこの問題でるし。。。
JavaでHTTPサーバこしらえる限界なのかなぁ。
javaライクな話でゴメンす。
なにはともあれサンクスですっ。
0868デフォルトの名無しさん
2006/09/28(木) 12:14:18> JavaでHTTPサーバこしらえる限界なのかなぁ。
おまえの限界ですから。
0869デフォルトの名無しさん
2006/09/28(木) 13:18:19BufferedReader
InputStream
で試したんですけど全然とれなかったんですよ。
後Socketのデータ読めるクラスって知ってます?
助言ください。m(_ _)m
0870デフォルトの名無しさん
2006/09/28(木) 13:33:40もしかしてストリームが分かってない…?
0871デフォルトの名無しさん
2006/09/28(木) 13:53:360872デフォルトの名無しさん
2006/09/28(木) 14:59:45そういわれたら説明できん。。。orz
0873デフォルトの名無しさん
2006/09/28(木) 15:01:08でたとこ勝負てきな感じでやってきたんで
きちんとした知識ないかも。。。
知識くれ。
0874デフォルトの名無しさん
2006/09/28(木) 15:03:16//InputStream
//read()
⇒処理が「^@」や「・」位置にくると止まる
//read(byte[])
⇒正常だがバイト分は取れるが「^@」や「・」のも取れてしまう
//read(byte[], int, int)
⇒正常だがバイト分は取れるが「^@」や「・」のも取れてしまう
0875デフォルトの名無しさん
2006/09/28(木) 15:04:16//read()
⇒処理が「^@」や「・」位置にくると止まる
//read()+ready()
⇒正常
//read(char[], int, int)
⇒正常だがバイト分は取れるが「^@」や「・」のも取れてしまう
0876デフォルトの名無しさん
2006/09/28(木) 15:05:12//read()
⇒処理が「^@」や「・」位置にくると止まる
//read()+ready()
⇒正常
//read(char[], int, int)
⇒正常だがバイト分は取れるが「^@」や「・」のも取れてしまう
//readLine()
⇒処理が「^@」や「・」位置にくると止まる
//readLine()+ready();
⇒処理が「^@」や「・」位置にくると止まる
試しました。
0877デフォルトの名無しさん
2006/09/28(木) 15:14:270878デフォルトの名無しさん
2006/09/28(木) 15:26:380879デフォルトの名無しさん
2006/09/28(木) 18:16:08ヘンな知識ひけらかすなよ
0880デフォルトの名無しさん
2006/09/28(木) 18:31:29無視しろ
0881デフォルトの名無しさん
2006/09/28(木) 18:40:49HTTPのストリームを*Readerで読む意図が分からん。
途中でエンコーディング切り替わるぞ。
>//read(byte[])
>⇒正常だがバイト分は取れるが「^@」や「・」のも取れてしまう
read(byte[])の戻り値をきちんと調べること。
つーか、javaはjavaでやれ。
ttp://pc8.2ch.net/test/read.cgi/tech/1086238859/
0882デフォルトの名無しさん
2006/09/28(木) 18:43:03>>852
>UNIXの改行 \r\n
>Windowsの改行 \n
確かにヘンな知識だな。
0883デフォルトの名無しさん
2006/09/28(木) 19:04:27テンプレートとかクラスとか使ったことないんだけどやばい?
普通に配列にアクセスしていく方がやりやすいんだけど
多数で開発とかじゃないといらなくない?
C++相談室での発言。
おどろいた。
0884デフォルトの名無しさん
2006/09/28(木) 19:10:330885デフォルトの名無しさん
2006/09/28(木) 19:19:350886デフォルトの名無しさん
2006/09/28(木) 19:54:080887デフォルトの名無しさん
2006/09/28(木) 19:58:350888デフォルトの名無しさん
2006/09/29(金) 03:10:18直接対決なんてこわくて出来ません(>_<)
0889デフォルトの名無しさん
2006/09/29(金) 05:18:42RFCの古さに注目。
いまどきは悪意を持って壊れたデータを送ってくるクライアントの存在を前提に
厳格な解釈をすることも多い。
詳細はHTTP Request SmugglingtとかHTTP Response Splittingでぐぐってみて
0890デフォルトの名無しさん
2006/09/29(金) 05:19:20なんか変なゴミが。Smugglingね。
0891デフォルトの名無しさん
2006/09/29(金) 10:32:18確かに古いRFCだけど、言ってる内容は有名な格言で、
Postel's Law とか Robustness Principle と呼ばれるやつだよ
Be liveral in what you accept, and conservative in what you send.
当然悪意のある入力に対して壊れたりセキュリティホールが空いてたりするのは駄目だけど、
この原則はこれでまた大いに意味がある
要はバランス感覚ってところじゃないかしら
0892デフォルトの名無しさん
2006/09/29(金) 10:52:230893デフォルトの名無しさん
2006/09/29(金) 10:55:020894デフォルトの名無しさん
2006/09/29(金) 13:46:240895デフォルトの名無しさん
2006/09/29(金) 13:47:580896デフォルトの名無しさん
2006/09/29(金) 14:06:352バイトもあって無駄じゃんwww
0897デフォルトの名無しさん
2006/09/29(金) 14:11:580898デフォルトの名無しさん
2006/09/29(金) 14:56:29CP/Mのせいかな。
0899デフォルトの名無しさん
2006/09/29(金) 15:13:16プリンター/ディスプレイ/ファイル内 で 改行コードが同一になる CRLF はありがたかった
0900デフォルトの名無しさん
2006/09/29(金) 15:52:15HTTPについてのRFCは2616が最新なんだけど
>>863も読んだ上で言ってるんだよね?
0901デフォルトの名無しさん
2006/09/29(金) 16:17:290902デフォルトの名無しさん
2006/09/29(金) 21:43:03> Be strict when sending and tolerant when receiving.
と書かれてる。つーかこっちのほうが有名じゃまいか
4000番台のRFCでこれに反論したものもあったはずだけど番号が分からない
0903デフォルトの名無しさん
2006/09/29(金) 22:58:58規格に厳密に振舞うことの価値が下がってしまう
規格の存在意義の消失→オレオレ仕様が跋扈する時代へ
それでもいいの?
とかそういう話かねえ。
0904デフォルトの名無しさん
2006/09/29(金) 23:08:35そうそう。確か規格違反のクライアントの誤りが修正される機会が失われて、
最終的に相互運用性が失われてしまうとかそんな感じの内容だった
0905デフォルトの名無しさん
2006/09/29(金) 23:10:55一番辛いんだよね…
0906デフォルトの名無しさん
2006/09/29(金) 23:32:230907デフォルトの名無しさん
2006/09/30(土) 12:15:34IE規格のHTMLとかさ。
改行コードは昔は出力装置にプリンタしかなかった頃の名残を未だに引きずってる。
行表示のディスプレイから始まって、スクリーン表示に成ってグラフィック端末になったし。
詳しくは歴史の勉強でもしてくれ。
0908デフォルトの名無しさん
2006/09/30(土) 16:55:21昨日、TCP/IPプログラムの処女作になるTCP/IP印刷ユーティリティを
作りました。
SUN OS用に3時間かかったけど、
Windows版(Bcc++5.5使用)は2時間で完成しました。
GUIはツールが無く、使い方も知らないのですが、
VC++の180日評価版は、個人での購入は可能でしょうか。
6が月あれば相当マンセーできると期待してるんですが。
0909(^-^) ◆MONSOON/qo
2006/09/30(土) 17:08:33マイクロソフトのvisual stdio 2005(vb c++ c# java) express edtionは
無料配布されてますよ
http://www.microsoft.com/japan/msdn/vstudio/
0910デフォルトの名無しさん
2006/09/30(土) 17:59:38OSがWin95の奴にそれをすすめるんか?
アホちゃうか
0911デフォルトの名無しさん
2006/09/30(土) 18:10:52そしてまた嘘言うな
javaは含まれてねーですよ
>>910
つ 一応VC7行こうでもネイティブを吐けるので、もしかしたら吐き出したEXE動くかもしれない
が、開発環境は無理だな
そして質問は開発環境っぽいので>>910が真
0912デフォルトの名無しさん
2006/09/30(土) 18:39:520913デフォルトの名無しさん
2006/09/30(土) 18:45:33みたいだね
VC8のランタイムはWin98移行かららすぃds
ttp://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ja
0914デフォルトの名無しさん
2006/09/30(土) 18:51:10今とあるプロトコルを作ってるのですが、
NAME1
NAME2
NAME3
と任意の数の任意の文字列を伝える場合、
どういう形式で送るのが好ましいでしょうか?
最初は、 ,や#や~で区切る方向だったんですが、それだと文字列にそれらの文字が使えなくなりますし・・・
それにこの文字列には改行コードが含まれる事もあるので、それも使えません。
コマンドの先頭にオフセットを付加する事も検討しているのですが、一般的にはこういうのはどういう手段で解決しているのでしょうか?
0915デフォルトの名無しさん
2006/09/30(土) 18:53:43Cだって\を表示したいときは\\だろ?
0916デフォルトの名無しさん
2006/09/30(土) 18:55:49・string length
・escape sequence (SMTPの.行など)
・XML
・BER
0917デフォルトの名無しさん
2006/09/30(土) 18:56:07とりあえずHTTPでのヘッダやフィールドなんかはまんま送ってるよな
あれは内部で特殊文字をエスケープしたりしてるはず
というわけで、
> 最初は、 ,や#や~で区切る方向だったんですが、それだと文字列にそれらの文字が使えなくなりますし・・・
> それにこの文字列には改行コードが含まれる事もあるので、それも使えません。
は送れるし、改行コードだって使える
表記と意味をもう少し考えよう
もう一つは「送るサイズ」とデータをまとめて送る方法だが、
まぁその”サイズ”とやらをどうやって表現するかとか、送るサイズは決まってないけどとりあえず送りたいときなんかは
無駄な表現になるかもしれない
とりあえず時と場合による
0918デフォルトの名無しさん
2006/09/30(土) 18:58:01> \を表示したいときは
< \をデータに含めたいときは
0919デフォルトの名無しさん
2006/09/30(土) 19:03:36文字列リテラルの中だけの話でしょ?
0920デフォルトの名無しさん
2006/09/30(土) 19:17:59ちなみに、printfは、\\を見て\を出力ということはやってない。
%と\を混同している人が多いが。printfの書式指定は%。
改行処理は書式文字列に埋め込まれた改行コードを出力しているだけ。
0921デフォルトの名無しさん
2006/09/30(土) 19:40:26ちと誤解があるようなので。
OSはWin95も使ってますが、
MS-DOS6.2、7.0,Windows3.1,Wi95、Win98SE、
Win2000、WinXP Pro, SunOS、ソラリス
以上を現用です。
昔は、H8350、VAX11、MDS(86)、CBM-3032なんてのも
マンセーしました。
0922デフォルトの名無しさん
2006/09/30(土) 20:08:460923デフォルトの名無しさん
2006/09/30(土) 20:15:18バッファとかでガバッてやると、終了とかサイズとかの処理が面倒だし
やっぱり1バイトづつ(とか先読みとか)読み取って処理するのが一番楽だよね?
0924デフォルトの名無しさん
2006/09/30(土) 20:16:40909はJ#とJavaの区別が付いてないんだな
0925デフォルトの名無しさん
2006/09/30(土) 20:17:47そこまで決めちゃうプロトコルなの?
実装の話は抜かして進めないと先がどんどん見えなくなっていくよ
0926デフォルトの名無しさん
2006/09/30(土) 20:29:34やるなら、1バイト(もしくは数バイト)ごとがいいとか、
そういう話じゃないのか?
0927デフォルトの名無しさん
2006/09/30(土) 20:33:28TLVのマーシャリング、アンマーシャリングを行う汎用クラスを作っといて、
I/Oはそいつに任せる。
個別のプログラムは、TLVの意味解釈のみ。
0928デフォルトの名無しさん
2006/09/30(土) 20:50:370929デフォルトの名無しさん
2006/09/30(土) 20:53:53新しいプロトコル作るまでは話が進んでいるんだから、
そっちに後戻りするのはちょっと受け入れられない条件なんじゃまいか?
(最悪"TCPがあるじゃん!"に落ち着いてHTTPもSMTPもTCPに含まれちゃうことになっちゃうぞ)
とりあえず俺も今シコシコやってるから反論してみた、反省はしていない
0930デフォルトの名無しさん
2006/09/30(土) 21:00:14あるプロトコルの命令句を取り出したら、余ったバッファの値を
バッファの先頭に持って行きたいんだよね。
同じサイズのバッファを沢山プールして、フリーのバッファにmemcpyとかしかない?
0931デフォルトの名無しさん
2006/09/30(土) 21:14:58今の学生さんは普通にインターネット使って
普通にパソコンのキーを叩いてますし、
ネットワークプログラミングもナラってます。
たわしが学生時代は大型計算機全盛で、
MSもMS-DOSも影も形もなく
ネットワークはおろかパソコン通信もなかったんですわ。
0932デフォルトの名無しさん
2006/09/30(土) 21:21:36何がいいたいの?
0933デフォルトの名無しさん
2006/09/30(土) 21:26:41一体何歳の人?
0934デフォルトの名無しさん
2006/09/30(土) 21:29:42何でそんなにバッファとか面倒なことにこだわるんだ?
特に>>929 >>930に言いたい!
0935デフォルトの名無しさん
2006/09/30(土) 21:35:420936デフォルトの名無しさん
2006/09/30(土) 21:47:40そんなこといわれてもなー
プロトコルにかんけいないしー
0937デフォルトの名無しさん
2006/09/30(土) 22:03:170938デフォルトの名無しさん
2006/09/30(土) 22:04:162)まとめて読み込んで1)に1バイトずつ返す部分、
の2つに分ければよろし。
0939デフォルトの名無しさん
2006/09/30(土) 22:15:160940デフォルトの名無しさん
2006/09/30(土) 22:30:37最初のMS-DOSはNECのPC-100で使った。
会社だから買えたけど100万円もしたんじゃ
とても個人じゃMS-DOS機は買えんかった。
DOS無しでも研究のオリジナル8086オリジナル機
で画像認識処理を研究しとったよ。
メインフレームと連携させてよ。
VAXマシンやTSSはケーブルでは
多数つながっていたが、LANではなくて
チャネルという呼び方をしてた。
当時はOSIレイヤが7層構造で・・・
みたいなお堅い空論だけが論文に
出てたが実験段階で製品レベルでは
なかった。
0941デフォルトの名無しさん
2006/09/30(土) 22:38:40時代考証間違ってないか?
ボケた?
0942デフォルトの名無しさん
2006/09/30(土) 22:43:26この人の歴史がそのまま計算機の歴史なのか…
HPとかブログで思い出話つづってくれると、とってもいいかも。
博物館とかで昔の人の知恵を見るの好きなので・…
0943デフォルトの名無しさん
2006/09/30(土) 22:45:56だから、何歳なんだよ?
0944デフォルトの名無しさん
2006/09/30(土) 22:47:07リングバッファじゃ駄目なのか?
0945デフォルトの名無しさん
2006/09/30(土) 23:01:37まあ今でこそネットワーク花盛りだけど
いろいろみんなの努力があって現在があると思ってますよ。
主にハード制御と基板設計だったけど、
今ではハックされないSSLプログラミング実装と
FPGAのVHDLでも頑張ってるよ。
0946デフォルトの名無しさん
2006/09/30(土) 23:02:220947デフォルトの名無しさん
2006/09/30(土) 23:03:32ソフトとハードいぢってる人なんじゃね?
0948デフォルトの名無しさん
2006/09/30(土) 23:05:390949デフォルトの名無しさん
2006/09/30(土) 23:27:05無知で若くていいなってね。
0950デフォルトの名無しさん
2006/09/30(土) 23:30:51年取っていても、おまえらよりも好奇心は数倍上なんじゃ!
お前ら、頭下げんか!!
0951デフォルトの名無しさん
2006/09/30(土) 23:33:30とりあえず>>949は俺に頭下げろ
0952デフォルトの名無しさん
2006/09/30(土) 23:36:09みんな俺に平伏せ。
0953デフォルトの名無しさん
2006/09/30(土) 23:39:50何もかもが懐かしい。俺25。
0954デフォルトの名無しさん
2006/09/30(土) 23:43:130955デフォルトの名無しさん
2006/10/01(日) 00:12:140956デフォルトの名無しさん
2006/10/01(日) 02:40:29ソケットバッファはcloseした際にfreeされるんだろうけど、そのもっと下のレイヤーの
中の人達は、そのパケットをどう処理するの?
0957デフォルトの名無しさん
2006/10/01(日) 02:47:11Socketライブラリの話をしてるなら
その前にshutdown()があるだろ?
そっちを参照しれ
0958デフォルトの名無しさん
2006/10/01(日) 02:50:44FAQ読め。half closedとか。
0959デフォルトの名無しさん
2006/10/01(日) 03:51:35遅レスだが
,で区切るなら
まず全ての,に,を追加する
つまり,や,,,は、,,とか,,,,,とかになるわけ。
あとは,でマッチするヤツで分離
処理後は,を1つ減らす。
0960デフォルトの名無しさん
2006/10/01(日) 04:19:45,
,
,
な項目が出た時に判別方法ナスw
まぁ、n/2出来るかどうかで後からつけたかどうかは判別できるかな
スマートな方法ではないが・・・。
0961デフォルトの名無しさん
2006/10/01(日) 07:02:45以下で、空白区切りレコードデータは、
test1 test2
,区切りレコードでは、
test1,test2
と表現するとしよう。
空白区切りレコードデータ、
test1, test2
も
test1 ,test2
も、,区切りレコード&あなたのエスケープの方法では、
test1,,,test2
となって区別がつかない。
メタ記号とは、別の記号でエスケープするのが基本である。
この話題はネットワークに直接関係ないし、
レベルも低いので、くだ質に移ることにしないか?
SOCK_SEQPACKETや上位フレームワークを使うのでない限り。
0962デフォルトの名無しさん
2006/10/01(日) 07:24:16相手するから続く
0963デフォルトの名無しさん
2006/10/01(日) 07:31:56そもそも、ネットワークプログラミングに関することでレベルの高い話題って出た事ある?w
0964デフォルトの名無しさん
2006/10/01(日) 07:39:45ないなw
バッファのサイズやら、ブロッキングしない方法やらCRLFやら・・・
自分の力量に影響される部分ではなく、ごくごく基本となる話題ばっかだ。HelloWorldで言えばprintf()関数の使い方を聞いてるようなもん
誰がやっても同じになる部分だけに、ヘルプ読めで終わる。
どう考えてもプロトコルの設計の話の方がプログラマの創造する部分なだけ、レベルはワンランク高い。
どっちもドングリの背比べだが・・・
0965デフォルトの名無しさん
2006/10/01(日) 09:20:16単に「決まり事を理解してる・してない」の問題で、
それを含んだ「難しい箇所」の話もう別のスレの領分になっちゃうからな。
0966デフォルトの名無しさん
2006/10/01(日) 09:47:22向いてないならネットプログラミングは避けるのが無難。
あとプログラマでちょっとプログラム書けば確かめられるのに、手を動かさずにまず訊くのは何なの?
正解を求める廚ですか?
0967デフォルトの名無しさん
2006/10/01(日) 09:51:03もしかすると、たまたま動いたってだけかもしれない。
そんな危険なコード世に出せる神経が理解できない。
0968デフォルトの名無しさん
2006/10/01(日) 11:33:170969デフォルトの名無しさん
2006/10/01(日) 13:08:330970デフォルトの名無しさん
2006/10/01(日) 13:11:040971デフォルトの名無しさん
2006/10/01(日) 13:16:050972デフォルトの名無しさん
2006/10/01(日) 13:20:36なんとなく意味が伝わってて、そんでなんとなく会話の流れがわかるかんじ
少なくとも自分の中で「レベルが高い」のと「レベルが低い」の区別はついてるからもういいや
というわけで茶化すなよ>>969-971
0973デフォルトの名無しさん
2006/10/01(日) 13:30:19「いつも思うんだが、お前らの言うレベルの高いお話ってどんなお話?」
0975デフォルトの名無しさん
2006/10/01(日) 14:03:22ボコボコにされたあと、腫れ上がった顔で後出し釣り宣言とかするタイプw
0976デフォルトの名無しさん
2006/10/01(日) 14:47:29子供の頃にマズイ食い物しか与えられなかったんだろう?
貧乏ヒマ無しだったんだな…
そんなに、ひねくれるな、おまえ!
0977デフォルトの名無しさん
2006/10/01(日) 14:53:29あのーすいません。
うだうだ馴れ合いはいいので、「レベルの高いお話」ってどんな話なのかさっさと誰か答えてくれません?
0978デフォルトの名無しさん
2006/10/01(日) 14:55:46ns manualも大分古いですし、まとまった資料が欲しいのです
0979デフォルトの名無しさん
2006/10/01(日) 15:05:33気がついてないようですが、今話題の高慢な人が
話のレベルが高い・低いと勝手にランクづけしているだけです。
0980デフォルトの名無しさん
2006/10/01(日) 15:13:320981デフォルトの名無しさん
2006/10/01(日) 15:24:53レベルが低い話はいいかげんにしろ!殺すぞ!!
0982969
2006/10/01(日) 15:40:350983デフォルトの名無しさん
2006/10/01(日) 15:45:010984デフォルトの名無しさん
2006/10/01(日) 17:10:100985デフォルトの名無しさん
2006/10/01(日) 17:25:040986デフォルトの名無しさん
2006/10/01(日) 17:25:50出てこい。殺してやる!!
0987デフォルトの名無しさん
2006/10/01(日) 17:33:22DHT(Distributed hash tables)とかOSPFのアルゴリズムの話とか
0988デフォルトの名無しさん
2006/10/01(日) 18:11:56>>987死ね。
0989987
2006/10/01(日) 18:13:16ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/
0990デフォルトの名無しさん
2006/10/01(日) 18:17:210991デフォルトの名無しさん
2006/10/01(日) 18:20:24言っとくけど、>>989は本人じゃないよ。
0992デフォルトの名無しさん
2006/10/01(日) 18:22:160993デフォルトの名無しさん
2006/10/01(日) 18:23:110994デフォルトの名無しさん
2006/10/01(日) 18:23:460995デフォルトの名無しさん
2006/10/01(日) 18:24:18. . . .,
. . . .’
’
.’
. . . .__、、、..========-、
、l゙? ̄` .`_
、l 、’
.` . . . ..=-‐・ナ1 ’
.1
1
. __、、...--─…・・ナナナナ^¨ ’
゙ ̄ ̄ . . .ソ . . . .ヘ .’
. . . .ン´ .’ .}
./ .1 、i
゙/ . 、’ .i
゙’ ・ 、j
. .’ .j′
. ’_ ___、、、.=-ー・・ナ^´
.  ̄ ̄ ̄ ̄
0996デフォルトの名無しさん
2006/10/01(日) 18:28:570997デフォルトの名無しさん
2006/10/01(日) 18:29:300998デフォルトの名無しさん
2006/10/01(日) 18:30:220999デフォルトの名無しさん
2006/10/01(日) 18:32:271000デフォルトの名無しさん
2006/10/01(日) 18:32:59///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
///////////////////////////////////////
1000?
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。