7 :
1:2005/06/11(土) 15:01:20
あとはよろしく
8 :
1:2005/06/11(土) 15:13:36
日本語でwinsock勉強できるサイトも紹介してくれ
猫以外で
13 :
1:2005/06/11(土) 15:42:04
>>10 前スレの968==979==987==991==
>>1ですがなにか?(w
そうですか
ひとり露出狂がいるね
というわけで、もう少し使い勝手が良くなるように
ソケット周りのライブラリを整備しようと思います。
もう少しでα版が出せそうなので待っててください。
unp より使いやすいわけ? 利点を挙げよ。
テンプレートや例外を適切に扱った
boost風の奴をつくってください
20 :
デフォルトの名無しさん:2005/06/11(土) 19:47:58
コアラ将軍のTCP/IP講座ってどこにあるの?
21 :
デフォルトの名無しさん:2005/06/11(土) 19:49:39
将軍じゃないや、大将だった
誰か17回以降を執筆しないか?
みんなが第2の「コアラ大将」になるチャンスかもしれない
初出 1988年かよ。ふるいなー。俺が小6 のときじゃん。
そんなもんだ。
Internetworking with TCP/IP の初版がいつだと思っているのだ。
(改訂され続けてるのがすごいよね)
……いつだっけ?
27 :
デフォルトの名無しさん:2005/06/14(火) 01:47:42
異なるプログラム言語同士で、ソケットを用いて通信はできるのでしょうか?
たとえば、JAVA(サーブレット)とVisual C++ 6.0で、ソケットを用いて通信はできますか?
言語非依存。
>>27 出来るよ。
ただ、データのマシンレベルでの表現形式はマシンや言語によって違うから、
それには注意しないとまずい。
30 :
デフォルトの名無しさん:2005/06/15(水) 00:02:59
Win32でTCP/IPのプロパティを Winsock2 で参照するサンプルはFAQには
書いてあるのですが、設定する方法は無いでしょうか
あります
っつーかそれはnetshやWMIみれ
32 :
デフォルトの名無しさん:2005/06/15(水) 18:44:05
winsock2で、あるソケットがlistenしているソケットなのか、
TCPのデータ通信用のソケットなのか、UDPのデータ通信用なのかを
判別できる関数ってないでしょうか?
getsocknameとgetpeernameを組み合わせたら判る気がする。
34 :
デフォルトの名無しさん:2005/06/15(水) 21:01:28
>>33 接続済みのTCPとListenしているTCPソケットなら分別できそうですが、
UDPの分別が難しそうです・・・。
前スレのどこかにサンプルがあったような希ガス
36 :
デフォルトの名無しさん:2005/06/15(水) 21:48:48
Winsock2で同じソケットのスレッドによる同時読み書きって大丈夫なん?
スレッド1 が読むだけで、
スレッド2 が書き込むだけ、
ってな感じで同時に読み書き、ソケットにsetsocketoptでタイムアウト設定し
クラスにまとめて上限のないselectみたいなの作りたいんだけど。
>>36 socket的には問題なし。双方向チャンネル。
ただし、stdioやiostreamなどのバッファリングを噛ませる時は注意。
38 :
32:2005/06/15(水) 22:58:49
>>35 まじっすか?
けど前スレdat落ちしてますね・・・。
40 :
デフォルトの名無しさん:2005/06/15(水) 23:51:00
UDPでconnect()が出来ますが
これに対してlisten()は必要なのでしょうか?
また必要で無い場合でも、使う事は可能なのでしょうか?
41 :
デフォルトの名無しさん:2005/06/16(木) 04:53:35
connect()したんだからlisten()が必要なのは当たり前
>>40 UDPでは不要だし、やったらエラーでるよ。
ところで、sockaddr_inの情報だけがあって、それと既に接続されてるかチェックする方法って無いですか?
44 :
デフォルトの名無しさん:2005/06/16(木) 06:56:35
流れ無視してすみません。
R.Stevens氏の著作のソースコードは現在入手可能ですか?
UNIXネットワークプログラミング〈Vol.1〉
に載ってた
ftp.kohala.com
に接続できませんが。
>34
SO_PROTOCOL_INFO
ftp はなんか止まってるみたいだけど
www.kohala.com の方は接続できるし
ソースもあるよ。
48 :
44:2005/06/16(木) 08:21:36
49 :
デフォルトの名無しさん:2005/06/17(金) 13:13:05
non-blockでのconnect()の未完了時のerrno値が、
EINPROGRESSからECONNREFUSEDへと変更になったようです。
でも、これって、なんかひどくない?
未完了状態と拒否判明とを、どう区別つければいいの??
どなたかくわしい人、助けて!
http://www.mid.comp.nec.co.jp/SUPPORT/RNOTE/UX48/ONLINE/UP-R13.8/file/xpg4unix/index > 以降の各項目は、XPG4 UNIX の設定如何に係わらず、従来と動作が
> 変わったもの、あるいは機能的な追加(拡張)が行われたものです。
> connect(3N)
> 機能 : ソケットでの接続要求の発行
> 変更点1 : 非同期モードの UNIX ドメインソケットで、サーバ
> 側が接続受け入れできない状況での errno の値が
> 変更されます。
> 従来: EINPROGRESS
> XPG4 UNIX: ECONNREFUSED
ICMPでエラーが帰ってきた場合、
エラー理由(errno)がより適切になったという事だろ。
> 未完了状態と拒否判明とを、どう区別つければいいの??
errnoを見ろよ(w
Linux での話なんだけど・・・
簡単な HTTP サーバみたいなもんを作ったんだが、
リクエスト送って GET を繰り返すと
(Keep-Alive のインプリメントはしていないので1回
ごとに accept したソケットは close してる)
401回目の GET をしに connect しても
(client 側の connect は成功)
サーバ側の accept が接続を検出してくれず、以降
そのソケットに何を送っても accept が反応しなく
なるという現象が・・・
なにがまずいのだろう ・・・
誰かこの 400 という数字に心当たりある人居ませんか?
とりあえずfstat(1)とかnetstatでも呼んでみたら?
案外ソケットは閉じてても、ファイルが開きっぱなしだったりするかも
>>51 ありがちなのが、fork()したあとで
親プロセス側でaccept()で取得したconnectionのfdをclose()していないパターン
かしら
lsof(1)も役に立つ。ひとまず、
$ lsof <Enter>
lsof: Command not found.
>>55 installしろ。
>>51のようにLinuxならlsofってパッケージでしょう。
マジレスされても困る…
まじ?
59 :
デフォルトの名無しさん:2005/06/18(土) 01:04:15
質問です。
通常クライアント側はsocketにポート番号なんかを関連付けませんけど
特定のポート番号で通信したい場合はどうすればいいのでしょうか?
TCPの場合ですと
soc = socket()
の後、bind()でこちらのポート番号を関連付けてから、connect()の第1引数に指定すれば良いのでしょうか?
UDPの場合だと、connect()もしないので想像も付かないんですが、どうすれば良いのでしょうか?
初歩的な質問ですみません。
socket, bind, connect, read/write, recv/send, closeは、
UDP, TCPに共通のAPIです。要するにbind/connectしろと。
UDPのばやい、bind/connect使わずに、recvfrom/sendtoする方法もあるが。
UDPではbindせずにrecvromは使えない。
bindせずにconnectしたら、recvfromを使う意味がない
62 :
51:2005/06/18(土) 13:04:27
グハっ
ソケットじゃなくて、コネクションごとに作っていたスレッドが作れなくなって
発生していた現象だった .. orz
boost::thread で作ってるんだけど、スレッド終了してもスレッドオブジェクト
が残っていて、作れなくなっていた。
さて、GETの処理のほうは何とかなったのだが、このスレッド数400はどう
やったら増やせるのだろうか?
Windows上なら同じプログラムで800スレッドとかもいけるのだが・・・
別プロセスなら、別途400とか作れるのだからシステム的には余裕のはず
なのだが、どうもプロセスごとに作れるスレッド数に上限があるような・・
どこをいじればよいのだろうか?情報がみつからない・・
>スレッド終了してもスレッドオブジェクトが残っていて、作れなくなっていた。
を解決するのが先だろ。なんでシステム上限を上げて対処しようとするかな……
まあ、スレ違いだけど。
スレッドだけに
>63
いや、一旦は解決した。テストしてた処理だけなら。
しかし、その先にやりたい本当の処理の為にはやはり400では足りない。
てか、FedoraCore4にアップしたら 300ちょいしか作れなくなった .. orz
66 :
デフォルトの名無しさん:2005/06/18(土) 17:23:08
マンチェスタ符号は、0信号なら0[V]にしてから立ち下がって-2[V]にし、
又1信号だと-2[V]にしてから立ち上がって0[V]にする。
この仕様だと、直流成分が-1[V]としてでてしまいノイズの元となると思うのですが、
なぜ0[V],-2[V]でなくて1[V],-1[V]にしなかったのでしょうか?
67 :
デフォルトの名無しさん:2005/06/18(土) 19:05:26
C++でMXレコードを引いてくるにはどうすればいいのですか?
>65
そんな大掛かりなことをしたいならapache2のような構造にしろよ
>>67 C++標準ライブラリにはないので、環境くらい書かないと…
70 :
デフォルトの名無しさん:2005/06/18(土) 20:49:48
>>69 スマソ。標準ライブラリにはないんですか・・・。
windowsで設定されてるDNSを取得してそこに問い合わせればいけるのかな??
DNSの勉強しなくてわ・・・
俺ならMLでスマートに書くけどねw
>68
いや、apache2、参考にしてる、実は。
ただ、モジュール側から見て一部真似てみただけだけど。
スレッド管理とかどういう風になってるのかまだ見れてない。
一応、この前の対策で、HTTP用途のほうならイケそうな感じ
にはなった。
だが、肝心のゲームサービスのほうでやはりスレッドが欲しい・・・
1ゲーム1スレで走るととてもプログラミングの見通しが良く
なりそうなのだが・・・
1スレで複数ゲーム制御してしまうと、とてもプログラムの見通し
が悪くなる。前バージョンはコレでバグ取りで嵌ったので、
今回はマルチスレッドでやりたいのだ。
同時接続が数百になるものなら
1接続=1スレッドなんて効率が悪くてやってられないだろ。
普通にマルチスレッドにするのは(I/O待ち等を考えても)当然だが
それは、1スレッドで複数の接続を管理した上で
そのスレッドを複数(少数)持つ、
という形が、効率の上では一番良さそうだけど。
76 :
デフォルトの名無しさん:2005/06/20(月) 03:04:44
select()なんて使ってられないよ。
kqueu, epoll, /dev/poll
>>74 じゃ、まずスレッドの管理をどうしているのか見ろよ。
スレッドを作るのは結構リソースを使うんだぜ?
パフォーマンスなんてどうでも良いと思っているなら、スレッド大量作成でも構わないけどな。
だったら、スレッドの作成が成功するまでリトライでもしとけば良いだろ。
>>75 最近はスレッド管理が発達してるから
案外負荷は少ないかもしれない
それは幻想。十分に重い。
「案外負荷は少ないかもしれない」「十分に重い」
おまえら何も語ってないに等しいな。チラシの裏にでも書いてろ。
やはりこのスレッドにはこのノリがぴったりですね。
スレッド使うにしても、普通スレッドプールじゃないのか
ワーカースレッド待機させとくんじゃないの?
86 :
デフォルトの名無しさん:2005/06/21(火) 03:58:52
どーせ'\0'や'\x1A'までしか読んでないだけ
とりあえず、リンク先のHTTPRecvDataは'\0'を含むデータを扱えないのは一目瞭然
89 :
デフォルトの名無しさん:2005/06/21(火) 07:32:39
>>88 返答ありがとうございます。
"RecvBuf[buf_len] = '\0';/* 受信したバッファの後ろにNULLを付加する */"
という記述がまずいということでしょうか?
>>89 ちゃう。
strlenとかstrcatとか、受信したデータを文字列として扱っているところが、
あからさまにバイナリを意図していない証拠。これ以上はネットワークとは
何の関係も無い話なので、初心者板にでも逝く。
Cの「文字列」とはどんなものなのか? をC FAQ辺りで読んだら?
92 :
86:2005/06/21(火) 20:56:44
>>90-91 ありがとうございます。私はこれまで
バイナリ、テキスト、文字列といったことをあまり考えずに
やってきました。ちょっと勉強してきます。
ちょっとじゃ足りない
いつだって勉強はちょっとじゃ足りない
WinSockでSOCKET型は比較していいのでしょうか?
STLに入れてごにょごにょしたいのですが。
ダウンローダを作ろうと思うのですが、参考になるオープンソースのソフトはありませんか?
nbtstatと同じ事が出来る関数ってありませんか?
arpとかnetstatなら、iphlperapi.dllとかicmp.dllを使って出来るので、
nbtstatも・・・と思ったのですが、見つかりません。
system(nbtstat);
ごめんウソ
101 :
98:2005/06/25(土) 12:32:57
自己解決。
netapi32.dllを利用すれば出来そうですね。
102 :
デフォルトの名無しさん:2005/06/25(土) 17:58:15
winsock2では
socket(AF_INET, SOCK_RAW, IPPROTO_RAW)
で自分でIPヘッダを作って送信することはできないのですか?
プロトコル番号が255のIPヘッダが勝手に付け足されてしまうんですが・・・
104 :
デフォルトの名無しさん:2005/06/25(土) 19:18:47
>>103 どもです。そこにあったsetsockoptを付け足してみたけど、駄目みたいです。。
LINUXでやってみるとうまくいくんだけどな・・・
やっぱり
プロトコル番号が255のIPヘッダ→自作のIPヘッダ→ペイロード
って感じになってしまいますです。
socket() の第3引数に、設定したいプロトコル番号を書くのはどう?
元々一部しか変更できねえんじゃねえのか?
107 :
デフォルトの名無しさん:2005/06/25(土) 21:10:32
>>105 UDPとかなら送れるみたいですが、TCPやほかの適当な番号を入れると送信できないみたいです。
>>106 そうなんですか・・・
XP Sp2はRAWソケ廃止したんじゃなかったっけか。
NMAPってOSのkernelを介さずに独自にNICへアクセスする方法で生ソケット使ってるんじゃないの?
111 :
デフォルトの名無しさん:2005/06/26(日) 00:58:43
すいません、初歩的な質問で恐縮ですが、winsockで
サーバー・クライアントモデルでのTCP通信をしております。
サーバーとクライアント1対1で、クライアントにおけるsendの返り値が256、
サーバーにおけるrecvの返り値が255となぜか1だけ損失しているんですが、
このような現象が起こることはあるのでしょうか?
今までは正常に動いていたのに、ちょっとソースをいじったら
このような現象が起きてしまいました。
ご教授お願いいたします。
>>111 仕様どおりの動作。まずは1で紹介しているURLを熟読する。
>>111 俺もそれなったことあるよ
ちょっとソースをいじったらいいよ
116 :
86:2005/06/26(日) 14:45:36
ソースを見てみたけど、
ものすごいメモリコピーしている悪寒……。
256バイトごとrecvして、
「今まで受け取ったバイト数+ recvしたバイト数」、新しいメモリを確保して、
「今まで受け取ったバイト数+ recvしたバイト数」、新しいメモリにコピーして、
今までのメモリ解放の繰り返し
で、コネクションが切れたら、メモリ内容をファイルに書き出し。
メモリベンチプログラムかな?
118 :
86:2005/06/26(日) 17:42:11
>>117 ひょっとして私とんでもないことしてます?
119 :
86:2005/06/26(日) 18:03:03
>>117 このプログラムでダウンロード中はCPUの占有率(Alt+Ctrl+Delで見れるやつね)
が90%超えちゃうんですけど、メモリの使い方がやばいせいですかね?
メモリを256MB積んでいて、それを全部使えるとして
300MBのものをダウンロードするにはどうする気だ?
>>118 ネットワークプログラミング以前の問題で、かなりヤバい。
データ構造とかアルゴリズムとかの勉強をやり直すべき。
自己参照構造体とかでrecvしたバイト数ずつmallocで確保していけば良いのに
と思った
でも、確保したそばからメディアに書き込んでいったほうがお利口さんだと思った
ただ、元のサンプル(テキストしか扱えない奴)も
似たようなやり方してるからね。
あくまでサンプルということならそれでもいいけど
実際にまともなものを作るにはどうかなって感じ。
124 :
86:2005/06/26(日) 20:13:20
>>120-123 どうも、どうも。ご助言ありがとうございます。
キーワードはいただきましたので、その辺りを調べる、勉強するをしてから、
書き直してみたいと思います。ありがとうございました。
俺の場合、
1回の転送で送れる限界くらいのサイズまで受信→ファイルへ書き出し
→続きを受信→書き出し→以降終わるまで続ける。
で最後に連結させてるけど・・・
じゃないと、受信途中で何らかのトラブルおきてもリジューム出来なくなるから・・・
普通に受けとったそばからfwriteすればよいと思うのだが。
エラーが起きたらfflushして、レジュームは書き出せている
ファイルサイズの末尾から。
>>126 > エラーが起きたらfflushして、
ヘッダのLast-Modified: フィールドにファイルのタイムスタンプを合わせて、
> レジュームは書き出せているファイルサイズの末尾から。
これを利用するかどうかを、レジュームしようと再接続した時の
Last-Modified: フィールドと比べて決める。
>エラーが起きたらfflush
だとOSごと落ちた時とかアプリが固まった場合
マズくないかね
ヒント: If-Range
遅レス
>>50 エラー理由(errno)がより適切になったというのは正しいが、
UNIXドメインソケットではICMPなんぞ使わない。INETドメイン
ソケットの場合とerrnoを揃えたというのがより正確な説明だろう。
>>49 接続相手が未完了状態だから、接続が拒否される。未完了状態と
拒否判明はもともと区別なんてできない。
組み込みでソケットからCで構築してる人いませんかー?
132 :
131:2005/06/27(月) 14:09:28
間違った。
Ethernet とか IPの階層から実装してる人いませんかー?
>>132 そういうのはBSDからパクってくるのが普通じゃないかね。
PSPとかがそう。
134 :
131:2005/06/27(月) 14:22:41
>>133 詳しい方発見!
普通は、ソースコードをパクるもんでしょうか?
実はソースコードがどこにあるかすら分からないのですが・・・。
相手にもよるな
石を直接扱うのとLANカードを扱うのでも違うし
ドライバが提供されているのもあるし
136 :
131:2005/06/27(月) 14:36:33
私の場合は石を直接いじることになります。
勉強中なんですが、なかなかいい資料とかもなくて・・・。
138 :
131:2005/06/27(月) 17:53:06
>>137 おおおお。見逃しました。これから見ます。
すいません。
それから雑誌「インターフェース」がまさにその話題の特集を。
つか逆に一から書いたIPスタックなんて恐くて使えないよ。
適度に枯れてないと。
けど作るのが目的(ミドルウェア販売)の場合もあるわな。
今みたいに何から何までIP喋るようなご時世だと。
MACアドレスの申請とか考えたくも無いな
145 :
143:2005/06/28(火) 16:01:55
>>144 なるほど。
ちなみに、IEEEの日本の出張所みたいなものはないのかな?
あ、これはオレが調べるよ。ありがとう。
146 :
あああ:2005/06/29(水) 00:32:42
次のプログラムをLittle EndianのCPUで実行したとき、
それぞれcmdとdataのメモリの内容、メモリから読み出した直後
のレジスタの内容、実際に出力される内容はそれぞれどのような
値になるでしょう?
char cmdreg = CMD_PORT, datreg=DATA_PORT;
unsigned int16 cmd;
unsigned int32 data;
cmd=0x87cd , data=0x20030719;
outw(cmdreg,(cmd & 0xff00)
>>8 | (cmd & 0xff)<<8);
outl(datreg, data);
147 :
あああ:2005/06/29(水) 00:34:46
次のプログラムをLittle EndianのCPUで実行したとき、
それぞれcmdとdataのメモリの内容、メモリから読み出した直後
のレジスタの内容、実際に出力される内容はそれぞれどのような
値になるでしょう?
char cmdreg = CMD_PORT, datreg=DATA_PORT;
unsigned int16 cmd;
unsigned int32 data;
cmd=0x87cd , data=0x20030719;
outw(cmdreg,(cmd & 0xff00)
>>8 | (cmd & 0xff)<<8);
outl(datreg, data);
黙れよ、ふかわりょう。
なんだコレスクリプトか?他のスレにもあったぞ
150 :
143:2005/06/29(水) 17:05:13
151 :
デフォルトの名無しさん:2005/06/30(木) 09:20:35
現在、自動でVPN接続、VPN接続完了後FTP認証を行いその後ファイル転送を行
う。ソフトを作成しています。
その中で1つ問題がありVPN接続完了後、FTP認証の際PPTPのトンネルが出来てい
ないのでFTPの認証が出来ません。数回リトライするうちにトンネルが出来てお
り成功します。
そこで質問ですが、VPN接続完了後トンネルが完成した時に発生するWindows API
を教えていただきたいと思います。
>>151 ( ^ω^)そんなのないお
PingPingしておっきおっき
Windows のソケット通信での送信処理についてお聞きしたいのですが、
GMEM_MOVEABLE オプションを付けて GlobalAlloc で確保したメモリを
GlobalLock で固定して送信データをセットした後で、 send を非同期で
呼び出して、FD_WRITE イベントで 上記確保メモリを GlobalUnlock →
GlobalFree で開放するという手順は、何か問題がありますか?
>>153 記憶違いならすまんが。
WSAEWOULDBLOCK→FD_WRITEで「送信が完了した」のではなく、
単に送信バッファが開いて「送信できるようになった」だけであって、
もう一度send()を呼ばなきゃいかんのじゃないかな。
そのかわり、その間メモリはロックしておく必要はないので、GMEM_MOVEABLEのGlobalAlloc()で
確保したものであっても構わないだろう。
そもそもGMEM_MOVEABLE自体、32bit Windowsでは過去の遺物であって
使う必要がないとは思うが。
>>154 レスどうも。
>単に送信バッファが開いて「送信できるようになった」だけであって、
>もう一度send()を呼ばなきゃいかんのじゃないかな。
connect の直前に FD_CONNECT | FD_CLOSE で、send の直前に
FD_WRITE | FD_CLOSE でWSAAsyncSelect を呼んでるので、送信が
完了した時に FD_WRITE のイベントが発生すると解釈してました orz
もしかして、send で送信バッファに送信データをにコピーしても、送信
バッファに十分な空きがあった場合、即座に FD_WRITE イベントが発生
すると言う事でしょうか・・・ ((((;゚Д゚)))
DNSの通信内容(仕様)を知りたいのですが、ググっても見つかりません
日本語で解説されたサイトなど無いでしょうか・・
rfc
>160
>158 は rfc とつぶやき、>159 は >3 を見ろという。じゃ、どれを見ればいいかぐらい分かるよな?
「RFC 日本語版リスト」で「ドメイン」or「Domain」or「DNS」でページ内検索すればいくらでも見つかるだろ?
163 :
157:2005/07/02(土) 14:25:44
すみませんありがとうございます。
RFCとか読むの始めてで・・
RFC読みにくて嫌いになったんですが、RFC以外の
読みやすいドキュメントって無いですかね?
RFC を読みたくない奴にいちいち「RFC 嫁」と言うのもどうか。
157 が求めているのは規格書じゃなくて入門的な本・記事だろう。
気にいらなければ放置しろって。
といっても、俺も知らんが。
166 :
157:2005/07/02(土) 15:06:38
いや、DNSの概要は分かってます
読みやすい規格書が欲しいんです
StudyingHTTPのような
自分でまとめたら勉強になるし、後に続く人にも役にたつんジャマイカ
169 :
157:2005/07/02(土) 15:13:18
馬鹿です中卒です
語彙力も全然無いです
プログラマーに向いてないかもしれません
それでも知りたいんです
studyinghttp 読めるなら、日本語訳された RFC くらい読めんか?
あのサイトのターゲットは本当の初心者向けじゃないだろ。
172 :
デフォルトの名無しさん:2005/07/02(土) 15:28:54
(゜Д゜)ハァ?
173 :
157:2005/07/02(土) 15:31:23
今まで仕様書とか見るのめんどくさくて
パケットキャプチャーしてその内容と
適当にググった内容を照らし合わせて勉強してたんですが・・
DNSはそうも簡単にいかず。
ダラダラダラダラ面倒なやつだな。たとえば何が知りたいわけよ。
めんどくさいなら性格を改善しろよ。ここは知識的なことのアドバイスなら
できるが、お前の性格は直せん。
176 :
157:2005/07/02(土) 15:39:08
53番ポート使ってUDPで通信してるのは分かったんです
リゾルバとサーバのやりとりを、プログラムで再現したいんです
例えばwww.2ch.netのIPを取得したり
まずは句点をちゃんと打てるようになろうな。
179 :
157:2005/07/02(土) 15:49:13
>>177 そのページがまさに欲しかった物です
Perlは読めます
本当にありがとうございました
さようなら。
二度とこなくていいぞ。
自分が何を欲しているかもわからん、という状況はよく
あることだが、規格書とコーディング解説文の区別さえ
つかんもんかね?
ダメダメだあ
プログラミングよりまずは日本語の勉強から始めさせないと
184 :
157:2005/07/02(土) 18:02:01
お前らって面白いなぁ
自分より馬鹿そうな奴がいると集団で群がるのな
超おもしれぇ
煽りのレベルまで低いな
まぁガンガレ
186 :
157:2005/07/02(土) 18:12:02
言うと思った
187 :
157:2005/07/02(土) 18:14:58
188 :
デフォルトの名無しさん:2005/07/02(土) 18:16:17
|ヽ ,,|,~'i、 .,_ ,ri、 .l゙‐'"'i、 ,, ,i、 ,、 vi、
| k, ヽ广 | | 'l''゙l┘ .`'グ/ |゙l.,ィ |.| )゙l /'゙l″、 r-,、 、 .:c、、
ッ┘`,l゙ ,ノ ヽ ,,,,,`'′ .,/,,,!‐'', ,ノ う゜.| | .,ノ ヽ ,,,,,`'′ |゙l ゙l,ヽ .|゙l ヾi、
゙i、/゙,-'''i、 .く, .,巛 ‘r\ /.'゚_ / ./‐I / | | .〈、,l]゙l `',\ | | ,。 .,i´゙l | | . il゙ ゙l
l゙.l゙ ゙lッ'" ././ | | .,,) ゙l .!/]/ 丿 | .l゙.|、 /丿| | .,,〉.) | ゙l .,リ .`-" .l゙ | .,l〕 .ヽ"
/.l゙ j,i´ l゙,E.,l゙.| `'''′ l゙{ /,,| | ゙l,ヽ .゙l,d,,l゙ | `'''゙ ゙l ゙‐'| ゙l ゙‐'|
/ l゙ ゙l,~゙'''i、 .゙l´丿 | ゙l, '(/|゜| .゙-゙l .゙l`丿 \.,} \.,}
∨ `''ー" ゙'" ヽ ゙l ヽ} `" `
あるあるwwwwwwww
190 :
157:2005/07/02(土) 18:26:35
もまえらもうすこしおちけつ
どちらにせよ暇人が多いってこった
192 :
143:2005/07/02(土) 20:16:54
だがそれがいい
194 :
157:2005/07/02(土) 21:25:55
RFCなんていい出したのは158でしょ
最初にそういうすすめかたをする方がドキュソ
195 :
157:2005/07/02(土) 21:31:26
でも、人に説明聞くよりRFC読んだ方が早くね?
196 :
157:2005/07/02(土) 21:36:45
157大人気だな
157大人気ないな
157は多重人格でした チャンチャン
200 :
デフォルトの名無しさん:2005/07/03(日) 09:35:43
Winsockについて質問させてください。
通常はFD_READが来たらすぐrecv()するような処理を書くと思うのですが、
もし受信を放置してソケットからバッファを取り出さないでいると
何かヤバいことになったりするでしょうか?
それとも自動的に捨てられたりするのでしょうか?
>>200 UDPなら後から受信したデータが自動的に捨てられる。
TCPなら受信バッファサイズが不足していることが送信側に伝えられる。
通常、送信側は送信を一時停止するなりしてバッファに空きが出来るのを待つ・・・が、実際どうなるかは送信側の実装しだい。
>>201 > 実際どうなるかは送信側の実装しだい。
実際のところ、どんな OS がどんな変な挙動をするの?
203 :
200:2005/07/03(日) 10:06:14
>>201 なるほど、どうもありがとうございました。
>>201 > 実際どうなるかは送信側の実装しだい。
そういう実装があったとしても、それは仕様外の振る舞い。
結構デタラメな仕様なんですね。
サーバーにint型やfloat型のデータを送りたいんですが
どうすればいいんでしょうか
String型とかはわかるんですが。。
>>206 簡単だ
int型やfloat型をString型に変換して送ればいい
受け取り側でまた戻せばよかろう
208 :
206:2005/07/03(日) 16:24:42
で、できた(;'Д`)
207さん感謝です。
こんな簡単なことでよかったのねorz
209 :
143:2005/07/03(日) 18:15:36
>>208 人に聞いといて、「こんな簡単なこと」かよ。
よく今まで生きてこれたな、おめー。
でも実際「こんな簡単なこと」だしねえ
まことに申し訳ございません。
>>206は、我々の研究である、「チンパンジーにネットワークプログラミングをさせよう」
という試みの結果生じたレスであります。
まさか実験体5号が、人に質問するという、高度な問題解決の方法を図るとは考えておりませんでした。
今後とも生温かく見守ってやってください。
俺は
>>207の回答を見て、
>>206がどうやったのか、著しく気になるんだが
単にchar*にキャストしたのか
sprintfでも使うことにしたのか
でも"String"だから、Javaとか.NETとかなのかな。
ostringstream ost;
ost << f << " " << f2;
write(fd,ost.str().c_str(),ost.str().size());
とかだろか? memcpy(&buf[0],&f,sizeof(float));とかしたら
エンディアンやらコンパイラの吐くfloat形式やらで
間違いなく引っかかるし。めんどくさい。
>>2の方に図書コーナーがまとめてあるけど
ネットワークプログラミング初心者が一番初めに読む本としてはどれがいいですか?
一応TCP/IPについては勉強済みです
Winsock Programmer's FAQの「64ソケット制限」について読んだのですが、
WSAEventSelect()とWaitForMultipleObjects()では64個までのイベントしか
待つことができないため64個を超えるソケットは使用できないとありましたが、
WSAAsyncSelect()でも64個を超えるソケットは使用できないのでしょうか?
smtpクライアントをwinsockで作っています。
RCPT TO:<****@***.***>
のときに
550 relaying mail to ***.*** is not allowed
というエラーが返ってきて、メールの送信ができませんでした。
しらべてみると、サーバが「POP before SMTP」という方法を使用しているらしく
POP認証もしてみたのですが、
それでも、エラー返ってきます。
どのようにして実装すればいいでしょうか、教えてください。
219 :
デフォルトの名無しさん:2005/07/04(月) 17:54:55
単にsmtpリレー禁止鯖なだけじゃん
>>218 envelope-from もその isp のアカウントにしてますか?
そうでないならリレーと看做されてoutってことでは?
>>219 ありがとうございます。
リレー禁止なサーバの場合どのようにして他のドメインにメールを送るのでしょうか?
あて先アドレスの@以下の部分をとって接続先を
mail.(@以下)
とするだけで問題ないでしょうか?
>>220 はい、MAILコマンドのアドレスもおなじISPのものです。
POP before SMTPが使えるはずなわけですから、
以下のようなあたりを確認してみてはどうでしょうか。
1.試してみる
適当なMUAで、POPでメールを受信した後、メールを送信してみる。
2.もう一度試してみる
telnet popserver.xxx.xxx pop 、telnet smtpserver.xx.xx. smtp などして、
手動で試してみる。
2. 1と2に成功した場合には、プログラムを見直してみる。
先方の応答を無視してテキトーに流し込むコードだと、QUIT への応答が無いうちに
ソケットをcloseしてしまって、先方で sigpipe でアボーンしたりすることがあります。
USER, PASS, QUITのそれぞれについて、サーバからの応答をちゃんと受信しているか
確認してみてください。
>>221 > リレー禁止なサーバの場合どのようにして他のドメインにメールを送るのでしょうか?
つーか、自分の契約しているISPに、契約通りにIP接続して、自分に送りなよ。
それが成功しているなら、その旨はっきり明記しろ。
でなければSMAPer認定だ。
SMAPper な。 pは二つ。
すまぱー
SMAPerでもSMAPperでもねーよ馬鹿
SMAPファンの集うスレと聞いてやってきました
Sadism Masochism Assemple People
230 :
86:2005/07/05(火) 01:17:47
どうも。お久しぶりです。
GUIを持つhttpダウンローダーで、もがいていた者です。
いただいたご意見を基に
recvする毎にfwriteするようにプログラムを改造しました。
また一度のrecvサイズを256→65536byteにすることで固まり具合が軽減しました。
とりあえず動かしてみたところ、今のところ異常はないです。
プロジェクトファイルとかexeとか
http://up.isp.2ch.net/up/83b5e5f5550a.zip
非ブロックモードについて質問させてください。
これは受信データがくるまでブロックする機能をカットするだけなのでしょうか?
あ、recv関数に関しては、です^^;
受信データをバッファに書き込んでる途中に関数が返ったりしないのかなってことです(これは非同期かな^^;)
>>231 そうです。
ただし古いWindowsではデータを失うことがあります。
>>224さん
>>223さん
レスありがとうございます。
自分自身には問題なくメールをおくることができます。
telnetを使って試してみたところ、他のサーバに問題なく送れるようになりました。
しかし、ISPの接続を使わない(学校のネットワーク)でもう一度やってみたところ、
550エラーがかえってきました。
ISPの接続を使わない場合は、もしかしてPOPで認証してもSMTPで、
ほかのサーバにはおくれないのでしょうか?
また、ISPの接続では問題なくプログラムも動くようになりました。
ありがとうございます。
> ISPの接続を使わない場合は、もしかしてPOPで認証してもSMTPで、
> ほかのサーバにはおくれないのでしょうか?
それはISPのポリシー次第。
自分だったら、POP before SMTP程度じゃ外部から外部へのリレーは許さんね。
>>234 outgoing port 25 を遮断するNW管理者もいるので、
自前smtpクライアントは今後利用しにくくなるような気がする。
238 :
デフォルトの名無しさん:2005/07/05(火) 19:09:22
すいません質問させてください。
VC++でネットワークアダプタがPCに複数刺さっている場合に
アダプタ名からそいつが持っているIPアドレスを取得できる
APIがあると聞いたんですが教えていただけないでしょうか
お願い致します。
GetMultiNetworkAdapter();
ググっても出てこないっスね。 ヘッダファイルにも載ってない。
242 :
238:2005/07/06(水) 11:37:27
>>239 てめーいいかげんなこと言ってんじゃねーよドカスが
さっさとこの板強制IDにしろ
>>235さん
>>236さん
ありがとうございます。
メールの送信は何とかできました。
メールを送信していてわかったのですが、
日本語が文字化けするメールソフトがあります。
メールを送信する際に文字コードはどのようなものを使えばよいでしょうか?
テキストデータなら、
Content-Type: text/plain; charset=ISO-2022-JP
として、ISO-2022-JP。根拠となるRFCは1468。
>>245 迷惑だからその程度の人間はそんなソフト作るな
>>245 subject 等は ISO-2022-JPで mimeエンコード。
本文は ISO-2022-JP。
RFC2045、RFC2047あたりを参照。
RFCを読まずにネットワークアプリケーションを作ること自体が間違い
ちゃんと読んでいれば>245みたいな馬鹿な質問はしなくて済む
こういうこと?
答える側の態度も態度だな
誰も質問しにこなくなるぞ
漏れは一貫してちゃんと答えてるんだが。
>250
質問に答えることで生計を立ててる香具師でもいるのか?
256KBのデータを送ろうと、全部sendしようとする。
→ sendはエラーを返さないが、8KBしか送れない。
→ 次に続きの248KBをsendしようとする。
→ WSAEWOULDBLOCKが返る。
→ (しばらくしてからFD_SENDが来る)
WSAEWOULDBLOCKが返る例として過去ログにこういうのがありました。
上記のと同じ非ブロッキングモード+getsockopt()で送信バッファが8KBの状況でテストしてみたのですが、
2MBほど一気にsend()すると一回で全部送れました。
受信側アプリケーションも受信できていました。
過去ログが間違ってるのでしょうか。
それともWin2kが特殊で送信バッファを拡張したりするのでしょうか。
255 :
254:2005/07/07(木) 07:07:03
実験はサーバーPC(受信)、クライアントPC(送信)に分けました。
無線LANで接続しています。
受信側は何度かに分けて受信していました。(そらそうだ^^;)
ナント。send関数は一瞬で処理を返しました。エラーはでていません。
返った瞬間バッファをdeleteしたりとか嫌がらせしても負けずちゃんと送ってくれてるようです。
256 :
254:2005/07/07(木) 07:11:43
> ナント。send関数は一瞬で処理を返しました。エラーはでていません。
> 返った瞬間バッファをdeleteしたりとか嫌がらせしても負けずちゃんと送ってくれてるようです。
もしかして送信バッファの他にさらにセカンダリ送信バッファみたいなのがあり
send関数はそこにコピーするのでしょうか。。
# さらに補足、Winsock2です。
>>254 > 過去ログが間違ってるのでしょうか。
常にWSAEWOULDBLOCKになるわけじゃないから、間違ってない。
なる可能性を排除したプログラミングは間違いだが。
>>256 >もしかして送信バッファの他にさらにセカンダリ送信バッファみたいなのがあり
>send関数はそこにコピーするのでしょうか。。
カーネル(OS)は自前のバッファを持っています。
で、カーネル内のバッファにコピーが完了すると、
api 的には「送信できた」ということになります。
256Kバイトを1回送るくらいではブロックしないにしても、
速めのペースでずーと送っていればそのうちブロックするなり
WOULDBLOCKが帰るなりするでしょう。
>getsockopt()で送信バッファが8KBの状況で
たとえTCP/IP層でのバッファサイズが真に8Kだったとしても、
通常はその下のレイヤがもっとずっと大きなバッファを持っているので、
この「8K」という数字にはあまり意味がありません。
32MBまで一気に送信できたのですが、それを超えるとWOULDBLOCK飛び越えてWSAENOBUFSが返ってきました(´・ω・`)
262 :
デフォルトの名無しさん:2005/07/07(木) 19:13:10
初歩の質問です。
あるサーバの特定のポートに同時に複数のクライアントがアクセスすることは出来ますか?
サンプルを作ってみたのですが、ソケットでは1つのポートは同時には1つのクライアントしかアクセスできないようなのですが。
1 : N の CSシステムを作る場合、どうしたらいいのでしょうか?
(1)各クライアントがサーバの異なるポートを順次消費してゆく?
(2)ポート占有時間を短くして、ある程度の単位ごとに、クライアントを切り代える?
(1)の方が現実的のような気がしますが、一般的にはどんな方法がとられているのでしょうか?
ポートはサーバ側とクライアント側両方にあると何度いったらわかるんだろう。
acceptした1ソケットで1つのクライアントしか対応出来ないのは当然。
>>262 > (1)各クライアントがサーバの異なるポートを順次消費してゆく?
普通はそうする
> (2)ポート占有時間を短くして、ある程度の単位ごとに、クライアントを切り代える?
普通はそうする
> (1)の方が現実的のような気がしますが、一般的にはどんな方法がとられているのでしょうか?
普通は両方
>>262 サーバー側はlisten()したソケットでクライアントを待ちます。
接続できたらaccept()はそのクライアントと通信するソケットを返します。
最初にlisten()したソケットは使いまわしでまたaccept()で別なクライアントを待つことができます。
それを繰り返して通信するソケット(クライアント)が増えていくわけです。
268 :
デフォルトの名無しさん:2005/07/08(金) 15:55:40
エイジ
>>261 そこらへんの8kとか256kというのはOSやIPスタック依存のマジックナンバなので、
ほぼどんなサイズであろうとちゃんと動くように作るのが正解。
270 :
デフォルトの名無しさん:2005/07/08(金) 20:03:51
インターネットエクスプローラで
マウスの動きやキーボードの入力を覚えさせてマクロ化するにはどうしたらいいのでしょうか?
そのとき、データ送信や受信もしたいのですが。
手っ取り早くプログラミングをしらなくても手作業で
記録できるソフトとかは無いものでしょうか?
そのようなものがない場合はプログラミングでも結構です。
よろしくお願いします。
パスワードを記録して悪用するつもりですね
メッセージフックする。
どこがネットワークネタなんだよ
グローバルフックなりなんなり使え
>>270 あるからWindows板のくだ質スレ行け。
275 :
デフォルトの名無しさん:2005/07/09(土) 15:06:14
サブミットってなんなんバカのお前らでもわかるんちゃうん?
これくらい。
276 :
デフォルトの名無しさん:2005/07/09(土) 16:17:22
サーブルーチンってなんなん?
あほの諸君らにもわかるんちゃうん?こたえてみ!
サブミット-さぶみっと
野球で使う大きめのグローブ。その予備のこと。
またはプロトコル層の総称。
サーブルーチン-さーぶるー・ちん
1970年代に活躍した北京出身の俳優。チンさんの愛称で親しまれた。
その出演した映画を元にしてソケットプログラミングが誕生した。
278 :
デフォルトの名無しさん:2005/07/09(土) 19:05:46
やっぱおバカチャンのおまいらにはわからへんかったか
おもったとおりやわー
あの、すみません。あるURLから文字列を取得してエクセル等(表を表せられればなんでもOK)に活用するという
をしたいのですが、そういったことをするためにはネットワークプログラミングを勉強すればOKなのでしょうか?
もしそれがネットワークプログラミングで可能という事であれば言語は何が適当でしょうか。
URLをもとに内容を取得するライブラリを書くってのは
ネットワークプログラミングの一種だが、そういうこと
をするライブラリ関数は世の中にゴマンと存在するので、
今から書く必要はない。そういう存在するライブラリ関数
を利用するだけで十分。
だから、ネットワークプログラミングは不要。
言語は… perl あたり?
>>280 あ、そうなんですかぁ。実はいろいろ調べましたら何するにもC言語は基本らしいですから
今C言語始めているのですが、本当にエクセル等を使ってやりたい事ができるか不安になって質問
させて頂きました。まだ具体的にどのようにすればURLから文字列を取得してやればよいのか全然わかりませんが、
C→Javaを勉強しようと思っていたのを取りやめて
C→Perlにしたいと思います。
http://table.yahoo.co.jp/t?s=7202.t&g=d ここにあるような例えば出来高だけの文字列を取得してグラフ作れたら、
もうなんと言いますか最高なのですが、こんなことまでPerlで本当にはたしてできるのでしょうか?
疑って申し訳ありませんが、もしできるのであればプログラム(Perl)ってとても素晴らしく逆に
すごすぎで恐ろしいくらいだなと思いまして。。Perl信者になってしまいそうです。
>>281 とりあえず、Cの標準関数をマスターしてから来てください。
wgetを子プロセスで呼び出すのが最強
HTTPがtextベースのプロトコルで、perlが文字列処理について強い、
というのも、Perlのアドバンテーだな。
> HTTPがtextベースのプロトコルで
HTMLがtextベースだから、じゃなろうか
>>287 そりゃ関係ない。 httpを通してバイナリのファイルも送れるわけだし。
>>287 GET, POST, etc. やらヘッダーの事じゃないの
>>280 libcurl でも使えばいいんじゃね?
291 :
280:2005/07/10(日) 00:44:32
もちろんCでもできるんだが、
>>279の用途で、しかもどうやら
一からプログラミングを勉強するらしいのにCを使うってのは、
あまりお勧めできん。目的を達成するには、もっと楽な言語が
他にたくさんあるんだから、そっちを使うべき。
CにはCならではの良さが勿論ある (たとえば perl は C で
書かれているわけで、Cがなければそもそも perl も動かん)
が、こういう状況でベストな言語じゃないだろう。
俺はCが一番得意だが、この用途なら、スクリプト言語で済ますよ。
HTMLページの構成はしょっちゅう意味もなく変わるわけで、そう
いう変更に ad hoc に対応するのに C で書くのは面倒くさい。
別にCじゃなければperlが作れないというわけではないが?
そりゃそうだが、向き不向きはある。
現実問題として、今時のほとんどの言語処理系は、
Cで作られてるだろ。
Parrot の Perl コンパイラは Perl 自身で書かれてるんじゃなかったっけ?
GC 含め、ランタイムライブラリは C なんだろうけど
ML, Lisp, Smalltalk 辺りも大部分はターゲット言語で書かれてるね
C じゃないと書けない所だけ C で書いてる
Java で書かれてるのもそれなりにあるね
有名なのは Jython とか Scheme 系とか
横道にそれてしまったな……
>>279 みたいなのなら、適当なスクリプト言語探した方が良いと思う
みなさん、本当に有難うございます。
いろいろCやっていると今後もプログラム作りたくなった時など有効になるかとも思ったのですが、
どうやら目的達成だけの事を考えるとperlあたりが最適なのですね。勉強になりました。
>>285さんの方法はとても具体的で非常にありがたかったのですが、肝心の使い方がよくわかりませんでしたので、
(使い方もそうですがエクセル等に取得したデータを表にするという事もどうすればよいのか。。)
まずは、みなさんがお勧めのperlを勉強したいと思います。
あ、詳しくは勉強してからperlスレにて聞きたいと思うのですがperlは任意のデータを拾ってきてそれを表にするという事はできるのでしょうか?
もしできないのであればエクセルを勉強するのも一つの手かなと今になって思ったりしています。。
質問ばかりで本当に申し訳ないのですがどうか最後にもう一声だけお力をお貸しして頂けないでしょうか。ご迷惑おかけします。
Excelを直接操作するならWindowsやofficeのややこしいライブラリ操作を
覚えなければならない。これは中〜上級者向け。
ExcelはCSVファイルを読み込むことが出来るので、CSVファイルを作成す
るという方法もある。こっちは比較的難易度低め。初級者向け。
「URLから文字列を取得する」って一体何なんだよ。
HTMLデータが必要なのか、テキスト変換したのが欲しいのか、
DOMで扱うのが良いのか、URLそのものがデータなのか、どれなんだ?
>>297 > あ、詳しくは勉強してからperlスレにて聞きたいと思うのですがperlは
> 任意のデータを拾ってきてそれを表にするという事はできるのでしょうか?
ネットワーク関係ないからperlスレで聞け。
了解しました。URLから文字情報を取得する事はどうやらネットワークプログラミングの領域では
ないようなので(知りませんでした。すみません。)、perlスレかエクセルのスレ行ってきます。
今までありがとうございました。
表にするのがネットワークプログラミングじゃないだけだろ…
リジュームに対応したプログラムの作成はどのようにすれば学べるでしょうか。
今現在はWindowsで、InternetReadFileなどでちょっとした文書を取ってきて整理する
簡単なプログラムを書いているだけですが、ネットワークプログラミングに
興味が出てきたので、もう少しつっこんで学んでみたいのですが、
ググってもキーワードが悪いのか、なかなか望むような解説が見つかりません。
「猫でもわかる〜」は参考になるでしょうか。
つまんね
306 :
デフォルトの名無しさん:2005/07/13(水) 21:13:27
ACE
>>308 > (゚Д゚)ハァ?
( ゚д゚)ポカーン
64ってカーネル内の固定長テーブルのサイズの問題だろ?
しかも/threadの…
>>307 「・・・ようだ」という台詞がどんだけ信頼するにあたらないかの実例
312 :
デフォルトの名無しさん:2005/07/14(木) 18:40:09
同時に接続できるソケットは64個まででいいんですかね?
>>312 そういう仕様のOSならそれでいいんじゃないでしょうか。
LinuxやWindowsの話じゃないですよね。
えーと、
>>216や
>>307は、WaitForxxxやselectには64個の制限があることはちゃんと知っていて
WSAAsyncSelectを使った、Windowメッセージを使ったSOCKETの個数に制限があるかということを
ちゃんと引用付きで述べているわけですが、
>>308==
>>311みたいなバカは日本語がちゃんと読めないばかりに
よくわかってないまま知ったかぶりをして
墓穴を掘っていると言うことで良いですよね?
>>314 > WaitForxxxやselectには64個の制限があることはちゃんと知っていて
ヤレヤレ
316 :
307:2005/07/15(金) 04:51:44
>>308 なに偉そうにボケたこと言ってるの?
そんなところはちゃんと読んでるし、理解してるつもりだけど。
それより
>>216を読んで元の質問の意味を理解することをお勧めする。
もちろん、WSAAsyncSelectというものについても、よく勉強しましょうね。
fd_setに64という制限があるだけじゃなくて、
event機構にスレッドごとの64という制限があると書いてあるのだから、
当然同じ制限があるんじゃないのか?
WSAAsyncSelectはeventとHWNDの関連付けだけやって、
後はevent処理API群のお仕事だろ? (それを理解できてないのかな?)
まあ、microsoftはころころ仕様変えるし、
こういう制限を気にするのは(俺)サーバだろうから、想定している環境で試してみたらどうよ。
ん?WSAAsyncSelectがするのは、ソケットと、ウインドウメッセージの関連づけだろ?
なんでeventが出てくるんだ?
winsock内部で、オーバーラップI/Oで処理している可能性だってあるだろ。
想像の範囲内です
320 :
307:2005/07/15(金) 07:27:37
うん、俺様環境(win2kSP4)では、ちゃんと100個のsocketに対してメッセージが送られてきたよ。
まあlocalhost:8080でapacheを動かしておいてBCB6でTClientSocketを100個作り、
メッセージがちゃんと来ること、
HTTPレスポンスがちゃんと来ること
KeepAliveTimeoutによるDisconnectがConnectした順番とは別の順序で送られてくること
を確認しただけだけどね。
321 :
307:2005/07/15(金) 07:35:34
オーバラップドI/Oならイベントオブジェクトじゃん。
だからさー、WSAAsyncSelectは、
Winsock1.1の頃、つまり、Windows3.1の頃からあるんですよ。
その時代にもあったAPIに対して
「内部実装ではEventが使われている」などという仮定をしている時点で
「何トチ狂った決めつけしてるんだコイツ?」な訳ですよ。
324 :
トホホ:2005/07/15(金) 08:04:54
>>320 apacheってselect()じゃん?
listen backlogが長いだけじゃない?
325 :
307:2005/07/15(金) 08:09:03
何ボケたこと言ってるんだ?
サーバー側がapacheだろうとなんだろうと関係ないだろ。
クライアント側で100個扱えるかどうかテストしたんだから。
で、今度は
Windows版のApacheはMaxClientが最大64という制限があるって言い出すのか?
326 :
307:2005/07/15(金) 08:48:38
あ、こういうことか
・apacheはselectを使っている
・だから同時接続64の制限があるはず
・だから320-321はでっちあげ、もしくはいい加減なもの
・トホホ
いやあ、おめでたいことで。
1スレッド64まで
これを複数スレッドで64オーバーを実現してるって話じゃないの?
328 :
神:2005/07/15(金) 13:01:24
まあ、まあ、皆の衆。落ち着きなさい。
何が真実かそれは神のみしるのです。
アーメン;
よく分からんが
程よく熱々になってる人がいるのかな?
妄想を語りあってるだけですが何か?
331 :
デフォルトの名無しさん:2005/07/15(金) 20:14:55
誰か、仕事でACE(ADAPTIVE Communication Environment)を
使って通信プログラム作ってる人いませんか?
厨房な質問ですみませんが、ARPパケットの送受信のサンプルコードって
どこかにありませんか?
Apache Bench (ab)とかSubversionのコードとかではあかんの?
334 :
332:2005/07/16(土) 00:35:33
一応、ARPパケットの送受信はできている感じなんですが、動きが変なんです。
ホストAからホストBへARP要求を送信しても、recvfromでは、ホストAの
MACアドレスが返ってきたり、ホストBのMACアドレスが返ってきたりします。
あちこちのページをのぞいてみたのですが、よく分からず、
そのものズバリ!のソースを探している次第です。
よくわからないのですが、
Apache Bench とか Subversion ではRAWソケットを使っているのでしょうか?
イメージ的にはTCPのような気がするのですが。
ARPテーブルのキャッシュを参照するんじゃ駄目なの?
336 :
332:2005/07/16(土) 01:36:32
連発カキコすみません。
MACアドレスを知りたいという目的だけでなく、GARPも使いたいのでARPテーブルの参照では
ダメなんです・・・ごめんなさい。
>>334 > ホストAからホストBへARP要求を送信しても、
どんなARP要求やねん!
普通ブロードキャストやろ?
tcpdumpの結果晒してみい。
>>334 > イメージ的にはTCPのような気がする
突っ込みどころが多すぎる気が・・・
何をどうやってARPをTCPで送るん?
339 :
332:2005/07/16(土) 12:40:38
>>337 書き方が悪かったですね。
ホストAからターゲットをホストBとしてブロードキャストしても・・・と読み替えてください。
>>338 ApacheBench等がTCP/IPのような気がするという意味で書きました。
国語力なくてすんません。
だからtcpdumpのログ見せろよ。
ちゃんと-eつけろよ
この異常に態度のデカイ奴はいったい何様なんだ、、、
俺様じゃね?w
343 :
332:2005/07/16(土) 22:25:44
>>340 tcpdumpのログを取りながら、あれこれいじっていたら
キチンと応答が来るようになりました。ただ一点を除いて・・・。
(何が問題だったのかは、ただいまソースコードの比較中です)
各ホストをターゲットにしてARP要求をブロードキャストすると、
キチンと対象ホストからARP応答が来ます。
そこで、自分自身をターゲットにしてARP要求をブロードキャストしたのですが、
応答がなく(tcpdumpも何も吐かない)、タイムアウトしてしまいます。
自分自身から応答が来ると思っていたのですが・・・。
何か思い違いをしているのか、これが正しい動作なのか分かりません。
分かる方、教えてください。
勘で言う。
arpテーブルに、自分自身は表示されないのと関係がある!
てか、ARPパケットの送信ってどうやってるの?
RAWソケットだとパケット自体を自分で作って遅れるから
ARPにあわせたビット列を送るだけ
まあrequestの方はそれでいいけど、
responseの方は、kernelが勝手に送るから、
自前でARPを機能させたいなら、kernelのARPを止めないと。
自作TCPサーバライブラリがあるんですが
いろいろ使いまわしていていままで問題出ていないけど
時々、1000未満のポートで待ち受けするとおかしい現象が出る。
クライアントはconnectしているのにサーバはacceptしていない。
そういう現象ありませんか?
>>348 1024以下じゃないのか?FAQにちゃんと書かれてる
昔は特権ユーザでログインして利用していたとか…
>>31 切断されても帰るよ
そのときreadすると0バイト(エンドオブファイア)だったりする
353 :
デフォルトの名無しさん:2005/07/18(月) 23:31:41
ネットワークアプリ(TCP-IPでソケットプログラミング)についての質問なんですが、
select関数を使って、データが送信されたかどうか毎回LOOPしてチェックしている
んですが、これって、回線切断時にもselect関数の戻り値が1になって返って
来てるみたいなんですがどういう事かよくわかりません。
データが届いている時しか戻り値が1ではないんですか?
356 :
デフォルトの名無しさん:2005/07/18(月) 23:40:19
358 :
デフォルトの名無しさん:2005/07/18(月) 23:41:47
359 :
デフォルトの名無しさん:2005/07/18(月) 23:41:51
ちなみに、recvして戻り値は、0ではなくて-1になります。
切断されたら0ですよね?
エラーとして捉えてるんかな?
>>359 そもそも select の直の戻り値って見るものなのかな
Linux なら select_tut 見てみると分かりやすいかもしれない
あ、マジレスいらない・・・?
>>360 まあまあ
セレクト抜けて、でもゼロだったりエラーだったりしたら
それはもう別れの季節なんだよ
> エンドオブファイア
364 :
デフォルトの名無しさん:2005/07/18(月) 23:49:30
Linuxを使ってません。
現在はWindowsです。WSAAsyncSelect等もありますが
今は使っていません。(将来的にはLinux上でも動かせるようにしたい
んで。移植のことを考えてのこと)
select_tutはwindowsでも使えるんですか?
365 :
デフォルトの名無しさん:2005/07/18(月) 23:51:41
recvでエラーで、戻ってるってことは切断していいんですよね?
あと、もう一つ質問です。
recv関数を他のスレッドからも呼んでるんですが、
複数のスレッドで、recv関数を呼んでも大丈夫なんですかね?
>>365 大丈夫だよ
でも同時に呼ぶのはひとりずつにしなさい
二人以上で責めると壊れちゃうから
マニュアル読んで臍咬んで死ね。
368 :
デフォルトの名無しさん:2005/07/18(月) 23:59:32
標準関数?でも、駄目なの????
自分で作った関数は呼び合ったら駄目と思ってたんやけど。
俺、
>>365を見ていると、
自分の責任を無関係な人に押し付ける
社内にいる某バカタレとダブるんだが。
わからないというから親切におしえたものの
そいつの問題環境に一致しない回答をしたものだから
あとで世にでた製品に組み込まれたバグになった。
で、俺が回答した答えが悪いなんて言い出しやがって。
2chで書いて責任がどうなんてことは無いだろうが。
こいつの書き込みからそういう魂胆というか
普段そんな調子じゃないのか?というにおいがぷんぷんしてくる。
まあまあ・・・
select_tut は select のチュートリアルだからそのキーワードで検索すれば出る。
Windows でも Linux でも基本的には select は変わらない。
おそらくいろいろ基本が分かってないんだと思う。
というわけで recv でそんなにエラーが返ってくるのは勝手な推測だが、君がおかしなことをしてるから、と思う。
372 :
デフォルトの名無しさん:2005/07/19(火) 00:05:23
どういうところで、そういうふうに思ったのかな?
私は、自分の責任を無関係な人に押しつけた事なんてありませんよ?
しかも、教えて回答した答えが悪いって言われて
で?
373 :
デフォルトの名無しさん:2005/07/19(火) 00:07:30
ありがとうございました。
374 :
369:2005/07/19(火) 00:08:26
で、回答だが。
>>365 > recv関数を他のスレッドからも呼んでるんですが、
> 複数のスレッドで、recv関数を呼んでも大丈夫なんですかね?
大丈夫かどうかは、君が抱えている問題による。
「ここでアクセル踏んでも大丈夫なんですかね?」という質問に
どう答えればいいか考えてみよ。
自己解決しました
recvでエラーになるんだったらerrnoぐらい確認しろよ。
377 :
デフォルトの名無しさん:2005/07/19(火) 11:47:20
VisualC++でSSLのプログラム組みたいのですが
コンパイル時に必要な"libeay32.lib" "ssleay32.lib"を
どうしてもビルトできない。
Windows用の"libeay32.lib" "ssleay32.lib"を
ダウンロードできるサイト誰かご存じないでしょうか?
378 :
332:2005/07/19(火) 12:12:59
343の自己レス。
これが正しい動作ですね。自分自身へARP要求をするってことはG-ARPを
意味するので、これで応答があっては、ネットワーク上でIPが重複しているのか
そうでないのか判断つかなくなってしまいますよね。すごいアホな質問に
つきあってくれた方々ありがとうございました。
381 :
377:2005/07/19(火) 13:12:58
どうもありがとございます。
自分でビルトしようとしたんですが、
ヘッダー内の構文エラーと言われてしまっては
もう太刀打ちできませんorz
382 :
デフォルトの名無しさん:2005/07/19(火) 15:59:08
[上流のネットワーク]---[端末1]---[端末2]
端末1 - ブリッジ(FW)
端末2 - PCなど
上の図のようにつながっている構成で、
端末1上で端末2のIPアドレスを調べたい、と思っています。
端末2のほうが何かパケットを投げれば、
そのsrcアドレスを見て、すぐわかるんですが、
ただListenしているだけで、何も自ら通信しないような端末だと、
arpとかが流れるのを待つしかありません。
より早く確実に端末2のIPを調べるために、
何かしらのパケットを端末1から端末2に対して投げて、
その返答が受けられればいいのですが、
何か都合の良いプロトコルなどはないでしょうか?
とある端末のIP,Portを他の端末に送りたいとき
送り手側
send(sock, &sendaddr, sizeof(sendaddr), 0);
受けて側
recv(sock, &recvaddr, sizeof(recvaddr), 0);
これで、エンディアンを意識せずに送受信できますか?
こちらにはリトルエンディアンマシンしかないので実験ができません。
#define defhtonl(a) a=htonl(a)
#define defhtons(a) a=htons(a)
#define defntohl(a) a=ntohl(a)
#define defntohs(a) a=ntohs(a)
addr_send(int sock, struct sockaddr_in *sendaddr)
{
defhtonl(sendaddr->sin_family);
defhtonl(sendaddr->sin_addr.s_addr);
defhtons(sendaddr->sin_port);
send(sock, sendaddr, sizeof(struct sockaddr_in), 0);
//ネットワークバイトからホストバイトに戻すのは省略
}
//受信関数も省略
これだったらエンディアン気にせずに送受信いけますか?
addr_send(int sock, struct sockaddr_in *sendaddr)
{
defhtonl(sendaddr->sin_family);
send(sock, sendaddr, sizeof(struct sockaddr_in), 0);
defntohl(sendaddr->sin_family);
}
addr_recv(int sock, struct sockaddr_in *recvaddr)
{
recv(sock, recvaddr, sizeof(struct sockaddr_in), 0);
defhtonl(sendaddr->sin_family);
}
三度目の正直ということで・・・
portとipはすでにネットワークバイトに変換してあるから
famlilyだけをネットワークバイト、ホストバイト変換すればよかったんですね。
勉強になりました。
ぎゃー、間違い
addr_recv(int sock, struct sockaddr_in *recvaddr)
{
recv(sock, recvaddr, sizeof(struct sockaddr_in), 0);
defntohl(sendaddr->sin_family);
}
n, hを逆にしてました。
こっちが正しいです。
>>389 > portとipはすでにネットワークバイトに変換してあるから
なことはない。
してあるからってのは
自分のプログラムで既にしてるからって事ではなくて?
じゃないと、変換するのは、もう決まり文句みたいになってるから、まさか・・・・
393 :
382:2005/07/20(水) 12:16:25
返答ありがとうございます。
>>383 tracerouteってことはICMPですね。
それも考えたんですが、あて先アドレスをどこにするのか、ってのと
端末2がちゃんと返してくれるかがわかんないんですよね・・・。
>>386 同じくこれも考えたんですが、broadcastのpingに対して返事しない端末とかがあったんですよね・・・。
394 :
384:2005/07/20(水) 13:08:19
sockaddr_in構造体に入力するIP,Portって、
servaddr.sin_addr.s_addr = htonl(servIP);
servaddr.sin_port = htons(servPort);
こんな風に必ずすると思っていたんですけど、違うんでしょうか。
自分のプログラムでは必ずこのようにしています。
skypeはどうやってファイアウォールを超えているのでしょうか?
>>394 合ってますよ。391の意味は漏れにも解らない。
問題はそこではなくて、送信側、受信側の両方の実装においてsockaddr_in
内部のフィールドのレイアウトが同じであることが保証されるか、ってことの
ような気がします。
IP(v4)アドレスとポート番号を送りたいのなら、単に4バイト+2バイト送る式で
何の不都合も無いと思いますが・・・
うん。バイトストリームに変換しなしあ。
>>393 返事しない端末でも、ARPテーブルのキャッシュにはdynamicで残るから、
そこから拾うとか。
素直にnmap使え
>>397 > 問題はそこではなくて、送信側、受信側の両方の実装においてsockaddr_in
> 内部のフィールドのレイアウトが同じであることが保証されるか、ってことの
> ような気がします。
そもそもcompilerによって、あるいはcompile時のoptionによって、alignmentが違うし、
そうじゃなくてもfieldの数が違うケースがある。
*BSDやDarwinにはs*_lenがあるが、SolarisやLinuxにはない。
sockaddr_*型(つまり自分)のサイズが入る。
綴りが間違ってないか探してしまう俺ガイル
確実にするにはメンバごとのサイズ、型を自分で決めて送信、受信ですか。
long, shortの組でいこうと思います。
これならC言語でバイト数が定義されていますので。
スレ違いかもしれないけど
今P2Pアルゴリズム関係をいろいろ調べてるんだけど、分散ハッシュだと
完全一致の検索が早いのはわかったけど、あいまい検索で高速なアルゴリズムって
なんかあるの?
>C言語でバイト数が定義されています
!?
態度でかい奴ムカつく。
相談室だろ?ここ。
貴様の態度はでかくないとでものたまうつもりか。
>>406 たしかに画期的なものを発案するのは無理そう
>>407 やっぱないのかな
Winnyのクラスタ概念はいいアイデアだと思うけど
検索対象の急激な変化には耐えられないという欠点があるしね
すべてを検索できない
Skypeのユーザ検索はホストが存在してるのかな?
なにかいいアイデアはないものか
教えを請う乞食の立場で言うのと、
ロハで教えてやる立場で言うのでは
態度が異なるのは当然だろ。
回答をお求めになるお金を払っていただける
お客様にも態度が異なるのも当然でございます。はい。
金持ちはみんなケチだよ
金持ちはケチではない。金の使いどころが上手なんだよ。
>>417 それを ケチ と称するんだよ
全分野においてお金を使いたがらないのはケチではなく
ただの貧乏性だ
>>418 かわいそうに。頭がおかしい人なんですね。
性格も悪い。
初歩的な質問で申し訳ないのですが
ホストAからホストBへnバイトのデータを送信するときに
Aのネットワーク障害でnバイト中のmバイトしかBに届かなかった場合
read()をするとmバイトはデータを得られるはずですが
そこから残りのn-mバイトを受信しようとread()を実行するとどうなるのでしょうか?
即座に何かしらのエラーを返すのかTCPのタイムアウトまで待たされるのか
実験する環境もないのでよくわかりません
すいません、IMみたいなプログラム作りたいんですが、
この場合はメッセージ送信用ソケット、メッセージ受信用ソケット
をそれぞれ用意しないと駄目なんでしょうか?
>>421 どういう障害かによるが、たとえばケーブルが切れた、といった状況を
想定すると、read()だけでは検出する手段は無いよ。
read()は単に永久にブロックする。
そういう状態を検出したければ、キープアライブオプションを設定するか、
自分でread()にタイムアウトを設定するか、ハートビートとして何かの
電文を定期的に送信するか、といった手法を取る必要がある。
>>422 TCP なら双方向通信なんだから、1個のソケットで送信と受信できるだろ。
UDP なら2ついるけどな。
425 :
422:2005/07/22(金) 21:29:53
んっと、どういえばいいんでしょうか。
相手のメッセージを受信する場合はrecv()を呼ぶ必要があるわけです。
ですが、recv()でメッセージを待っている間は次の処理に進みません。
send()を呼んで連続してメッセージを送ることができません。
これを解決するにはソケットを2つ用意しないといけないと思ったんですが・・・
>>425 非常に単純な実装としては、例えば select して読めるなら recvし、
読めた分だけバッファに追記する。んで1メッセージとおぼしき分だけ
バッファに溜まったら、画面に出力する。
この処理の過程にはブロックする箇所は無いので、送信が必要なら
この処理の前後にでも間にでも行えばいい。
他のやり方としては、
読み出し用にスレッドを一本起こすとかそういうことをしても良いし。
427 :
422:2005/07/22(金) 21:45:48
書き直し。
多人数でサーバーを介さずにIMを行いたいです。
このときに、メッセージを誰がいつ送ってくるのか分かりません。
特定のメンバのメッセージ受信を待っている間は他のメンバのメッセージを受信できません。
そこで、ソケットを二つ用意して、マルチスレッドを利用すれば
メッセージ受信専用ソケットは常にメッセージを受信して、
もう一つのソケットでいつでもメッセージを送信することが可能になると思いました。
そうなれば、多人数でのIMができると思ったのですが、
ソケットを二つ用意する必要があるのがいまいち納得できません。
ソケットひとつで多人数でのIMを実現する方法はありませんでしょうか。
429 :
422:2005/07/22(金) 22:02:13
>426さんありがとうございます。
スレッドを一本用意して実装してみたいと思います。
ソケットは同じものでも同時に送受信できるよ
詳しく書くと
送信で待機させられることはないから
送信はUIと連動させて(ボタン押したら送信ね)
受信はスレッドを立てて同じソケットを受信待機しといて
メッセージが来たらUIに反映させてまた受信待機に入るようにすればいい
ソケットは共有ね
> 送信で待機させられることはないから
あるってばさ。
non blocking mode にしとくとか、
送信用にスレッド立てるとかすればないけど。
433 :
デフォルトの名無しさん:2005/07/23(土) 03:06:07
SP2ってrawsocket使えないみたいだけど、TCPヘッダのsynやackとかのフラグって
変更できるのですか?
TCP raw socketを使っては無理。
NDISのレイヤーを自分で叩いてください。
435 :
433:2005/07/23(土) 16:25:12
>>434 ありがd。
ドライバ関係はわかんないんでwindowsはあきらめます。
winsock2のRAWがWindowsXP SP2で利用できないってこと?
438 :
デフォルトの名無しさん:2005/07/23(土) 20:23:13
どなたか教えてください。
ネットワークの接続をつかってダイアルアップ接続したり、
接続が現在確立されているのか、切れているのかを監視したりしたいのですが、
どのようなAPIを使えばできますでしょうか?
439 :
438:2005/07/23(土) 20:24:03
すみません、
>>438はWinXPです。
よろしくお願いします。
開発環境・言語・コンパイラくらい書かなきゃ
>ドライバ関係はわかんないんでwindowsはあきらめます。
winpcapが代わりに叩いてくれるだろ。
442 :
438:2005/07/23(土) 21:09:33
RAS接続で検索しる
445 :
438:2005/07/23(土) 22:37:11
ありがとうございます。
では。
UPnPを日本語でわかりやすく解説してるサイトない?
そんなお前には例え日本語で解説しても使えないよ。
>>447 そんな頭ごなしに決め付けるな!
猫だってしつければきちんとトイレを覚えるんだぞ!
やれば出来るって!
日本語のはほとんどないね
uPnPのプロトコルの解析したのがどっかにあったの見たけど
見たらえらい単純な構造だったけど、バックドア系のウィルスなんかに悪用されないように
情報があまりでまわってないのかな?
解析するまでもなくUPnPフォーラムとかで思いっきり公開されてますが
> バックドア系のウィルスなんかに悪用されないように
これはあってもおかしくないと前から思ってるけど
あまり話を聞かないんだよな
もはや当たり前すぎて話題にも上らないんだろうか
452:
別段UPnPを使う必要も無いからでは?
UDPで十分・・・とか?
uPnpはUDPなんですがね
馬鹿ばっか。
はいはい。おまえもなーですね。はいはい。
>>454 netshじゃないの?
亜種がたくさんあるからUPnP使ってるものがあってもぜんぜん不思議じゃないけど
458 :
デフォルトの名無しさん:2005/07/26(火) 23:24:02
ソケットプログラミングで、帯域制限をかける場合はどのようなコードを書けばよいのでしょうか?
FTPソフトなどで、ダウンロード速度制限機能とか付いてますが、どのように実装しているのか?
ってことです。
while(1)
{
時刻取得A
recv()
時刻取得B
sleep(理論値の時間-(B-A))
}
みたいなコードを書いたのですが全く駄目です。
そもそも、OSが用意して入れているAPIのみで実現できるのでしょうか?
OSはLinux上で実装予定です。
よろしくお願いします。
459 :
デフォルトの名無しさん:2005/07/26(火) 23:24:59
ソケットプログラミングで、帯域制限をかける場合はどのようなコードを書けばよいのでしょうか?
FTPソフトなどで、ダウンロード速度制限機能とか付いてますが、どのように実装しているのか?
ってことです。
while(1)
{
時刻取得A
recv()
時刻取得B
sleep(理論値の時間-(B-A))
}
みたいなコードを書いたのですが全く駄目です。
そもそも、OSが用意して入れているAPIのみで実現できるのでしょうか?
OSはLinux上で実装予定です。
よろしくお願いします。
sendrecvの一回に送るバッファを制限したらいーんでないの?
// 100kbに制限
while(1)
{
char buffer[1kb];
send-recv(buffer, 1kb);
sleep(10);
}
省きすぎた。秒間100kbに制限な。
1000/100=10とか、sendrecvの処理時間考慮してない。けど
制限速度を下回っても超えることはないから問題ない。
462 :
デフォルトの名無しさん:2005/07/28(木) 00:41:28
C#と.NET FrameworkでUDP通信をしようとしているのですが、
昔Winsockで行ったときはできたのですが、感覚の違いからか全く理解できんのです・・・
ちなみにTCPで単純なチャットプログラムを作ったところ上手く行ったのですが、
UDPにした途端・・・
UDPでサーバ側待機するときのbindに対応するのはどこがどうなるんでしょうか?
クライアント側で接続を確立する時はUdpClient()?Connect()?
便利な関数のオーバーロードがありすぎでどれをどう使ったら適切なのかもう混乱・・・
それっぽいコード書いたら待ってないはずのポートで受信してたり、
待ってるはずのポートは待ちぼうけだったり・・・
聞く場所おかしいかもしれないですが、どこで聞けば適切かも分からず・・・
何方かご教授お願いできませんでしょうか
UDPではconnect()がいらないよん。
いきなりデータ送信してよし。
>>462 そのものズバリが出てるんで参考にせよ。
ttp://dobon.net/vb/dotnet/internet/udpclient.html 簡単に説明すると、UdpClient クラスに bind は無い。そのかわり、コンストラクタ
で bind するポートを指定することで bind する。
あと、UDP では connect は必須じゃない。connect すれば send の時に
アドレス指定しないでよいという利点はあるが、他のアドレスへ送信できな
くなるので良し悪し。セコくインスタンスを使いまわすなら connect しない
ほうがよい。
>>463,464
ありがとうございます。
コンストラクタを使ってbindでしたか・・・
参考のページを見ないまでに見事正常動作しました。
しかしMSDNに手順を追って書いてもらえるといいんですがね・・・
ただ単にオーバーロード列挙してあるだけなんで余計混乱。
ともあれ、頭の中でかなり閃いてしまったのでもう少しコード書いてきます。
本当にありがとうございました。
>>465 手順はTCPの教科書を適当に見ればOK
467 :
464:2005/07/28(木) 21:26:30
>>465 俺もコンストラクタで指定すると初めて知った。ちょっと不親切だよな。
慣れてるとつい bind メソッドを探してしまう。
468 :
デフォルトの名無しさん:2005/07/29(金) 07:37:27
質問です。
UDPによるTCPエミュレーションをやってるようなライブラリやサンプルはありませんか?
言語はCが良いです。
Win・UNIXは問いません。
>>468 好奇心です。
そんな微妙なもの何に使うのですか?
471 :
468:2005/07/29(金) 11:25:22
まず、動機としては確かに好奇心で趣味の範囲内です。
やりたい事は、最近ちらほらと話題に出てくるUDP Hole Punchingの実験をしてみたかった事
それで、エラー処理がある程度必要になってくるようなのを作ろうとしてるので、既にそういうライブラリがあるならそれを使うかな? と
474 :
デフォルトの名無しさん:2005/07/29(金) 23:14:14
Socket tuusin 1ppo matigaeba DoS kougeki.
475 :
デフォルトの名無しさん:2005/07/29(金) 23:33:03
TCP/IPやその下のレイヤ(etherとか)について詳しくなりたいです。
バカ猫でも分るサイトありませんか?
本でもいいです。
そんな質問する子には
基本情報技術者試験の参考書辺りすすめとこうかな
バカ猫には逆立ちしてもわからん。
2〜3回IPスタックから自分で作ってみれば詳しくなるよ。
最初はヘナチョコでもいい。がんばれ。
Winsock固有の話もここで良いのだろうか・・・?
いい。
んでは。
かなりスケールする必要のあるサーバプログラムの設計をしています。
扱うセッションは、長くて同時接続数も多いもの、同時接続数は少なくいが
スループットが要求されるもの、の二種類があります。
どういう実装が好ましいか、というのが今のトコロの問題です。
とりあえずプロトタイプとして、
・同時接続数の大きい方のセッションは、1スレッドでOVERLAPPED IO で処理する。
・同時接続数が小さい方のセッションは、セッション毎にスレッドを立てて処理する。
という実装を行っているのだけれども、タイムアウト処理の綺麗な実装方法があるなら、
どちらもIOCPでまとめてやってしまいたい。
IOCP 使うときにタイムアウトって普通はどう実装するの?
>>483 確かにどうやればいいんだろう。
ちょっと考えてみた。
現在接続しているソケット記述子と、
そのソケットで最後にsendなりrecvなりした時刻を一緒にして管理しておいて、
GetQueuedCompletionStatus()の最後の引数で一定時間ごとに制御を戻して確認->クローズ
あるいは別にタイマを用意して一定時間ごとに……。
効率悪い?
SO_SNDTIMEOとかその周辺は?
>>484 ICOPで投入したIOリクエストに対するタイムアウト処理です。
>>485 タイマーが良いのかな。.Net の非同期IOのサンプルコードでも、
タイムアウト処理はタイマー立ててやってますね。
んでスレッドが違うからCancelIO相当の処理は出来ず、
ソケットをクローズして処理中のIO要求を完了させるという・・・
>>486 その辺が使えれば異様に簡単なので、ちょっと試して見ます。
ありがとうございました。
488 :
484:2005/08/01(月) 14:42:57
connect要求に関しては、ホストごとの設定がある。
/*thread1*/
uchar buf1[1024];
memset(buf1, 0x11, 1024);
send(sock, buf, 1024);
/*thread2*/
uchar buf2[1024];
memset(buf2, 0x22, 1024);
send(sock, buf2, 1024);
TCP/IPプロトコル・マルチスレッドにおいて、
上記のように同じソケットにたいしてほぼ同時に異なるスレッドからそれぞれデータが送信された場合、
受け取り側には
0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22
または
0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11
かどちらかの形でデータが届き、その境界を判断することはできないが、
0x11, 0x11, 0x22, 0x22, 0x22, 0x11, 0x22, ..............................................................., 0x22, 0x22, 0x11
このように両方のデータが混在して届くようなことはない
こういう考えでプログラム組んでいっていいんですよね。
駄目です。
良いです。
ウワァァァァァァヽ(`Д´)ノァァァァァァン!
どっちなんだよぉぉぉ
0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22
または
0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11
こういうふうにくることはないよ
必ずどちらか一方で一旦戻される
0x11, 0x11, 0x11, ..............., 0x11, 0x11, 0x11,
か
0x22, 0x22, 0x22, .............., 0x22, 0x22, 0x22,
ただし
0x11, 0x11, 0x11, .....
......, 0x11, 0x11, 0x11,
なんてこともある
>>493 あほ?
>>489 駄目です。
send()したものが、一つのTCPセグメントになることは保証されていません。
ぶつ切りにされることはあっても割り込まれることは無いよ
ここは嘘にまみれたインターネットですね
sendは不可分だから、ひとつのスレッドで複数回呼んでなければごたまぜにはならないでしょ。
もちろんデータ欠損の可能性はあるけど。
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/intermediate.html#threadsafety 日本語だと分かりにくいので本家
http://tangentsoft.net/wskfaq/intermediate.html#threadsafety 非同期IOを使った場合、少なくとも
>>489の
>0x11, 0x11, 0x22, 0x22, 0x22, 0x11, 0x22, ..............................................................., 0x22, 0x22, 0x11
>このように両方のデータが混在して届くようなことはない
は保障されるんじゃない?
そもそもそんな仕様書にも定義されてないようなことをやるほうがおかしい
自分の回線速度サーバを使わずに図る方法ってありますか?
>502
TCP
505 :
500:2005/08/02(火) 02:24:15
MSDNを探してみた。
どこにも保障するとは書かれていないね。
ちょっとスレッドセーフとは違う気もするけど、
MSDNでは、たとえばWSAAsyncGetHostByName()の場合、
多重に名前解決をすることはできないと明記されている。
注意すべきところではちゃんと記述しているみたい。
WSASend/Recvにこんな記述があった。
>If you are using I/O completion ports, note that the order of calls made to WSASend is also the order in which the buffers are populated.
>WSASend should not be called on the same socket simultaneously from different threads, since it can result in an unpredictable buffer order.
適当訳
完了ポートへの通知は、バッファの登録順にやってくる。
WSASend/Recvは、異なるスレッドから同時に呼び出さないほうがよい("should")
バッファの順番が予測できないからである。
これを読むと、
マルチコアな環境で、同時にバッファA、バッファBを非同期IOでWSASend()した場合、
どちらが先に送信されるかは分からない。
でも、
各バッファの中身は、そのまま送信される、というように読めるんだけど……。
506 :
500:2005/08/02(火) 02:29:36
一応訂正
×WSASend/Recvは、異なるスレッドから同時に呼び出さないほうがよい("should")
○WSASend/Recvを、同一のソケット記述子に対して、異なるスレッドから同時に呼び出さないほうがよい("should")
Winsockはスレッドセーフの実装はゆるされてるけども、スレッドセーフじゃないそうな
どうせやるならCriticalSectionでロックしてスレッドセーフにしなさいということらしい
>>505,506
もういいからやめれ!
Windowsであると勝手に仮定しているし、
sendじゃなくてWSASendになっているし、
そもそもWSASendは渡したデータを全てすぐに送ると約束してない。
>>489 どのOSかと、TCPなのかUDPなのかくらい書いて。(「TCP/IP」じゃなくて)
その情報がないと「駄目」って答えになるね。駄目な状況、環境があるから。
509 :
489:2005/08/02(火) 10:58:48
現在はgcc 3.4.4にて組んでおりますが、
できればwin環境にも対応したいと思っていますので
unix, winどちらでもできたほうが嬉しいです。
通信ソケットはどちらでも
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
です。
512 :
489:2005/08/02(火) 12:08:30
ん、>508さんがOS聞かせてといわれたので答えたのですが・・・
結論は
受信、送信する場合はどれかのスレッドに一任すること。
もし複数のスレッドでデータを送受信したければフラグなり
何なりを利用して排他制御を行うこと。
でしょうか、勉強になりました。
ありがとうございました。
>>512 はい。
send()の帰り値もちゃんと見て処理してねん。
514 :
デフォルトの名無しさん:2005/08/02(火) 23:05:13
socket? bakajane?
>514さん
もしかして馬鹿janeという新しい派生ブラウザが誕生したんですか。
情報ありがとうございます。
そして3ヵ月後に本当にbakajaneが開発される
517 :
デフォルトの名無しさん:2005/08/03(水) 03:57:14
そのときはいちいちスレッド一覧をクリックしなくてもホイールでスクロールできるようにしてくれ。
>>517 そのくらいなら今のでも普通に出来るだろ・・・
というか、クリックしないでスクロールされても
困る場合の方が多いけどな。
519 :
デフォルトの名無しさん:2005/08/03(水) 19:09:55
ついでにIEコンポーネント?でHTMLの表示をしている部分なんだが、検索して、他のコントロールさわっただけで
F3押しても最初から検索するのを何とかしてくれ。
ついでにhttpリンクをダブルクリックしても飛ばない仕様を何とかしてほしい。攣りそうなほど光速でクリックすると反応するがw
>>518 できないだろ。スレッド一覧で、カラムの無いところをクリックしてそのウインドをアクティブにしないとホイールが聞かない。
スレッドのカラムの無いところをいちいち触らないといけないのは煩わしいだろ。
スレッドを触ると勝手にダウンロードされるし。
カラムのあるところをホイールクリックしてもいけるけど
>>519 もんくいわずにどこでもほい〜るつかえ
あと、F3はスキンでなんとかしろ
なんでもぐちをいえばねがいがかなうとおもうなよ
オープンソースだったら
マ人らしく改良しちまえ
libpcap以外でEther Frameをキャプチャしたいんですが
他にどんな方法があるのでしょうか?今更車輪を開発したいわけではなくて
勉強のためなのですがどこから手をつけてよいやら全くわかりません。
まあ大体においてraw socket。
Winsockの場合、ローソケはバージョン依存がひどいので実質使えない。
Winsock2のLSPとか、フィルタドライバを使うことになるだろうなぁ。
Windowsの場合はWinsock2+LSPという構成で勉強するといいのですね
その他LinuxやBSDでは、LawSocketからデータを取得すればよいのですね
とりあえずその辺について理解して、EtherFrameから何か情報を抜き出せるところ
まで学習してみたいと思います。どうもです。
だいたい、Linuxでrawsocket開いて、EtherFrame横取りすることには成功しました。
あとはどうやってデータ構造にアクセスするか知れば情報は引っ張れそうです。
WinsockのLSPというのは良くわからないですね。Cでもいいのでサンプルか何かあれば
いいのですがMSDNにはLSPをインストールするとかいう意味不明なサンプルしかないですね
LSPちょっと難しいようですね
Linux上でCでプログラミングしています。
自分のIPアドレスを取得したいのですが、どのような関数を使用すれば取得できるのでしょうか?
>>533 ・コピペミス
・ネットワークに接続されていない
のいずれか
535 :
533:2005/08/08(月) 22:14:48
コピペミスは無いと思います。
ネットワークに接続されていないというのは、
正確に言うとどこまでを指すのかわかりませんが。
今スレッドに書き込みしてるPCでプログラムの実行をしています。
サーバ、クライアント共に同じPCでの実行なので、
127.0.0.1と192.168.11.3(LAN内でのこのPCアドレス)
を試してみましたが両方10038が返って来ます。
SOCKET sock;
sock = socket(ふにゃららふにゃらら);
お前さんのふにゃららふにゃららの部分をコピペしろ
ここにいる人間はエスパーじゃないからもっと詳しい情報がないと答えれないぞ
538 :
533:2005/08/08(月) 22:48:51
>
ttp://www.geekpage.jp/programming/winsock/tcp-3.php >のソースをそのままコピペして実行しても10038が返ってきてしまいます。
と、書いたとおり、HPに載ってるソースをそのままコピペしました。
>>536さんが言うように抜粋すると
SOCKET sock;
sock = socket(AF_INET, SOCK_STREAM, 0);
bind(sock, (struct sockaddr *)&addr, sizeof(addr));
listen(sock,5);
sock = accept(sock, (struct sockaddr *)&client, &len);
n = send(sock, "HELLO", 5, 0);
closesocket(sock);
sockに関連する記述部分は以上です。
>>537 VC6++を使用してますが、
プロジェクトにws2_32.libは参加させてあります。
プログラム自体はきちんと走ります。
上記URLのプログラムではエラー表示をさせているので
それで「10038」のエラーが出ているとわかりました。
>sock = accept(sock, (struct sockaddr *)&client, &len);
sockを上書きしてるけど
10038 WSAENOTSOCK
WSAStartupじゃねーの?
/
/
` ー
sock = accept(sock, (struct sockaddr *)&client, &len);
だって!! _,.>
r "
\ _
_ r-''ニl::::/,ニ二 ーー-- __
.,/: :// o l !/ /o l.}: : : : : : :`:ヽ 、
/:,.-ーl { ゙-"ノノl l. ゙ ‐゙ノノ,,,_: : : : : : : : : :ヽ、
__l>ゝ、,,ヽ /;;;;;;;;;;リ゙‐'ー=" _゛ =、: : : : : : : :ヽ、
/ _________`゙ `'-- ヾ_____--⌒ `-: : : : : : : :
...-''"│ ∧ .ヽ. ________ / ____ ---‐‐‐ーー \: : : : :
! / .ヽ ゙,ゝ、 / ________rー''" ̄''ー、 `、: : :
.l./ V `'''ー-、__/__r-‐''"゛  ̄ ̄ \ ゙l: : :
l .,.. -、、 _ ‐''''''''-、 l !: :
| / .| .! `'、 | l: :
l | .l,,ノ | ! !: :
/ '゙‐'''''ヽ、 .,,,.. -''''''''^^'''-、/ l !: :
r―- ..__l___ `´ l / /: :
\ `゙^''''''―- ..______/_/ /: : :
` ^゙´
ま、だーいたい絶対に間違っていないと思うところにバグがあるもんだ
543 :
533:2005/08/08(月) 23:14:35
完全なコピペでやってませんでした…。
そこだけ自分で修正してました。。。
オリジナルのソースではSOCKETを2つ作っていて
なんでかわからず、sock0→sockにしていました。
>>534のコピペミスが大正解でした…。
すみませんでした。
ありがとうございました。
完全な荒しじゃねーか!
> と、書いたとおり、HPに載ってるソースをそのままコピペしました。
(゚Д゚)ハァ?
ソケットが2つ必要な理由が分かってないのにネットワークプログラミング(コピペ)ですか
多分挫折するね
最初はそんなもんだ
ネットワークプログラミングを初めて1週間やそこらで完璧になるわけがない。
たくさん転びながら学んでいけばいいさ。
プログラミング以前に、人としての誠実さに欠けている。
MSN Messengerなどでは、LANにつながると同時に、自動的に接続を試み始めますが、
LANが接続されたときに送られてくるメッセージなどはあるのでしょうか?
551 :
デフォルトの名無しさん:2005/08/09(火) 07:57:04
LANが開始された瞬間IPが振られる
>>552 どのようにネットワークコネクションが確立されたタイミングを検出しているのかを知りたいです。
IP Help APIでも使ってネットワークアダプタの状態を調べてください。
>プログラマってそんなやつばっかだろ?
「プログラマ」は「2chネラ」に置き換える必要があるな(▽
メッセンジャーを作りたいのではなくて、メールリーダーで、ネットワークアダプタがアクティブになった際に
サーバへのアクセスを開始したいのです
普通にPINGすりゃいいんじゃないでしょうか
.Net Passportってかなりリソース食ってるからたぶんPINGしてるんだと思うよ
しかも定期的に大量のクライアント情報を送信してる模様
>>557 こういう事は最近のネットワークアプリは考えることが大切だと思う。 ハイバネーションから立ち上がったりとか、
Wifiのネットワークを切り替えるとか、VPNを上げたり落としたりとか最近のネット環境は非常にダイナミック。
そのたびにハングするようなアプリではいけない。
自分はどうすればいいのか知らんが。
今時のアプリはDNS引き直す、TCP接続張り直すくらいはあたりまえ。
じゃないとサスペンドした後、リジュームしたら別のネットワークだった、
こういう事態に全く対応できない。
おおっ!
MIMEのマルチパートについて質問させてください。
Content-Typeのmultipartの副型である mixed と related に関してです。
一応、自分で調べた限りでは
mixedは、各パートが独立している。(RFC 2046)
relatedは、複数のパートの内、あるパートから他のパートを参照している。(RFC 2387)
という特徴があることがわかりました。
しかし、色々と調べているうちに下記の資料を見つけて
混乱しています。
ttp://www.umin.ac.jp/http-man/ 上記の資料(日本語)の4.2.1.1で
「"multipart/mixed"メディアタイプは、最初のボディーパートが同時に送られる
他のボディーパートへの参照を含む場合に使用される。」とあります。
これでは、relatedと同じようなことを意味していて
両者の違いが分からなくなってしまいました。
そこで、質問なのですが上記の資料は、どのようなものなのでしょうか?
何となく RFC 1945 の元になっているような感じがするのですが・・・
また、mixed と related の明確な違いを教えてください。
>>563 > そこで、質問なのですが上記の資料は、どのようなものなのでしょうか?
古い。RFCの予稿。
>>3で最新を参照せよ。
> mixedは、各パートが独立している。(RFC 2046)
> relatedは、複数のパートの内、あるパートから他のパートを参照している。(RFC 2387)
昔はmixedとContent-Location:などで"related"相当を記述。
その後relatedが出来た。
http://www.ietf.org/rfc/rfc-index.txtの「Updated by」を見て最新のものを。
「Obsoleted by」なものを信じてはいけない。
>>564 助かります。
実は、RFCに関しては、存在自体は知っていましたが
詳細は知らないため、どう見ていいかもわからず途方にくれてました。
ありがとうございました。
>>564 ひさしぶりにRFC-JPのサイトを覗いて見たら完全に死んでるのね。
ACEについて詳しく説明しているサイトないですか??
ACE_ThreadとACE_SOCKについて探しているのですが、いまいちよくわかりません。
死んでるってのは2001年以降新たなRFCが翻訳されていないってことか
サーバが死んだのかと思った
ページは更新されているしねえ。
>>567 本家のページと書籍。
MSはソケットを閉じるときは「優雅なクローズ」をしろといっていますが、
shutdown()とは、一体何をしているんでしょうか?
send()したあと、すぐにclosesocket()したら、
送信先にデータが届く前に切断されてしまって、
shutdown()を挟んでやるだけでちゃんと送信されるようになったのですが。
最後のsend()
↓
shutdown(SD_SEND);
↓
recv()でバッファ空まで受信
↓
shutdown(SD_RECIEVE)
↓
closesocket()
だっけか。ちゃんとした手順は。
573 :
570:2005/08/12(金) 17:54:48
なんか切断するのにもやたらと手順を踏むんですね。
shutdown()ってブロッキングソケットに対して呼び出したらブロッキングを起こしますか?
MSDNだと、FD_CLOSEが来るまで待つとなっていて、
ブロッキングソケットの場合が書いてないような。
起こしません。
TCPスタックの仕事です。
つーか殆んど全てのAPIで"CLOSED"になった瞬間を知るのが困難。
575 :
570:2005/08/12(金) 18:18:45
>>574 すると、ソケットプログラマにとっては、
インターネットのTCPソケットで、shutdownをSD_SENDで呼び出したら、
すぐにclosesocketしようがデータは必ず送信されると考えていいんですか?
もちろん、ハード上の障害(LANケーブルが引っこ抜かれたとか)は考えない場合。
そのためのshutdownです。
HTTPプロキシクライアントを実装したいのですが
参考になるサイトはありますでしょうか?
ああ
ちょっとしたダウンローダを作ろうと思ってるんですけど
画像掲示版等で画像をダウンロードしようとすると
ENVが設定されてないのか、通知しろっていって来るんですけど
USER_AGENT以外に何を通知すればいいんですかね?
>579
IE の通信を横取り丸とかでダンプしてその HTTP ヘッダ類をそのままパクれば
いんじゃね?Cookie も必要になるかもしれんが、そのへんは自分でがんがれ。
>>579 > ENVが設定されてないのか、通知しろっていって来るんですけど
メッセージをそのまま書きなよ。
Referer: 辺りだと思うけども。
>>580 Etherealがいいね。
単純に興味で聞くんだけど、ネットワークプログラミングで
どんなプログラムを作ってるの?皆さん。
通信するプログラム・・・かな
ネットワーク技術を使って作ってみようと思ったプログラム
無理して面白いこと言おうとしなくても良いのに。
あーしまった
思ったことを素直に書いてひねりを入れるのを忘れちゃったよ
今、IRCとの連携プログラムを作成しているのですが、
PC-αのIRCクライアントが送受信した文字列をPC-βのサーバプログラムが
間接的に受信・解析し、特定文字列の場合は指定された動作をする・・・という処理を
行わせたいと思います。
つまり、ローカルネットワーク上を流れる特定ポート(IRCなら6667など)を監視し、
常にパケットを間接受信するパケットキャプチャのような処理を行わせたいです。
可能でしょうか?
動作OSはWindows2000、言語はVC++です
可能です。
あなたしだいですが。
かんばってください♪
IDirectPlay8Peer::EnumHostsを実行中に、
_beginthread()で作ったスレッドが止まったままなんですが。
動かす方法は有りませんか
590 :
579:2005/08/17(水) 19:02:19
>>580, 581
ありがとうございます
Windowsじゃないので、IEからパクってくることができません
自分のブラウザのENVを見ると、Referer, Agent, 程度しか設定していないにもかかわらず
それを送り込んでも、ENVを設定しろといわれます
何か一般的でないENVで振り分けしている場合などあるのでしょうか?
通信しているパケットを調べるソフトを作りたいのですが、どのようなことから調べればよろしいでしょうか?
調べていたら、パケットキャプチャ、パケットダンプと2つの言葉が出てきて、どちらがどう違うのかもよくわからない状況なのですが…
過去ログにはwinsock2.2を使うといい、というようなことが書いてあったのですが。
また、パケットを調べるソフト、というのは簡単なサーバとのやり取りをするプログラムと比べた場合
作成するのは簡単な部類に入るのでしょうか。よろしおくおねがいします。
593 :
デフォルトの名無しさん:2005/08/19(金) 21:12:25
594 :
デフォルトの名無しさん:2005/08/19(金) 21:13:42
winsock2でsocketでエラーが出ますか?
OSはwindowsXPです。
出ますよ。
初期化しときなさいよ、のエラーかな
597 :
デフォルトの名無しさん:2005/08/20(土) 11:16:12
質問です、ブロードキャストはあるネットワーク内のすべての
ノードにデータを送りますが、自分にも帰ってきますか?
帰ってくるよ
いや、家出したままだよ。
家の場所を忘れたよ。
3baka
ホスト名の解決に失敗した理由が、NXDOMAINだったのかその他のエラーか
それともタイムアウトだったのか、DNSを直接喋らずに(gethostbynameで)
判別することはできますか?
h_errnoやWSAGetLastError()で判る範囲なら
場違いな質問をすみません。
ここのすれのひとで、CCNAとかを持ってるって方はおられますでしょうか?
テクネ持ってる
ネットワークプログラミングの相談ならのるぞ?
WSAAsyncSelectとWSAEventSelectってなんか違うんですか?
ソケットイベントの通知方法の違い。
ウインドウメッセージで飛んでくるか、
EventオブジェクトがSetされるか。
同じプログラムからHTTP1.0のGETメソッドを送信しているのですが
ネットワーク環境によってレスポンスがHTTP1.0で返って来たり
HTTP1.1で返って来たりするのですがなぜでしょうか?
相手鯖の問題なんじゃないの?
プロクシの可能性も
612 :
デフォルトの名無しさん:2005/08/27(土) 21:49:06
ハンゲームとかで、ブラウザ上からログインしたり
ローカルのEXE立ち上げてゲームを起動したり、
ゲームをバージョンアップしたり・・・みたいなことって
どういう技術でやってるんでしょうか
最初にホムペ上からハンゲームコントローラみたいな
EXEをインストールしたら、その後はブラウザ上から
直接ゲームを起動できるようになるみたいなんですけど
WinでNetBIOSで見える仮想コンピュータ名
と仮想IPを
持つプログラムつくりたいと思っています。
それで簡易クラスタをサーバで構成できれば
面白いと思ってます。
XP上のeclipse+CDTで作りたいのですが
仮想コンピュータ名を作るにはどうしたらいいんでしょうか?
WinPcapの話題があまり出てないけど、皆あまり使ってない?
確かにプログラムと直接的な繋がりはないな
>>619 コードがないとその本を持っている人しか答えられないね
普通に考えると文字列処理関数('\0'を終端とする)がどこかにあるんでしょ
文字列の基礎からやった方がよくねぇ?
622 :
:2005/09/02(金) 08:09:39
>>619 文字列とデータの違いを知ることですね。
文字列の定義を検索してくれ。
データ?
>>623 用語の使い方が頭悪いだけですよ
バイナリデータといいたかっただけ
言いたい事は察してあげてください
それはわたしのバイナリさんだ
selectって指定したディスクリプタが
「読み込める状態にあるか、書き込める状態にあるか、エラー」を"判別してくれる"
って解説してるところと、
「読み込める状態、書き込める状態、エラー」に"なるまで待つ"
って解説してるところがあるんだけど、どっちですか?
試せばいいじゃん
>>626 タイムアウトを設定できるからどちらも正解。
Windowsでなければ、pollかkqueueがいいけどね。
unix系ですが、
int sock;
if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
errorfunc();
//以下に色々な処理が続く
//エラーを返す可能性のある関数が存在。
エラーを返した関数があったらsocket()で作ったソケットsockを正しく消去したいんですが、
どうしたらよいのでしょうか。(connect()はまだ行っていない, accept()は行わない)
close(sock);
sock = 0;
こんなもんでいいですか?
それとも何の処理もいりませんか?
>>630 > どうしたらよいのでしょうか。(connect()はまだ行っていない, accept()は行わない)
ならば、
> close(sock);
だけでOK。変数sockの値は関係ないので、
> sock = 0;
は不要。
あなたは「ハンドル」という概念を理解してない。
http://yougo.ascii24.com/gh/15/001551.html ハンドルはオブジェクトにつけられた名前であってオブジェクトそのものではない。
socket()の帰り値はソケットハンドル。
632 :
デフォルトの名無しさん:2005/09/03(土) 13:50:01
>>628 なんでよりにもよってpollを薦めるのですか?
理由を教えてください
634 :
630:2005/09/03(土) 14:12:14
>631さんありがとうございます。
変数を使って通信しているわけではないのですね。
ということは、
send(sock, buf, sizeof(buf), 0);
も
int tmp;
tmp = sock;
send(tmp, buf, sizeof(buf), 0);
も同じ意味なんですね。
勉強になりました。
まずはC言語から勉強しなおせ
636 :
デフォルトの名無しさん:2005/09/03(土) 15:12:31
sockを0にする必要は無いとかいっているが
0にする必要がある実装はむしろ普通にある。
つーか 0 ってファイル記述子としてまっとうな値なんだが。
その通りだ。。
0ではなく「INVALID_SOCKETをセットしておく実装」に訂正
>>633 ファイルディスクリプタ全体のうち、知りたい割合が少ない
なら poll() の方が効率がいいが、ほとんどを知りたいなら
実は select() の方が効率がいい。
poll() を勧めるなら、FD_SETSIZE に依存しないコードを
書くのが楽とかそういう理由を挙げた方がいい。
まあ移植性を気にしないなら、epoll() や kqueue() 使った
方が性能はいいけどね。
移植性なんか考えるだけ無駄だよ
Javaで書こうぜ
>>636 > 0にする必要がある実装はむしろ普通にある。
具体名を。
INVALID_SOCKETってぐらいだからwinsockだろうな
ま、かわいそうな人みたいだから、スルーしる
winsockなんて紛い物を使うなんて・・・カワイソス
winsock最近勉強してるんですが糞なの?
>>646 Windows上でSocket API使いたいんなら他に選択肢はない
諦めろ
ですよね
そこで.NETですよ
Win32はもう整備されてないから止めとけ
Win32と対比させるなら、.NETじゃなくて、WinFXだと思うが。
651 :
デフォルトの名無しさん:2005/09/04(日) 15:22:18
WinSock使ってるんですが、TCPのソケットに一回でもbindすると、
他のソケットで同じアドレスをbindできなくなるじゃないですか。
そこで、closesocketをしてから、bindやってるんですが、
テストで、close→Scoket→bind→close→Scoket→bind
って、連続でやってみたんですが、2回目のソケット作製で、エラーになるんですよ。
bindで、「アドレスが使用されてます」って。
そこで、原因を確かめるために、
bindするアドレスから、それに割り当てられているソケットを取得する方法って無いですかね
getsockname()
654 :
デフォルトの名無しさん:2005/09/04(日) 15:53:13
>>652,653
素早いですね〜。ありがとうございます。
どうやら、bindしたソケットは解放しないで使用してみることにしました。
SO_REUSEADDRについては、もともと同じアドレスを2つのソケットにbindできることを許可するのは、
後々バグの原因にもなりかねないと思うので、やめておきます。
getsockname()については、アドレスからソケットを取得するものを考えてました。
ちなみに、bindでエラーなったことについては、WSACleanupをやっても解消されませんでした。
ついでですが、もともとソケットを解放してまたbindをやる必要があったのは、
ソケットを解放しないでいると、acceptが不要になったときにも、
クライアントの接続を受け入れる何かのバッファ処理がされてると思ったからで、
その処理が無駄になるので、それをさせないためです。
そんで、一旦ソケットをcloseしてました。
そこで、ソケットを解放しないでいて、クライアントの接続要求を破棄する方法ってあります?
非同期処理なので、acceptを再開したときには、
それ以前に接続要求があったものまで検出してしまいそうで。
>>654 なんだか知らんが実行中に口を開いたり閉じたりせにゃならんのか?
SO_REUSEADDRははっきり言ってサーバ系ではお約束と言ってもいいんだが、
どうしてもそうしたくないんなら、accept()したsocketを単にclose()
すればいいんじゃねえの?
>645
そのエラーが出てるときにコマンドラインで
netstat
ってやってみ、ソケットの状態が表示されるから。
listen()がレスに出てこないのが気になるんだけど、
listen(), bind()の意味を理解してる?
657 :
デフォルトの名無しさん:2005/09/04(日) 17:27:02
わかってないくせにムカつく書き方をする奴だな。
659 :
デフォルトの名無しさん:2005/09/04(日) 18:04:17
どうして、そういう意味わからない攻撃するんですか?
自分で調べるんで、もういいです。
660 :
デフォルトの名無しさん:2005/09/04(日) 18:06:35
最初から自分で調べてりゃいいのに、なんで人に聞くんだろうな
>>657 違う違う。
「次にbind」とか言ってるってことはclose()するのが前提なんだろうが、
どーしてもSO_REUSEADDR使いたく無いんなら、listening socketはclose()せずに、
口を閉じなきゃいかん間はaccept()したsocketをclose()しろと言ってるの。
固定長のヘッダを受け取り、その中にsizeof(unsigned short)バイトで
可変長のデータサイズが書いてあるのですが、ヘッダがおかしかった
場合は、可変長のデータの部分を無視して次の固定長のヘッダを受信したいのですが、
可変長の部分のデータを破棄する方法はどんなのがありますでしょうか。
いったん可変長のデータを受け取るというのが簡単そうですが、無駄なような気もします。
もっと効率のいい方法はありますか?
664 :
デフォルトの名無しさん:2005/09/04(日) 21:09:33
>口を閉じなきゃいかん間はaccept()したsocketをclose()しろと言ってるの。
これって、クライアントと接続が完了したソケットを閉じるという意味ですよね。
それをやっても、acceptを実行するソケットは、バックログに要求を入れ続けるでほ
つーか、無駄な accept したくないなんて、プロトコルの設計が悪いと思うがな。
>>664 だーかーらー、ならSO_REUSEADDR使えって。
SO_REUSEADDR使うか、listening socketをclose()しないか。
それ以外の解は無いの。
acceptするまえに誰からconnectされたのか知る方法ないかな
writeしてすぐcloseしたときwriteした内容が相手に到達しない条件は
ナニが考えられる? 物理的な障害は無いという前提で
思いつくのは
・writeよりcloseが先に届いた
くらいなんだけど、これって普通にあること?
誰か>663の相手をしていただけないでしょうか。
>>668 > ・writeよりcloseが先に届いた
ない
TCP がちゃんと管理してくれる
>>663 「ヘッダがおかしかった」ことをどうやって判断するのかそれだけだと
わからんが、データに信頼性が置けないってことは、TCPではないのかな?
普通はNAKのようなものを返して再送させるように設計するんじゃないの。
TCPとUDPがごちゃまぜになっていました。すいませんです。
私の勘違いです。
UDPでヘッダを送信してTCPでデータ部を受信と考えていましたが、
両方ともTCPでやればいいっすね。
あやふやな知識で質問したので迷惑をかけてしまいました。
失礼しました。
>>670 closeのときRSTを出すようにいじっててもそのへんは大丈夫?
close のときに RST 出さないようにできるの?
675 :
674:2005/09/05(月) 02:27:23
ああ、FIN じゃなくて RST ってことか。
「TCP シーケンス番号」でぐぐってみれば?
>>654 > SO_REUSEADDRについては、もともと同じアドレスを2つのソケットにbindできることを許可するのは、
> 後々バグの原因にもなりかねないと思うので、やめておきます。
SO_REUSEADDRの仕様を誤解しているし、
そもそも簡潔にして十分な
>>652のレスを早合点している。
TIME_WAITとSO_REUSEADDRの関係を自分で理解しろ。
>>659が態度悪く、もう誰もここには書かないから。
679 :
デフォルトの名無しさん:2005/09/05(月) 13:56:54
>>677 なんでこの一人だけがムキになてんの?
659が偽者なのは660が暗に示してるのにw。
てか、同じアドレスが2つのソケットに割り当てられたら、
両方が同じデータを確実に受信するのかな。
680 :
デフォルトの名無しさん:2005/09/05(月) 14:00:51
ttp://www.tkool.org/punge/sinsa/No2.zip ここにひとつのゲームがある。
このゲームは既存に存在するゲームへのアンチテーゼ。
何から何まで説明され、ユーザーが考える余地のないゲームが
多く存在する昨今、今回は「逆にまったく説明しない」または
「教えようとしない」コンセプトで作ってある。
なんだコレ?で終わる人間も居るだろうし
意味を探る人間も居る。
何かを感じないのも、何かを感じるのもどっちも間違いではなく、正解でもない。
枷を嵌め、尚もその枷を越える「チカラ」を手に入れるべき人類。
それは創作のみならず。
人類の飛翔は今の腐った思考で今を生きている、漠然と生きている
そんな人間達に一喝を入れるべきがあたしの作る「ゲーム」だ。
上記に何も感じなければ間違いではないと言ってるが
個人的には「この意味」を理解できない奴は何を作っても無駄だ。
あたしが目指す「ゲームの最終地点」は
「プログラム上のみならず現実世界ですらそのゲームを髣髴させる事」にあり。
世界を超えるデバイスとなるゲームを作る。
それがあたしの希望であり、全ての人類への警鐘となる。
目覚めよ、人間たち
>>679 毎度毎度 age て必死だな。自分で調べれば?
じゃヴぁのSocketって、どんなOSでも同じように動く?
>>682 大体動く
中の人(ジャバ子)がすんげー頑張ってんだよ
ちょっとフラフラするのは大目に見てやってくれ
Javaってどこでも動きそうなのだけ取り込んで、楽してる気がする
socketの話でしょ。GUIはスレ違い
いや、Java の話。
だからすれ違いっていってんだろうごるぁあああ
スマン.
しかし、socket が何処でも動きそうって、そりゃ当然だろ...
確かにw
>>683 ありがとうございます。
やっぱり完全に同じようには動かないんですね。
UNIX系だと、WSAstartupかかなくていい。
694 :
デフォルトの名無しさん:2005/09/07(水) 20:14:17
手動でDNSからwww.yahoo.co.jpなどのIPアドレスを取得したいのですが、
>telnet [ネームサーバー名] 53
とやってコマンドを打つとかでは無理ですか?
>>694 無理じゃないお
DNSプロトコルの勉強?
>>695 バイナリなプロトコルだから手打ちは相当面倒だとは思うがね
DNSってUDPじゃなかったっけ
TCPもあるある
TCP もあるけど、ゾーン転送だけね。
別にゾーン転送に限定されてるわけじゃない
実際ゾーン転送じゃなくてもTCPでリトライしなければならないことはありうる
けどテキスト指向じゃないからどのみちtelnetで取るのは難しいな
おうおう、それはしらんかった。あんがと。
じゃあテキスト思考のTDNSを作ろう
作ってどうすんの?
>>704 どうもこうもないよ!
作ってみて、ウケたらRFCに載せるのさ!
というか便利だろ。便利だと思う。便利なんじゃないかな。
全然。
>705 4/1まであと半年以上ある。がんばれ
708 :
デフォルトの名無しさん:2005/09/10(土) 11:08:54
a
b
z
711 :
デフォルトの名無しさん:2005/09/10(土) 13:00:06
ソケットを使った多バイトのデータ送信について質問があります。
環境はx86系アーキテクチャで、同一PC上でサーバとクライアントの
プログラムを動作させ、クライアントプログラムから整数値を送るという
簡単なものなのです。
本などには、送信するときにデータはアドレス昇順で送られると
書かれており、リトルエンディアンのx86系だと逆になると思い、
とりあえず送信させてサーバ側で値を表示してみたところ、
送信側と同じ値が出ました。ビッグエンディアンのプロセッサの
ことを考慮し、送信する前にhtonlなどの関数で変換すると
書かれているのですが、サーバもクライアントも同一プロセッサであれば
この関数で変換しなくてもよいということなのでしょうか?
気になると言うか、どのように処理されているのかがよく分からないのです。
変換せずに送った場合、一応正しく表示されました。
クライアント側から送信する際にhtonlで変換して、サーバ側で受信した
際にntohlで変換した場合も正しく表示されました。
クライアント側がリトルエンディアンで、0x1234というデータを
メモリに格納し、ビッグエンディアンのサーバ側へ送信した場合、
0x1234というデータは、どこでどのように変化しているのでしょうか?
リトルエンディアンで格納したときに 34 12 となり、これを送信すると
34、12 の順に送られ、受信側では34 12 として格納される、
という流れになるのでしょうか?
>>713 受信側で1バイトづつ読んでみればわかるだろ?
>>711 アーキテクチャがもともとネットワークバイトオーダーと同じだった
場合は、htonl()などはno-opになるから、「余分な手間ではないか」
といったことを気にする必要は無い。
> サーバもクライアントも同一プロセッサであれば
などという仮定を入れずに、素直にhtonl()使っとけってこった。
まあ気にすべきはバイトオーダーだけではないがな。
>>714-715 わかりました、とりあえず1バイトずつ読んで送信順序を確かめてみます。
ありがとうございました。
717 :
716:2005/09/10(土) 15:40:32
アドレスの先頭から送られてくることを確認しました。
変換関数を使うかどうかについても納得しました。ありがとうございます。
718 :
名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:19:15
マルチキャストって、ルータが対応してないとダメみたいだけど、
インターネットを介して、マルチキャストってできる?
>>718 インターネットが何を指すかが問題だが
マルチキャストが行って帰ってくる所までできる
721 :
名無しさん@そうだ選挙に行こう:2005/09/10(土) 22:33:29
>>719 インターネットは、
例えば、YahooBBを使ってる北海道のAさんのお宅と、
Bブレッツを使ってる九州のBさんのお宅と、
ぷららを使ってる本州のCさんのお宅とで、
パケットを送受信できる環境。
マルチキャストは、回線を有効的に使うらしい。
例えば、Aさんが、BさんとCさんにパケットを送るとき、
本州までは同じ回線で1つ分のパケットがいって、
本州からBさんだけに送ることになるらしい。トラフィックが減少する。
>>718 > インターネットを介して、マルチキャストってできる?
出来るところしか出来ません。
> マルチキャストって、ルータが対応してないとダメみたいだけど、
途中のルータが全てマルチキャストに対応していないといけません。
723 :
名無しさん@そうだ選挙に行こう:2005/09/10(土) 23:36:17
>>722 途中のルータでマルチキャストに対応してないところってある?
>>724 対応しているところの方が珍しいだろ。
確かIIJはマルチキャスト対応のサービスメニューを用意していたっけかな。
マルチキャストに対応しているネットワーク事業者が大多数なら、
ストリーミング系とか、MMORPGとかでもっと活用しているって。
windowsでSSHのクライアント作りたいんだけど情報キボンヌ
>>726 SSHとRFCでググると情報がたくさん手に入ると思うよ
>>726 openssl, puttyのソース、TeraTermのssh plugin
729 :
デフォルトの名無しさん:2005/09/12(月) 23:09:54
マルチキャストについて質問させてください。
マルチキャストで送られたパケットを、Windowsアプリケーションで受信
した場合に、送られたパケットの送信先IPを知るにはどうすればよいの
でしょうか?
WinSockを使って実装したいのですが、方法が分かりません。
RAW_SOCKを使ってIPヘッダを取得することを試みましたが、下記の
現象が起きてしまいます。
@socket(sock, SOCK_RAW, IPPROTO_IP)でソケットをオープンすると、
UDPデータを全く受信しません。
Asocket(sock, SOCK_RAW, IPPROTO_UDP)でソケットをオープンす
ると、受信データにIPヘッダが入らず、UDPのペイロードから受信し
てしまいます(SOCK_DGRAMと同じ)。
どなたか分かる方教えてください。
なんで自分の参加したマルチキャストアドレスを覚えてへんの?
>>730 1つのソケットに複数のマルチキャストアドレスを登録しています。
受信したときに、どのマルチキャストグループ宛のデータを受信
したのか知りたいのです。
732 :
デフォルトの名無しさん:2005/09/12(月) 23:49:47
>>729 そのマルチキャストって、インターネットを介してるの?
それともLAN内?
>>729 すみません。間違ってました。
> @socket(sock, SOCK_RAW, IPPROTO_IP)
socket(AF_INET, SOCK_RAW, IPPROTO_IP)
> Asocket(sock, SOCK_RAW, IPPROTO_UDP)
socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
>>729 試さずに答えるが、AでsetsockoptでIP_HDRINCL設定したらどうよ?
しかし"ソケット"は、接続の"端点"を表す抽象化だから、
# あちらはどこにあるか分からないがちゃんと(一対一で)つながっている
本当は別のソケットにするのが良いと思うよ。
>> 735
> 試さずに答えるが、AでsetsockoptでIP_HDRINCL設定したらどうよ?
実はそれも試してみたんですが、駄目でした。
結果はAと同じで、UDPのペイロードから受信します。
本来、RAWソケットの説明を見ると下記のように書かれているので、
IP_HDRINCLを設定しなくてもIPヘッダが含まれるはずなんですが。
「IPv4 レイヤは、扱っているソケットで IP_HDRINCL ソケットオプション
が有効になっていなければ、パケットを送信するときに IP ヘッダを生
成する。 IP_HDRINCL オプションが有効になっているときは、パケット
には IP ヘッダが含まれていなければならない。受信時には、 IP ヘッ
ダは常にパケットに含まれている。」
> 本当は別のソケットにするのが良いと思うよ。
そうしたいんですが、1つのソケットに200通り近いマルチキャスト
アドレスを設定しているため、ソケットだらけになってしまいます。
そもそも、同時に200通り近いマルチキャストを1つの端末で受信
しようとしているのが間違いでしょうか?
じゃあ、XP SP2かな?
それならraw socketは諦めて、Winsock2 LSPで。
738 :
デフォルトの名無しさん:2005/09/14(水) 04:23:34
test
740 :
デフォルトの名無しさん:2005/09/14(水) 04:55:16
windowsXPのSP2でプログラムを作っているのですが、
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
でソケットを生成した後、ソケット型の変数sockから接続先のIPアドレスやポート番号
などを知ることは出来るのですか?
741 :
740:2005/09/14(水) 04:59:07
↑
connectした後です。
別の関数にsockだけを渡しているのですが、その関数内でIPアドレスを表示
したいのですが・・・。
742 :
デフォルトの名無しさん:2005/09/14(水) 05:12:17
connectしたときのsockaddrに格納されてないかい?
743 :
740:2005/09/14(水) 05:30:43
>>742 その通りなんですが・・・。
やっぱりソケット型の変数だけから通信先のIPアドレスを取得するのは無理
なんですか。。
winSock2を使用してプロミスキャスモードで受信し
パケットモニタリングするツールを作成しているのですが。
どうやらパケット落ちしてしまっているんです。
対応策を色々調べているのですが、受信したデータを溜め込む
バッファサイズを大きくしてみようと思いまして色々調べたのですが
WSAIoctrlで操作ができるようなのですがその先が全くわかりません。
もしかしたら方法も見当違いなのかもしれませんが、もしご存知でしたら
ご教授願えないでしょうか、お願い致します。
C++ sp6
Windows XP
>743
getsockname()
このスレにでてきているだろう。
検索くらいしろ
getsocknameは、ソケットの自分側のsockaddrを取る。
getpeernameは、ソケットの相手側のsockaddrを取る。
748 :
740:2005/09/14(水) 22:23:41
749 :
デフォルトの名無しさん:2005/09/14(水) 22:33:14
串を使ってくる相手のURLを抜くことはできますか?
Cは嫌いなんで、perlかjavaskuriptでお願いします。
750 :
◆CmEW8w8Y6I :2005/09/14(水) 22:33:52
g
javaskuriptワロタ
752 :
デフォルトの名無しさん:2005/09/14(水) 23:58:36
>>737 Winsock2 LSPについてkwsk
ちょwwwをまwwwwkwっww
>>749 リバースプロクシのむこうにいるサーバーのURLを抜いて何が楽しいのやら。
標準的な手法は無い。とりあえず通信内容をモニターしてみろ。
それっぽい項目が無いなら無理だろうな。
じゃあ、相手が串かどうかは完全にわかるものですか?
ぷろぐらみんぐかんけいないよいたちがい
現在winsockで
WSACleanup();
socket();
bind();
listen();
accept(); (クライアントはconnect();)
まで成功して簡単な文字列をやりとりする
プログラムを作成しました、
次にKeepAliveの時間を
レジストリを使わずに指定したく調べたら
IOコントロールというのを使うと見たので
調べたところ
Ioctl()
ioctlsocket()
setsockopt()
このあたりが絡んでいるようなのですが
どの関数を使えばいいのかわかりません、
詳しい方おられたら教えてもらえないでしょうか、
また、IOコントロールについても調べたのですがいまいち
理解できません、こちらも詳しい方おられたら
一言でまとめていただけないでしょうか。
/*-------------------
windowsXP HOMEEDITION
VC6++ サービスパック6
winsock2.2 です。
--------------------*/
WSAIoctlで、SIO_KEEPALIVE_VALS を投げるのが正解。
760 :
729:2005/09/18(日) 03:08:16
>>729 > Asocket(AF_INET, SOCK_RAW, IPPROTO_UDP)でソケットをオープンす
> ると、受信データにIPヘッダが入らず、UDPのペイロードから受信し
> てしまいます(SOCK_DGRAMと同じ)。
この現象ですが、WindowsXPでは発生しませんでした。
Windows2000とXPのWinSockって違うんですか?
バージョンはどっちも2.2なんですが。
RAWソケットが使えるのはXPかつSP2以前だけ。
ないと思ったほうがいい
762 :
デフォルトの名無しさん:2005/09/19(月) 08:10:25
>>729 >> マルチキャストで送られたパケットを、Windowsアプリケーションで受信
>> した場合に、送られたパケットの送信先IPを知るにはどうすればよいの
>> でしょうか?
無理。ソケットの仕様がアホなので、原理的に取得するのは不可能。
これは、マルチキャストだけでなく、ユニキャストでも、UDPでは取得不可能。
>>747 >> getsocknameは、ソケットの自分側のsockaddrを取る。
これで取得できるのは、TCPの場合だけ。UDPでは取得不可能。
このように、ソケットは欠陥だらけなので、使うのをやめておくべき。
どうしても使いたい場合は、ソケットから取得しなくても済む実装方法を普通はとる。
>>762 > このように、ソケットは欠陥だらけなので、使うのをやめておくべき。
ワラ
ソケットが欠陥だらけだとして、代わりに何を使えばいいんだ?
この使用法での、じゃね
なるほど。
だったら recvfrom() があるので、socket に欠陥は無いってことになるかな
WindowsのBSDソケットは欠陥だらけ。
Winsockを直で使うべき。
>>767 おいおい、recvfrom() では、相手のIPアドレスとポートはわかっても、
どのIPアドレス宛にやってきたのかはわからないぜ。
>>763 UDPでrecv()やrecvfrom()したあとに、getsockname()をしても、
どのIPアドレス宛にやってきたのかはわからないぜ。
getsocknameは自分でgetpeernameが相手じゃないっけ
・UDPでgetpeername()して相手のアドレスが分かるのは、connect()した時のみ。
と理解していいたのだが、違うケースでも可能なことがあるんですか?
こういうことをしたかったら、前提としてconnectするものだから
この例の場合は違うケースとか関係ないと思う
関係ないとは?
>771
bindしたときも可能。まあ、bindで指定したパラメタしか
取れないから、意味ないといえば意味ないけど。
・UDPでgetpeername()して相手のアドレスが分かるのは、connect()した時のみ。
ではないのですか?
>>774 bind()するのは、getsockname()で取れるこちら側のアドレスでしょう?
>>776 bindしてるんだから読めて当然だよな
bind()してようがしてまいが、IPヘッダに書いてある情報なんだから
本来読めてしかるべき、とも言えるんじゃまいか
とも言えるんじゃまいかとつければ何を言ってもいいんじゃまいかとはいえないんじゃまいか
誰かじゃまいかツアー作れって。
自分で作れボケ
>>778 しかし本来下のレイアーの情報は上のレイアー(アプリケーション)では関知しないというのが
元々の思想ではないのか? UDP/TCPに渡したところでIPヘッダの役割は本来そこで
終わっているわけだから。
つーかWinsockが糞だから。
>>782 でもそれは理想論。そんな夢のような世界ならv6への移行も一瞬だったろうにな。
確かにrecvfromのようなインターフェイスでrecvfromtoみたいな関数が欲しい所だな。
設計でも回避できるけど。
誰かジツリキあるやつIETFとかで提唱してみれ。
>>784 > そんな夢のような世界ならv6への移行も一瞬だったろうにな。
アホ丸出しだな。
> 誰かジツリキあるやつIETFとかで提唱してみれ。
アホ丸出しだな。
またお前か
>>784 前から思ってたのだが、IPv6で作られたAdvanced Socket API for IPv6 (RFC2292)
のIPv4バージョンがあったら便利だと思う。
IPv4とIPv6って、アドレスの振り方とかアドレス情報の価値としての重きの置き方とか違うじゃん?
意味なくね?
789 :
787:2005/09/20(火) 00:18:33
>>788 いや、とりあえずpktinfo関係は便利だろ。 ここで話題になってる情報(dest address)
は取得できるし。
in_pktinfoあるぞ。ないUNIXの方が少なくないか?
元の質問はWindowsだからないはずだが。
あ、in_pktinfoってのは、in6_pktinfoのIPv4版な。
で、UDPで、自分のポートだけ指定して待ち受けているとき、
recfrom()で受けたパケットが、自分の複数あるIPアドレスのどこ宛に届いたか知る方法は?
Winsockはないだろ?
>>792 問題が明確になったね。GJ
で答えは無理
どうしても知りたければ送信データに入れてもらえ!
というかTCPでもわからんよね?
>>794 TCPならワイルドカードでlisten()していたにせよ、
accept()した後に確定するでしょ
>>79 ちらっとWinsock2のAPIを眺めてみたのだがWSARecvMsgとIP_PKTINFOで
出来そうに見えるけど違う?
>>796 出来そうに見えるがXP/2003 Server限定なのが痛いな
>>794 TCPならコネクション成立後、getsockname()で自分側のIPアドレスもわかる。
UDPだとわからないのはBSD SocketやWinsockの欠陥であり、
それぞれがインタフェースを用意すればよかっただけに過ぎない。
例えば、カーネル内では当然把握している。
それをユーザ(アプリ)へ伝えるインタフェースが不十分なだけ。
799 :
794:2005/09/20(火) 17:03:49
>>798 > UDPだとわからないのはBSD SocketやWinsockの欠陥であり、
分かるっちゅーの。
・connect()した場合
・pktinfoとrecvmsg() (WinsockはXP/2003 Server以降)
・raw socket (XP SP2以降のWinsockはこれがダメ; LinuxはAF_PACKETがお勧め
・kernelのprotocol layer interfaceを使う
で、UDPで、自分のポートだけ指定して待ち受けているとき、
recvfrom()で受けたパケットが、自分の複数あるIPアドレスのどこ宛に届いたか知る方法は?
connect()してないので1番目は却下
OSのversionに依存する2番目と3番目は却下
4番目のkernelのprotocol layer interfaceってのはOS非依存の汎用?
汎用なわけねー。
TCPはコネクション志向だからconnecting socketにIPの四つ組みが紐づいてるし
それをソケットの属性として取り出すのが自然だけど
UDPはそうじゃないってだけの話だよな
だからやるとすればrecvmsg()のような形で、受信の「ついでに」
パケットに付随する情報を取り出すような形式を取らざるを得ない、と。
そんなに汎用性が大事なら、
別にインターフェースに個別にbindしたらええやん。
>>807 そのPCのネットワークインタフェースを列挙する「汎用的な」方法を教えてくれ
XP SP2がraw socketをやめたの、もうあほかと
直すべきなのはそこじゃない…
とりあえず、汎用的にはgethostbyname(gethostname())で。
厳密にはぐじゃぐじゃ言う香具師もいるかも知らんな。
今どき gethostbyname()ですかププ
みたいな?
Winsockでもgetaddrinfo()ぐらいは使える、らしいぞ
>getaddrinfo
>(略)
>Requirements
>Client: Included in Windows XP.
>Server: Included in Windows Server 2003.
>Header: Declared in Ws2tcpip.h.
>>808 そこら辺の機能をまとめた汎用ネットワークライブラリってないのかな? libcap/netlibとかは
低レベル過ぎるし。
>>812 俺ん家のPlatform SDKのgetaddrinfo()の記述では
Requirementsがもっと甘くなっていて、Windows95(!)や
Windows NTさえサポート対象になっている。
(ドキュメントの Last updated: March 2005)
とはいえ生のWindows95で利用可能とはとても思えない訳だが
サービスパックやパッチの当たり具合によるってことだろうか?
>>810 そりゃホスト名からアドレスを得る(ホストの名前を得る)関数だろ?
厳密も糞も全くの見当違い。
ここんところ、初心者がかなりいい加減なことを書き込むことがあるね。
>>808への答えとしてはNOだわな
だが、もともとの話はワイルドカードでバインドするかわりの方法って話
だから、全くの見当違いではないだろう、たぶん
>>816 いや、もともとはマルチキャストだから全然見当違い。
はいはい、SIOCGIFCONFでもSIO_GET_INTERFACE_LISTでも何でも呼んでくれ。
えーっとですね、
誰からリクエストが来るかわからないので、ポートだけ指定してUDPで待っています。
そこへ、いろいろなホストからUDPでリクエストが飛んできます。
そして、それに対するリプライを返さないといけないのですが、
その時に、ソースIPアドレスとして、複数ある自分のどのIPアドレスを使うべきか、
当然それは、リクエストが自分のどのIPアドレスに飛んできたかと一致させる必要があるというわけです。
このように、自分のところへやって来たUDPの宛先IPアドレスを知ることは、
基本事項として欠かせないものです。特殊な要求ではありません。
ルーティングテーブル腐ってるの?
>>819 全ッ然意味わからん
ソースIPをアプリケーション層で利用してるようなプロトコルである
という意味なのか?
だって、返信返すのって、そのソケットでsendto()するだけじゃねーの?
そこに送信元IP情報はいらんよね?
>>819 > このように、自分のところへやって来たUDPの宛先IPアドレスを知ることは、
> 基本事項として欠かせないものです。特殊な要求ではありません。
逆切れかよ!氏ね
>>820 非対称なルーティングなんていくらでもある。 入力側はロードバランサーをはさんで負荷分散し、
出力側は別のインターフェースで返すとか。
>>821 アドレスをわざわざ対照に返す必要性は昨今大きい。 そうしないと大抵のファイアーウォールで弾かれる。
BINDのソースあたりを掘ったらそこら辺のOS依存性が抽象化されてるんじゃないかな。
例えば、こんな感じですよね。
自分が複数のインターフェースを持っているなどで、
自分にはIPアドレス A, B, Cの3つあります。
(あるいは、他の環境だともっと多いかも。一般には1個以上)
そこである鯖ソフトは、port 7777番にbind()してUDP待ち受けてます。
そこへ
>>821さんのホスト(IPアドレスP)からリクエストが来ました。
そのパケットはおそらく(src,dst) = (P,A)か(P,B)か(P,C)です。
さて、
>>821さんのホストへリプライしなければなりませんが、
そのソケットでsendto()しても、(src,dst)=(A,P)か(B,P)か(C,P)になるかは
ルーティングテーブル依存になってしまいます。
でも、
>>821さんのホストがリクエストを(src,dst)=(P,A)で送ってきていたら、
そのリプライは確実に(src,dst)=(A,P)にしないとまずいことになります。
つまり、自分のIPアドレス(A〜C)のどれ宛にリクエストが来たかを、
知る方法が必要になりますね。recvfrom()だと、相手のPのほうはわかるんですけどね。
825 :
823:2005/09/21(水) 01:13:22
×対照
○対象
hazukashi
INADDR_ANYでbindしたudp socketに来たパケットは、
127.0.0.1に宛てられたのかもしれないし、
インターフェイスのアドレスだったのかもしれないし、
ブロードキャストアドレスかもしれないけど、
それがわからないからどうしようって話。
昔のnamedはそんなの関係なしに自分のアドレスをfromにしてパケット返してた。
今はアドレス毎にbindして(socketを複数作って)解決してる。
まぁこれくらいしか解決策は無いんだけど。
>>826 >>昔のnamedはそんなの関係なしに自分のアドレスをfromにしてパケット返してた。
さすがに今の時代、これ、いろいろやばくて通らないよね。
NATやらuRPFやら色々問題ありそう
>>今はアドレス毎にbindして(socketを複数作って)解決してる。
これ、BSDソケットの仕様が欠陥でだめすぎるので、
ほんと、やむをえなく、こんな馬鹿なことするしかないんだよね。
だれかが提案してたrecvfromto()さえあれば、socket1つで済むところ。
>>821 だけど、なるほど、意味を理解したよ。thx。
用途が上のようなものであるとすると、ソースIPが取れるだけでは
不十分で、sendfromto()みたいなのも必要というか欲しい、という
話になるのかな?
>>827 recvfromto()だけじゃなくて、sendfromto()も必要な気ガス
831 :
830:2005/09/21(水) 01:31:57
うはwwかぶったwww
だからそんな変な関数作るよりIP_PKTINFOをサポートすればいいだけの話だろ
>>832 IN_PKTINFOやIP_PKTINFOやIP6_PKTINFOをサポートしたとして、
recvfromto()のほうの代わりになるだけだろ。
IP6_PKTINFOって、struct in6_pktinfoをみるとわかるように、
RFC3493(初出はRFC2133,RFC2553)のgetaddrinfo()のような
Protocol-Independentなインタフェースになってないので使えない。
例えば、sendto()で相手のIPアドレスを指定するときは、
struct sockaddrというProtocol-Independentな形で指定し、
これは、getaddrinfo()で得られたものをそのまま意識せずに用いれる。
自アドレス側が変わってしまって非対称になってもよければ、
recvfrom(s, msg, msglen, flags, from, fromlen)
でもらってきた、from/fromlenをそのまま、
sendto(s, msg, msglen, flags, from, fromlen)
とすれば、相手へリプライすることができる。
ただし、
>>826-827にあるように、これは今では問題が多い。
同様にIPv4/IPv6気にせずにプロトコルインディペンデントにきれいに対応するには、
recvfromto()とsendfromto()を新設するのが最も簡単で美しく分かりやすいだろうな。
838 :
デフォルトの名無しさん:2005/09/21(水) 02:19:58
NetBSDとFreeBSDを調べてみたが、両方ともIPV6_PKTINFOしかないぞ。
RFCを調べても、RFC3542にIPV6_PKTINFOが出てくるだけで、IPv4の定義はどこにもない。
つまり、recvmsg()を用いても、IPv4の場合は自分側のIPアドレスを得られない。
>>838 LinuxはRHとDebianを覗いたら両方ともIP_PKTINFOあった。 機能するかどうかは
検証してないが。
sendfromto()みたいなのがあると、ものすごくお手軽なIP偽装の手段になるな
しかし、こんな基本的なことが、Windows/Linux/BSDで、
できたりできなかったり、インタフェース違ったり、特定の版でしか動かなかったりするのは、
やはりソケット仕様の重大欠陥だとは言いきれるな。
>>840 さすがにbind不可能なアドレスをsourceに指定すればEADDRNOTAVAILを返させるだろ。
おまいらが変に騒ぐからMSがヘソをまげてソケットを改善しなくなっちゃったよ
馬鹿だからセンスが悪いだけだろ。
>>839 IP_PKTINFOはquaggaで使ってるよ。
同様のものがないとOSPF実装するの面倒…
*BSDだと、IP_RECVDSTADDR, IP_RECVIFかな。
IPV6_PKTINFOは標準だから、とっととIP_PKTINF実装して欲しいな。> *BSD
>>845 よーするに、ここで焦点となっていた、自分のどのIPアドレス宛に来たか、だけでなく、
その場合、自分のどのIFから入ってきたか、という情報まで必要ということ?
前者はレイヤー3だけど、
後者はレイヤー2情報だね。
レスがものすごく伸びてるからどうせ不毛な煽り合いが始まったんだろうと思って
覗いたらちゃんと技術的な話題になっててビビった
>>846 ルーティングデーモン、DHCP鯖、DHCPリレーエージェントなんかは必要。
>>807 > そんなに汎用性が大事なら、
> 別にインターフェースに個別にbindしたらええやん。
>>808 > そのPCのネットワークインタフェースを列挙する「汎用的な」方法を教えてくれ
結局、この汎用的な方法があればいいんだよね?
各OSでこのへんは、どーなってる??
UNIXは、socketに対するioctl(2)で、
SIOCGIFCONF /* get iface list */
>>850 その得られたインターフェイスがIPアドレスを持っているかどうかと、
IP aliasがあるかどうかと、upしてるかしてないか、等を調べる汎用的な
方法を教えてくれ。
無理だろ? そゆことやろうと思うと、結局現状じゃOS依存の
ifdefだらけのコードを書くしかないんだよ。
ので、大抵のプログラムは設定ファイルなんかにbindするinterfaceや
アドレスを指定させてると思う。
>>851 鼻息荒いね。頑張ってね。
> ので、大抵のプログラムは設定ファイルなんかにbindするinterfaceや
> アドレスを指定させてると思う。
まあ、君の目の当たりにする奴はそうなんだろうね。
>>851 設定ファイルにIPアドレス指定させるのは敗北だと思う
>>852 自分のIPアドレスをアプリが知る汎用的な方法を教えて
なんかループしてるよな。させてるのは一人だろうけど。
>>851 > その得られたインターフェイスがIPアドレスを持っているかどうかと、
> IP aliasがあるかどうかと、upしてるかしてないか、等を調べる汎用的な
> 方法を教えてくれ。
このへんのきれいなサンプルコードってない?
IPv6も含めてIPアドレスのリストが得られると嬉しい。
「UNIXネットワークプログラミング」にインターフェースを列挙するサンプルがあるが。
>>857 プラットフォームに依存しない方法ないのかな
861 :
デフォルトの名無しさん:2005/09/23(金) 04:08:38
>>861 はっきりいって、マイクロソフトの犬はどうでもいい。
荒しはスルーの方向で。> ALL
Microsoftが素直にBSD socketそのまま採用していれば、
みんなが悩まず、プログラムコードも同一で健全な世界ができたとは思う。
boost::socket
ところがどっこい、糞なのはBSDの方でしたとさ
>>865 2,3年前に出るって聞いたけど結局どうなったのあれ?
おまいら移植性気にするわりにマルチプラットフォームなライブラリ使う気ないんだよなぁ
まともなマルチプラットフォームソケットライブラリってあるのか?
ACEは巨大すぎる。boost::socketは出てさえいない。
>>868 BSD使いならともかく、Linuxユーザが移植性なんて気にした歴史は
過去に一度だって無いぞ
>>869 そもそもC++なんて使ってる時点で移植性なんてほとんど無いだろ。
まともなC++コンパイラが無くてg++も使えない環境がたくさんあるんだから。
流れぶった切ってすいません。
パケットキャプチャソフトのログ出力を、libpcap形式で行いたいのです。
そこでlibpcapファイルの構成を説明してあるページを探しているのですが、
分かる人が居たら是非教えて下さい。
ちなみに、WinPCapを利用して作成しています。
libpcapのAPI使えばいいじゃん。
ぐぐれば出てくるのでは?
876 :
デフォルトの名無しさん:2005/09/23(金) 17:37:13
ASP.NETに関して教えてください
ユーザーが2,15と入力すると,足し合わせた17と表示させるページをASP.NETで作りたいと思います
(実際はより複雑で,時間がかかる計算をします)
このとき,この2+15という計算はサーバーで行われあるのか,クライエントのPCで行われるのかどちらでしょうか?
877 :
デフォルトの名無しさん:2005/09/23(金) 18:26:22
設計次第
network.hをインクルードするとエラーが多発するのはなぜ?
>>871 gcc動く環境はg++動く保障にならないの?
ならないよ?
882 :
879:2005/09/23(金) 23:01:39
なんでなの〜
他にインクルードしないといけないファイルあるの?
開発環境はBCC 5.5
俺はおまえのママじゃ無い
パパなのか
885 :
879:2005/09/23(金) 23:33:12
>>883,
>>884 意味不明な事を言ってる場合じゃない
network.hの前にwinsock.hをインクルードしたらエラーが減りました。
あとはどれをインクルードすれば?
#pragma coment(lib 'ws32.lib')
887 :
879:2005/09/23(金) 23:55:53
それでもできない
俺はおまえのママじゃ無いと言ってるだろ。理解できないのか?
ママにでも聞けば?
手遅れですw
>>888は私の母になってくれたかもしれん男性なのだ。
というか、network.hって何だよ。
全くだ。windowsならwinsock.hだけで足りるんじゃないのか
というか、エラーの中身も出さないし、それでもできないとか礼すら無い
糞餓鬼は、おれもママにでも聞けよと言ってしまいそうだ
チラシの裏にでも書いてろよw
そもそも普通の処理系にはnetwork.hなんて無いので
どこから入手したか書かないとまるで話が通じない
(BCC5.5に付いていたのかどうかもわからんし、付いていたのならマニュアル読め)
エラーの内容も書かなきゃ全く対応できないしな
意味不明な事を言ってるのは
>>885のほうだな
900 :
879:2005/09/24(土) 06:18:58
901 :
デフォルトの名無しさん:2005/09/24(土) 06:30:07
Winsockでは、UDPやTCPで1ビット単位のデータを送る事は可能でしょうか?
バイト単位じゃないとダメなのでしょうか?
>>901 UDP: バイトパケット
TCP: バイトストリーム
なので無理。
ヒント:圧縮
ビットストリーム
というと、なんだか深夜ラジオっぽいから却下だな
双方向通信をする場合では、
content lengthをヘッダ部に指定するバイナリストリームと
Base64を利用したテキストパケットとではどっちが優れているのでしょうか?
また変な質問荒しか!
変なのはここの住人だろ
>>906 時と場合による。
その都度都合がいいほうを選ぶべし。
バイナリで双方向通信してる鯖ってある?
DNS, DNS Xfer, NTP, LDAP, SMB, ssh, X11…
>>912 機能が限定されてるものばかりだね
拡張しまくるからテキストで頑張ります
>>913 だからバージョン識別フィールドとか、
拡張領域とかがあるわけさ。
あ、テキストの利点。パケットスニッファのログで
通信の内容が一目見て把握しやすい。
バイナリの利点はプログラムから解析しやすい。
文字列操作は何かと面倒だしね。
スペース区切り TAB 区切りとか、柔軟に対応しようとすると
なかなか細かい文字列解析が必要で面倒。
>>914 > スペース区切り TAB 区切りとか、柔軟に対応しようとすると
ここが気になりますね。バイナリの方がいいのかな・・・
バイナリの場合で、改変メッセージを送られた場合の良い復帰法はありますか?
テキストの場合はそれを無視して、NULL終端を待てば簡単に復帰できるんですが
バイナリだとどう復帰して良いのか思いつきません。
改変メッセージの問題は、
バイナリ、テキスト関係ないだろ。
nul(NULLではない)終端改変されたら終りだから。
かなり浅い考えで、右往左往するタイプみたいだから、
一度冷静になって考えた方がいい。
テキスト志向で\0送る例って俺はあまり見たことが無いな……
>>916 テキストなら許容するバッファの最大までに
nul終端(でいいの?)が無ければ切断してしまおうと思ってるんだけど
バイナリだと番兵となるものが無くてどうしようかなと
>>917 ご想像のとおりレベル相当低くてさ
>>918 TCPなのUDPなの?
>>906のテキストパケットというのは7bitスルーにしたUDPパケットのこと?
TCPだと、
> テキストなら許容するバッファの最大までに
> nul終端(でいいの?)が無ければ切断してしまおうと思ってるんだけど
は全く意味ないよ。
UDPだったらその戦略はテキスト、バイナリに関係なく有効でしょ?
UDPパケットという境界があるんだから。
NULLって大文字4文字で書くと、ポインタのことだな。
null, nul, NULがヌル文字。(3文字はASCII規格での名前)
>>919 TCPです。
なんか勉強不足過ぎなのか、何故まったく意味が無いのが理解できないみたいです。
スレ汚しごめんね
921 :
901:2005/09/24(土) 15:14:14
>>902 THXです。
ビット単位で送る方法は無いんですね・・・。
う〜ん、サーバーにクライアントから送る情報が、ビットで事足りるんで、バイト文字にして送るのが凄くもったいないんですけど・・・。
具体的には、真偽値のみなんで・・・
? → ! の手紙と同じだな
バイナリ解析できなかった段階で指定した番兵を送ってもらう
要求出した時点から指定量読んでダメなら切断
確率の問題もあるが、現実的にほぼ復帰可能
>>921 そういうのを勿体ないと思って悩む時間が勿体ない。
根本的に間違っている。
> なんか勉強不足過ぎなのか、何故まったく意味が無いのが理解できないみたいです。
NUL文字を改竄されてたらどうするのってことジャマイカ
で、バッファの最大云々はバイナリでも有効だよっと。
ヘッダ見てサイズが不正なら切っちゃうこともできるか。
>>921 8つまとめて1バイトとして送れば良いじゃない。
どちみち下のレイヤーでヘッダが何十バイトとつけられると思うんだが……。
大量のクライアント(0〜10000程度)と接続するサーバーを作るとき、
そのテスト(接続できているか、データの送受信が正常か)はどうやればよろしゅうございますか?
ローカルでクライアントを延々起動させようと考えてますが
回線ディレイもなんもないのでちょぴーり不安でし
>>925 メッセージの最大許可長の倍のバッファを用意して
実際のリードバッファはそのバッファの中を移動させながら使っています。
\0から逆方向にもパースできる書式なので、死んだメッセージ以外の読みもらしもありません。
ただTCPを使ってる以上は不正の段階で切断でもいいかも知れませんね・・・
バイナリは必要に迫られたら切り替えてみます。ありがとう。
930 :
デフォルトの名無しさん:2005/09/25(日) 00:04:49
質問です。
TCPは、SYNとACKを繰り返してセッションを維持してるらしいですが
突然の不意な切断は、直ぐには感知出来ないと聞きました。
相手から返ってこなければ、直ぐにわかるものじゃないのでしょうか?
それが切断なのか単純に回線が遅いのかを検知できないだけじゃないの?
素人考えだけど
コリジョンなどでのパケット消失も許してるからね
中継ルータが一端落ちて、リルートしているところかもしれない。
ethernetケーブルを引っこ抜いて違うポートに差し替えるとかのように
物理的に切れてすらも待つ設計だしな
物理的に切れた場合って、タイムアウト以内にすぐつなぎ直せば
通信続行できる?
末端の線が切れると、ifdownになって、あちこちにエラーを言い触らす
OSがあるかもしれないな。
TCPのチャットで一階のノートPCを二階に持っていっても繋がっていたという話はある
>>936 windowsとかそういう実装だよなぁ。
ちょっと移動させたい時とか配線しなおしたい時に
安易にケーブル抜けなくてすごく不便。
>>938 モバイルIP使えよ
CoAが変わったり一瞬消えたりしても影響でないので超便利
>>925 > NUL文字を改竄されてたらどうするのってことジャマイカ
ビット化けの可能性を気にしすぎ。
ether, IP, TCPと三段階のchecksum検査を行っていますよ。
>>940 IP(V4)のchecksumはヘッダだけ。 データは含まれない。 V6ではそれもされない。
V6はそもそもパケットが暗号化されてるジャマイカ
943 :
872:2005/09/25(日) 15:42:07
パケットキャプチャソフト(WinPCapを利用して作成)のログ出力に関して質問した者です。
Etherealのように、他のソフトと互換性のあるログを作りたいのです。
だからlibpcap形式だけではなく、出来れば色々な種類のログ形式を知りたいのですが・・・。
(ここからここまで何ビットはこういう項目、のような)
そのものズバリが載っていなくても、参考になるページ等があったら教えて下さい。
えせれあるはソースでてるし。
pcapもソースあるし。
RFC1761とか
947 :
デフォルトの名無しさん:2005/09/27(火) 13:42:21
スレ違いかも知れませんが、
DHCPサーバから管理しているクライアントの一覧って取得できるんでしょうか?
MACアドレスとIPアドレスの一覧を知りたいのですけど。
DOSコマンドにありそうな気がするのですが見つけられませんでした。
とりあえずarp
950 :
947:2005/09/27(火) 17:12:13
すいません、説明が足りませんでした。
DHCPサーバはADSLモデムです。当然telnetとかはできません。
以前のADSLモデムではブラウザでログインするとクライアントの一覧を表示する
メニューがあったのですが今、使用しているADSLモデムにはありません。
こんな時に外部のPCからDHCPクライアントの一覧を見ることはできますか?
>>950 標準的な方法は存在しない。サーバ固有に提供される機能を探すしかない
それがないなら無理
できない。
近いことはブロードキャスト送って、arpで見ることでできる。
ブロードキャストを返さない変なOSを使っているなら、しらね。
それから、スレ違いだよ。
953 :
947:2005/09/27(火) 18:51:00
できないんですね。有り難うございました。
新手の業者か?
956 :
デフォルトの名無しさん:2005/09/30(金) 13:06:29
環境はWindowsでちと不安な部分を質問させていただきます。
//ソケットは既に任意の鯖に接続を確立しています。
send関数でソケットに
GET %s HTTP/1.0\r\nHost: %s\r\n\r\n (%sは欲しいファイルのURL)
を書き込み、recv関数で応答データを読み込むわけですが・・・
私の場合読み込み手順を //szBufはchar szBuf[1024]として宣言しておく
while(pageLenght!=0){
memset(szBuf, '\0', sizeof(szBuf));
pageLenght=recv(s, szBuf, (int)sizeof(szBuf) - 1, 0);
//fprintfなどでファイルに受信データを書き込む等
}
のようにぐるぐる回してデータを読んでます。これは自分が、このように回せば応答全部読めてるじゃん?
と思って、"たまたま"成功したに過ぎません。
応答データの読み込み手順の問題点・正攻法などのアドバイスをお願いします・・
すみません、
"GET %s HTTP/1.0\r\nHost: %s\r\n\r\n"は
一個目の%s=欲しいファイルのパス名
二個目の%s=サーバアドレス名でしたね..
不安なら、1.1にして、リクエストで、
Connection: close
すれば? ブロックI/OでEOFまで読むことを想定しているんでしょ?
まあ1.0だとdefaultでcloseのはずだけれど。
すみません、まだ猿のようにソケットの扱い方覚えた分際なんで・・
プロトコルなどをもっと勉強してまいりますΛllΛ
というかCのプログラミングもあんまりでしょ?
memset(szBuf, '\0', sizeof(szBuf)); は必要ないし、
sizeのところの - 1も必要ない。
recvの帰り値でどこまでデータが入っているか分かる。'\0'終端じゃなくて。
いらんでしょ
>>958 1.1にすると、Content-Encoding: chunkedとか対応しないとならないから
面倒だと思う。
Transfer-Encodingだよ
>>960 でも、そのあと文字列としてすぐ扱えるからゼロ埋め
でも、szBuf[pageAllLength]='\0';の方が好き
HTTPよりFTPのが軽いの?使ってる側からすれば、FTPのが色々してて重そうです。
ftpはデータコネクションの扱いが面倒
せんせいに FTP と HTTP の ちがいを きいたら
モニョモニョいって ごまかされました
ちちぶは きょうも やまが きれい でした