ネットワークプログラミング相談室 Port26
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/03/23(火) 20:31:49Programming 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辺り
足りなかったら適当に付け足してね
前スレ
ネットワークプログラミング相談室 Port25
http://pc12.2ch.net/test/read.cgi/tech/1255459388/
関連スレ
ネットワークプログラミング雑談
http://pc12.2ch.net/test/read.cgi/tech/1235800707/
Java ネットワークプログラミング 【教えて!】
http://pc12.2ch.net/test/read.cgi/tech/1086238859/
0159デフォルトの名無しさん
2010/04/18(日) 01:24:01kwsk
0160デフォルトの名無しさん
2010/04/18(日) 01:46:540161デフォルトの名無しさん
2010/04/18(日) 02:04:230162デフォルトの名無しさん
2010/04/18(日) 12:29:02相手のサーバによっては拒否される?
0163デフォルトの名無しさん
2010/04/18(日) 12:33:10クライアントによっては拒否される
が正しいと思う
0164デフォルトの名無しさん
2010/04/21(水) 06:24:240165デフォルトの名無しさん
2010/04/21(水) 14:01:09WSAIoctlで取得した関数ポインタで呼び出すことが推奨されていると以下のページで書かれています。
ttp://eternalwindows.jp/network/winsock/winsock06c.html
実際にAcceptExを直接呼び出しても表面上は特に問題なく動作しているように思えますが、
どのような問題が発生する可能性があるのでしょうか?
御存知の方は教えて頂けると幸いです。
0166デフォルトの名無しさん
2010/04/21(水) 14:16:05差し換わるかもしれんじゃん。
0167デフォルトの名無しさん
2010/04/21(水) 14:30:55レス有り難うございます。
差し換わるというのは、コンパイル時に直接記述されたAcceptExのアドレスが、
mswsock.dllの変更やバージョン違いによってアドレスが変わってしまうという解釈で宜しいのでしょうか?
dllに関しての知識が不足してるので、見当違いでしたら申し訳無いです。
0168デフォルトの名無しさん
2010/04/21(水) 14:32:26>>167 >>166
0169デフォルトの名無しさん
2010/04/21(水) 14:48:10mswsock.dllじゃなくなるかも。という事だろう。
0170デフォルトの名無しさん
2010/04/21(水) 15:18:30そういうことでしたか。
教えてくださった方どうも有り難うございました。
0171デフォルトの名無しさん
2010/04/21(水) 19:56:30デバイスドライバへの割り込みがきたあとに、recvfromをすることによって
データをとれるのでしょうか?
デバイスドライバへの割り込みを禁止してしまうと、データはrecvfromでとれないということ?
0172デフォルトの名無しさん
2010/04/21(水) 20:01:010173デフォルトの名無しさん
2010/04/24(土) 02:39:32127.0.0.1でないIPを取得する方法はありますか?
0174デフォルトの名無しさん
2010/04/24(土) 02:52:22アクセプトしているなら接続元のIPを取得できる
0175デフォルトの名無しさん
2010/04/24(土) 11:29:51getsockname
0176デフォルトの名無しさん
2010/04/24(土) 12:32:450177デフォルトの名無しさん
2010/04/24(土) 16:44:22っ□
0178デフォルトの名無しさん
2010/04/24(土) 20:24:540179デフォルトの名無しさん
2010/04/29(木) 20:51:590180デフォルトの名無しさん
2010/04/30(金) 16:02:08はずかしがったらいかん
0181デフォルトの名無しさん
2010/04/30(金) 19:33:45WinSockとかWinPcapとか使えば可能でしょうか?
0182デフォルトの名無しさん
2010/04/30(金) 19:47:310184デフォルトの名無しさん
2010/04/30(金) 20:30:060185181
2010/04/30(金) 21:25:22winsock.dllのラッパーを作れば良さそうですね。
ありがとうございました。
0186デフォルトの名無しさん
2010/04/30(金) 21:26:570187デフォルトの名無しさん
2010/05/02(日) 10:25:54WinSockで自分のPCのグローバルIPアドレスを取得するには
どうすればいいでしょうか?
0188デフォルトの名無しさん
2010/05/02(日) 10:41:130189デフォルトの名無しさん
2010/05/02(日) 11:52:21一般的には、UPnPを使うことになると思います。
winsockでゴリゴリ書いてももちろんかまわないのですが、COMインターフェースが
用意されているので使ってみてはどうでしょうか?
0190デフォルトの名無しさん
2010/05/03(月) 09:25:03NAT後に利用している送信元ポート番号を知る方法ない?
通信相手に教えてもらう以外で。
あったら教えてください。
0191デフォルトの名無しさん
2010/05/03(月) 10:03:190192デフォルトの名無しさん
2010/05/03(月) 10:11:05プロトコルから外れた標準外の方法でもいいんだけど。
まぁ確かにライブラリを使うってだけの話じゃないから、
難しいってのはわかるよ。
0193デフォルトの名無しさん
2010/05/03(月) 10:46:14クラッカーとかはどうか知らんけど・・
0194デフォルトの名無しさん
2010/05/03(月) 12:30:20それのソース見て勉強しなさい
0195デフォルトの名無しさん
2010/05/03(月) 20:48:35ソケットエラーが返ってきた場合でもclosesocket()は必要でしたっけ?
0196デフォルトの名無しさん
2010/05/03(月) 21:23:21ソケット作成時以外なら要るだろう。
0197デフォルトの名無しさん
2010/05/04(火) 02:28:16ありがとうございました。
0198デフォルトの名無しさん
2010/05/04(火) 07:57:06知られちゃダメなNATの意味ってなんだよ。UPnPなんか許せない死ねという主張か?
0199デフォルトの名無しさん
2010/05/04(火) 21:21:47NATトラバーサルとかそういうこと?
0200デフォルトの名無しさん
2010/05/06(木) 19:01:45皆さんの力をお貸しください。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1440449509
0201デフォルトの名無しさん
2010/05/06(木) 19:28:45普通に共有フォルダでいいだろw
0202デフォルトの名無しさん
2010/05/06(木) 21:01:01>それが、パソコン2台を接続してハードディスクなどを共有することです。
どこの国の人だよ
0203デフォルトの名無しさん
2010/05/06(木) 21:57:30パソコンの中、つまり仮想世界なんです
仮想世界の高校での文化祭で展示したいものがあります。
それが、パソコン2台を接続してハードディスクなどを共有することです。
パソコン2台とは1台は仮想世界のパソコンでもう一台は現実世界のパソコンです
0204デフォルトの名無しさん
2010/05/06(木) 22:25:18死んでるように見えますが、仮想世界では生きてます
0205デフォルトの名無しさん
2010/05/06(木) 22:40:13君が現実と思っている世界は実は仮想世界なんだ
神の創った仮想世界、それが君達の世界なのだよ
0206デフォルトの名無しさん
2010/05/06(木) 22:40:17最近チェックしてないからよく分からん。
0207デフォルトの名無しさん
2010/05/07(金) 00:20:08,r'⌒ `ヽ ) じ じ は (
( ( ,. ┴─ . ( た ぬ 丿
ゝ ´ / \ ) く (
「 厂ッヘ ̄\ ', ( な )
リ ./ ,==≧v ,ィ} ノ い /
/ { 〃 j 「`'} \ ノ
/ .| r--、_ イ } ゝ─っ .-─'′
,イ | 彳 ̄` ‐.マ}ノ --==彡 '
r'´ :l \ .| {_,,_ //
_/ ゝ. \\ `´/
/ ̄ ミ≧rrrイ
/ ヾツ\
/ \ \
/ \ ノ. \
. / .-‐===キミ、_____∠彡=≧
. ' / ̄ヽ ∨://///V///// /  ̄\
/ | / ̄ ̄ ̄∨////////// / \
/ | / r──-く^V://///// // ヘ
0208デフォルトの名無しさん
2010/05/07(金) 10:40:10WSAAsync
は何の略なのでしょうか?
WSはWinSockな気がしますが、AAsyncとは…?
syncはsynchronizeでしょうが、それならAASyncとなりそうなもの。
そもそもAAって?
0209デフォルトの名無しさん
2010/05/07(金) 10:51:590210デフォルトの名無しさん
2010/05/07(金) 10:54:070211デフォルトの名無しさん
2010/05/07(金) 10:55:570212デフォルトの名無しさん
2010/05/07(金) 13:07:020213デフォルトの名無しさん
2010/05/07(金) 13:22:25非同期っつー意味
0214デフォルトの名無しさん
2010/05/07(金) 13:50:430215デフォルトの名無しさん
2010/05/07(金) 13:59:300216デフォルトの名無しさん
2010/05/07(金) 14:21:140217デフォルトの名無しさん
2010/05/07(金) 14:22:20の事か?
0218デフォルトの名無しさん
2010/05/07(金) 15:18:27gethostbynameは即座に処理が返ってくるとは限らないので、なるべく
WSAAsyncGetHostByName を使った方が良い。
ということだったので使ってみているのですが、
実験として「名前解決に数秒かかる」状態を試してみたいと考えています。
どのようなアドレスを指定すれば、そのような挙動になるでしょうか?
・存在しないアドレスを指定してみる
・LANケーブルをひっこぬいた上で、存在するアドレスを指定してみる
・LANケーブルをひっこぬいた上で、存在しないアドレスを指定してみる
と試してみましたが、どれも1秒もたたないうちに「失敗」となりました。
0219デフォルトの名無しさん
2010/05/07(金) 15:32:390220デフォルトの名無しさん
2010/05/07(金) 15:38:35存在しないLAN外のアドレスを指定するといいよ
0221デフォルトの名無しさん
2010/05/07(金) 15:47:37となると、自前でDNSサーバーを立てなければなりませんね。
仕組みは知っているものの、気軽に立てられるものなのかなどはサッパリです。今ぐぐって勉強し始めました
>>220
存在しないアドレス(LAN外です)を指定してみたのですが、1秒立たずに失敗で返ってきました。
私自身も、仕組み上長い間さまよってくれると期待していたのですが・・・。
試してみたアドレスは以下の通りです。キーボードをめちゃくちゃに打ったものです。
www.fadbiouhfewrw.com
プログラムの間違いも考え、試しにブラウザでも開いてみようとしましたが、こちらも1秒立たずに
「存在しないサーバーです」となりました。
0222デフォルトの名無しさん
2010/05/07(金) 15:49:51実験するPCのファイアウォール設定でTCP53行きパケットを破棄しておいて実行する
(REJECTじゃなくてDROPね)
0223デフォルトの名無しさん
2010/05/07(金) 15:54:220224デフォルトの名無しさん
2010/05/07(金) 15:58:4910秒くらい稼げるね
0225デフォルトの名無しさん
2010/05/07(金) 16:08:34アイデアありがとうございます。
>>223
こちらの手法で試したところ、10秒程度の時間無反応にすることができました。
ありがとうございます。
他の人がやる時のために記述しておきます。WindowsXPです。
・コンパネで「ネットワーク接続」
・「ローカルエリア接続」を選択して開く(接続の仕方によって、多分名前違うでしょう)
・プロパティ
・インターネットプロトコル(TCP/IP)を選択し、プロパティ
・「次のDNSサーバーのアドレスを使う」をONにし、優先DNSサーバーに存在しないローカルIPアドレスを割り振って「OK」ボタン
・ウインドウが1つ閉じるので、あらためてこちらも「OK」ボタンを押す(押さないとまだ設定が反映されていませんでした)
この状態で実験。
0226デフォルトの名無しさん
2010/05/07(金) 16:24:440227デフォルトの名無しさん
2010/05/07(金) 17:02:57dummynet
0228デフォルトの名無しさん
2010/05/07(金) 17:06:08fcs壊すようなL2エラーとか、ワイヤレート欲しいとかなら専用ハードになるけど。
0229デフォルトの名無しさん
2010/05/07(金) 17:47:270230デフォルトの名無しさん
2010/05/07(金) 17:59:43netemやdummynetは遅延出来るよ.
0231デフォルトの名無しさん
2010/05/07(金) 18:31:390232デフォルトの名無しさん
2010/05/07(金) 18:33:330233デフォルトの名無しさん
2010/05/07(金) 18:41:390234デフォルトの名無しさん
2010/05/07(金) 18:44:150235デフォルトの名無しさん
2010/05/07(金) 20:56:51gethostbynameに相当する関数は、
・gehostbyname
・getaddrinfo
・WSAAsyncGetHostByName
の3つだと思うのですが、少し悩んでいます。
と言いますのも
SOCKET SocketConnect(address, port, timeout);
こんな感じの関数を作りたいのですが、上記3つはどれもタイムアウトを設定する術が無さそうなのです。
connectは
::WSAEventSelect(socket, hEvent, FD_CONNECT);
こうすることで、タイムアウト付きで呼び出せているのですが…。
何か良い方法はありますでしょうか?
(WSAAsyncを使うのが正道だとは思うのですが…)
0236デフォルトの名無しさん
2010/05/07(金) 22:28:58http://msdn.microsoft.com/en-us/library/ms741522(VS.85).aspx
Note The WSAAsyncGetHostByName function is not designed to provide parallel
resolution of several names. Therefore, applications that issue several requests
should not expect them to be executed concurrently. Alternatively, applications
can start another thread and use the getaddrinfo function to resolve names in an
IP-version agnostic manner. Developers creating Windows Sockets 2 applications are
urged to use the getaddrinfo function to enable smooth transition to IPv6 compatibility.
0237デフォルトの名無しさん
2010/05/08(土) 23:42:08特定のIPからのアクセスを「成立させずに却下する」ことはできないでしょうか?
現在はとりあえず成立させたあと、IPを調べ、NGユーザーなら即座にshutdown & closesocket しています。
つまり、ユーザー側はconnectに「成功」し、即座に切断されます。
ここをconnectにそもそも失敗させてやりたいのです。
0238デフォルトの名無しさん
2010/05/08(土) 23:46:370239デフォルトの名無しさん
2010/05/08(土) 23:55:420240デフォルトの名無しさん
2010/05/09(日) 00:00:52ご冗談を
0241デフォルトの名無しさん
2010/05/09(日) 00:12:230242デフォルトの名無しさん
2010/05/09(日) 00:28:39ルーター、サーバーのファイアウォールでしっしっ
0243デフォルトの名無しさん
2010/05/09(日) 00:34:06何か方法があれば教えていただけますでしょうか。
0244デフォルトの名無しさん
2010/05/09(日) 00:38:070245デフォルトの名無しさん
2010/05/09(日) 00:55:140246デフォルトの名無しさん
2010/05/09(日) 03:00:090247デフォルトの名無しさん
2010/05/09(日) 05:25:01acceptする前にackを返すので無理です。
SYN FLOODがなぜ未だに有効な攻撃手段なのかを考えればわかると思いますが、
アプリ側でやれる事といえばせいぜいBACKLOG数を調整するくらいです。
0248デフォルトの名無しさん
2010/05/09(日) 09:02:42http://ruffnex.oc.to/kenji/text/fire_a/
0249デフォルトの名無しさん
2010/05/09(日) 13:01:350250デフォルトの名無しさん
2010/05/09(日) 14:06:190251デフォルトの名無しさん
2010/05/09(日) 14:30:52可能。winsock限定になるが。
MSDNで「SO_CONDITIONAL_ACCEPT」と「WSAAccept」を参照すべし。
0252デフォルトの名無しさん
2010/05/09(日) 15:43:20もう二度目だよ
いい加減にしてほしい
0253デフォルトの名無しさん
2010/05/09(日) 17:37:11UNIX版も作って!
0254デフォルトの名無しさん
2010/05/09(日) 22:22:10ありがとうございました。
無事できました。
しかしこれ、情報少ないですね。
気になる点としては
SO_CONDITIONAL_ACCEPT ソケット オプションを使用して通信するプログラムを使用すると、ネットワークのパフォーマンスが低下する
ttp://support.microsoft.com/kb/328264/ja
↑これと、後は「CF_REJECT」を返しても2〜3回程度WSAAcceptが反応することでしょうか。
断ってるんだからあきらめろ!
と言いたいところですが、断られたことが相手に通じるまでの間に、再要求が何度も来ているという感じでしょうか?
(もちろん、クライアントは1度のconnectしか呼んでいません)
0255デフォルトの名無しさん
2010/05/10(月) 15:25:50KBの328264についてはXP Service Pack 2で修正済みとあるよ。
ただそれでもSO_CONDITIONAL_ACCEPTを使わない場合と比較すると
一定時間内に受け付け可能な接続数とかは低下するだろうけど。
>「CF_REJECT」を返しても2〜3回程度WSAAcceptが反応することでしょうか。
えっ?マジで?
サーバからちゃんとRST出てる?
0256デフォルトの名無しさん
2010/05/10(月) 17:30:07レスありがとうございます。
RTS というのについてこれから勉強させていただきますが、まずは自分が書いたソースを転載しておきます。
使い方間違えている可能性も高そうですので。
unsigned long flg = TRUE;
setsockopt(sck, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, (PSTR)&flg, sizeof(flg));
listen(m_sckListen, 10);
while(true)
{
struct sockaddr addr;
int len = sizeof(addr);
SOCKET user = WSAAccept(sck, &addr, &len, CheckFunc, NULL);
printf("%d\n", user);
}
int CALLBACK CheckFunc(引数省略)
{
return CF_REJECT;
}
こんな感じです。(感じですというか、プロジェクトからコピペしました)
この状態でクライアントからconnectすると、WSAAcceptが2〜3回反応します。
サーバーとクライアントは同PC上で動作させ、localhostへ向かってconnectさせています。
connectを呼ぶのは1度だけ。結果としてはもちろん「拒否」され、connectは失敗します。
0257デフォルトの名無しさん
2010/05/10(月) 17:44:40その時のuserの値は?
0258デフォルトの名無しさん
2010/05/10(月) 18:06:34はい、printfが2〜3回反応します。ほとんどの場合3回です。
値は -1なのでINVALID_SOCKETです。
■ このスレッドは過去ログ倉庫に格納されています