トップページ⇒tech
1001コメント341KB

ネットワークプログラミング相談室 Port26

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/03/23(火) 20:31:49
主にソケットに関しての質疑応答スレッドです。

Programming 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:01
>>158
kwsk
0160デフォルトの名無しさん2010/04/18(日) 01:46:54
でもソケットのスレじゃなくてネットワークプログラミングのスレなんだよね
0161デフォルトの名無しさん2010/04/18(日) 02:04:23
惘網綱綳線縲織
0162デフォルトの名無しさん2010/04/18(日) 12:29:02
GET / POST で HTTP リクエストするけど
相手のサーバによっては拒否される?
0163デフォルトの名無しさん2010/04/18(日) 12:33:10
どっちかというと
クライアントによっては拒否される
が正しいと思う
0164デフォルトの名無しさん2010/04/21(水) 06:24:24
受信割り込みを一時的に受付ないようにするにはどうすればよいのでしょうか?
0165デフォルトの名無しさん2010/04/21(水) 14:01:09
AcceptExなどのmswsock.dllに実装されている関数を、
WSAIoctlで取得した関数ポインタで呼び出すことが推奨されていると以下のページで書かれています。
ttp://eternalwindows.jp/network/winsock/winsock06c.html

実際にAcceptExを直接呼び出しても表面上は特に問題なく動作しているように思えますが、
どのような問題が発生する可能性があるのでしょうか?
御存知の方は教えて頂けると幸いです。
0166デフォルトの名無しさん2010/04/21(水) 14:16:05
>>165
差し換わるかもしれんじゃん。
0167デフォルトの名無しさん2010/04/21(水) 14:30:55
>>165
レス有り難うございます。
差し換わるというのは、コンパイル時に直接記述されたAcceptExのアドレスが、
mswsock.dllの変更やバージョン違いによってアドレスが変わってしまうという解釈で宜しいのでしょうか?
dllに関しての知識が不足してるので、見当違いでしたら申し訳無いです。
0168デフォルトの名無しさん2010/04/21(水) 14:32:26
すいません、レス番ミスです。
>>167 >>166
0169デフォルトの名無しさん2010/04/21(水) 14:48:10
>>167
mswsock.dllじゃなくなるかも。という事だろう。
0170デフォルトの名無しさん2010/04/21(水) 15:18:30
>>169
そういうことでしたか。
教えてくださった方どうも有り難うございました。
0171デフォルトの名無しさん2010/04/21(水) 19:56:30
recvfromって受信割り込みで動くのでしょうか?
デバイスドライバへの割り込みがきたあとに、recvfromをすることによって
データをとれるのでしょうか?
デバイスドライバへの割り込みを禁止してしまうと、データはrecvfromでとれないということ?
0172デフォルトの名無しさん2010/04/21(水) 20:01:01
http://pc12.2ch.net/test/read.cgi/tech/1205795434/780
0173デフォルトの名無しさん2010/04/24(土) 02:39:32
winsockで、アクセプトしてるネットワークカードの
127.0.0.1でないIPを取得する方法はありますか?
0174デフォルトの名無しさん2010/04/24(土) 02:52:22
>>173
アクセプトしているなら接続元のIPを取得できる
0175デフォルトの名無しさん2010/04/24(土) 11:29:51
>>173
getsockname
0176デフォルトの名無しさん2010/04/24(土) 12:32:45
IPってゆうな。クズ。
0177デフォルトの名無しさん2010/04/24(土) 16:44:22
>>176
っ□
0178デフォルトの名無しさん2010/04/24(土) 20:24:54
IPが駄目ならXPで、それでも駄目なら申し訳ないが:Pになる
0179デフォルトの名無しさん2010/04/29(木) 20:51:59
ゆうな、なんて書くなよ恥ずかしい
0180デフォルトの名無しさん2010/04/30(金) 16:02:08
ゆうなってゆうよ
はずかしがったらいかん
0181デフォルトの名無しさん2010/04/30(金) 19:33:45
Windows XPのTCPをオリジナルのTCPに変更したいのだが、
WinSockとかWinPcapとか使えば可能でしょうか?
0182デフォルトの名無しさん2010/04/30(金) 19:47:31
は?
0183 ◆0uxK91AxII 2010/04/30(金) 19:50:16
不可能。
0184デフォルトの名無しさん2010/04/30(金) 20:30:06
可能。
01851812010/04/30(金) 21:25:22
Winsockの呼び出しをフックするか、
winsock.dllのラッパーを作れば良さそうですね。
ありがとうございました。
0186デフォルトの名無しさん2010/04/30(金) 21:26:57
ネトゲに割り込むのかな?
0187デフォルトの名無しさん2010/05/02(日) 10:25:54
質問です。

WinSockで自分のPCのグローバルIPアドレスを取得するには
どうすればいいでしょうか?
0188デフォルトの名無しさん2010/05/02(日) 10:41:13
http://checkip.dyndns.org/
0189デフォルトの名無しさん2010/05/02(日) 11:52:21
>>187
一般的には、UPnPを使うことになると思います。
winsockでゴリゴリ書いてももちろんかまわないのですが、COMインターフェースが
用意されているので使ってみてはどうでしょうか?
0190デフォルトの名無しさん2010/05/03(月) 09:25:03
NAT越しに通信してるときに
NAT後に利用している送信元ポート番号を知る方法ない?
通信相手に教えてもらう以外で。
あったら教えてください。
0191デフォルトの名無しさん2010/05/03(月) 10:03:19
ない、プロトコルを学ぶべき
0192デフォルトの名無しさん2010/05/03(月) 10:11:05
>>191
プロトコルから外れた標準外の方法でもいいんだけど。
まぁ確かにライブラリを使うってだけの話じゃないから、
難しいってのはわかるよ。
0193デフォルトの名無しさん2010/05/03(月) 10:46:14
横からですが、それできちゃったらNATの意味ないんじゃ・・・・
クラッカーとかはどうか知らんけど・・
0194デフォルトの名無しさん2010/05/03(月) 12:30:20
NATの内側同士でP2Pするソフトがあるから
それのソース見て勉強しなさい
0195デフォルトの名無しさん2010/05/03(月) 20:48:35
Winsock2の質問ですが、
ソケットエラーが返ってきた場合でもclosesocket()は必要でしたっけ?
0196デフォルトの名無しさん2010/05/03(月) 21:23:21
>>195
ソケット作成時以外なら要るだろう。
0197デフォルトの名無しさん2010/05/04(火) 02:28:16
>>196
ありがとうございました。
0198デフォルトの名無しさん2010/05/04(火) 07:57:06
>>193
知られちゃダメなNATの意味ってなんだよ。UPnPなんか許せない死ねという主張か?
0199デフォルトの名無しさん2010/05/04(火) 21:21:47
>>190
NATトラバーサルとかそういうこと?
0200デフォルトの名無しさん2010/05/06(木) 19:01:45
ネットワークについての質問です。
皆さんの力をお貸しください。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1440449509
0201デフォルトの名無しさん2010/05/06(木) 19:28:45
>>200
普通に共有フォルダでいいだろw
0202デフォルトの名無しさん2010/05/06(木) 21:01:01
>パソコン部の高校での文化祭で展示したいものがあります。
>それが、パソコン2台を接続してハードディスクなどを共有することです。

どこの国の人だよ
0203デフォルトの名無しさん2010/05/06(木) 21:57:30
>>202
パソコンの中、つまり仮想世界なんです

仮想世界の高校での文化祭で展示したいものがあります。
それが、パソコン2台を接続してハードディスクなどを共有することです。
パソコン2台とは1台は仮想世界のパソコンでもう一台は現実世界のパソコンです
0204デフォルトの名無しさん2010/05/06(木) 22:25:18
一部といわず、全部仮想世界の出来事にすればいい
死んでるように見えますが、仮想世界では生きてます
0205デフォルトの名無しさん2010/05/06(木) 22:40:13
matrixの世界だな

君が現実と思っている世界は実は仮想世界なんだ
神の創った仮想世界、それが君達の世界なのだよ
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:10
素朴な疑問なのですが、Winsockの
WSAAsync
は何の略なのでしょうか?

WSはWinSockな気がしますが、AAsyncとは…?
syncはsynchronizeでしょうが、それならAASyncとなりそうなもの。
そもそもAAって?
0209デフォルトの名無しさん2010/05/07(金) 10:51:59
WSA: Windows Sockets API
0210デフォルトの名無しさん2010/05/07(金) 10:54:07
WinSockApiASynchronous かな
0211デフォルトの名無しさん2010/05/07(金) 10:55:57
WinSockAPI Async
0212デフォルトの名無しさん2010/05/07(金) 13:07:02
ASync のAは一体・・・
0213デフォルトの名無しさん2010/05/07(金) 13:22:25
アシンクロナスだろ
非同期っつー意味
0214デフォルトの名無しさん2010/05/07(金) 13:50:43
おお、Asynchronous で非同期って意味か
0215デフォルトの名無しさん2010/05/07(金) 13:59:30
うわあ、ネタじゃ無かったのか。
0216デフォルトの名無しさん2010/05/07(金) 14:21:14
Sを大文字にしてる香具師は馬鹿
0217デフォルトの名無しさん2010/05/07(金) 14:22:20
>>216とか>>216とか>>216とか
の事か?
0218デフォルトの名無しさん2010/05/07(金) 15:18:27
質問よろしいでしょうか
gethostbynameは即座に処理が返ってくるとは限らないので、なるべく
WSAAsyncGetHostByName を使った方が良い。

ということだったので使ってみているのですが、
実験として「名前解決に数秒かかる」状態を試してみたいと考えています。

どのようなアドレスを指定すれば、そのような挙動になるでしょうか?
・存在しないアドレスを指定してみる
・LANケーブルをひっこぬいた上で、存在するアドレスを指定してみる
・LANケーブルをひっこぬいた上で、存在しないアドレスを指定してみる
と試してみましたが、どれも1秒もたたないうちに「失敗」となりました。
0219デフォルトの名無しさん2010/05/07(金) 15:32:39
壊れた(Timeout長めにポートフィルタされた)DNSに登録されているドメインのFQDNを指定する
0220デフォルトの名無しさん2010/05/07(金) 15:38:35
>>218
存在しないLAN外のアドレスを指定するといいよ
0221デフォルトの名無しさん2010/05/07(金) 15:47:37
>>219
となると、自前でDNSサーバーを立てなければなりませんね。
仕組みは知っているものの、気軽に立てられるものなのかなどはサッパリです。今ぐぐって勉強し始めました

>>220
存在しないアドレス(LAN外です)を指定してみたのですが、1秒立たずに失敗で返ってきました。
私自身も、仕組み上長い間さまよってくれると期待していたのですが・・・。

試してみたアドレスは以下の通りです。キーボードをめちゃくちゃに打ったものです。
www.fadbiouhfewrw.com
プログラムの間違いも考え、試しにブラウザでも開いてみようとしましたが、こちらも1秒立たずに
「存在しないサーバーです」となりました。
0222デフォルトの名無しさん2010/05/07(金) 15:49:51
>>218
実験するPCのファイアウォール設定でTCP53行きパケットを破棄しておいて実行する
(REJECTじゃなくてDROPね)
0223デフォルトの名無しさん2010/05/07(金) 15:54:22
LAN内の存在しないアドレスをネームサーバとして設定する。
0224デフォルトの名無しさん2010/05/07(金) 15:58:49
>>223
10秒くらい稼げるね
0225デフォルトの名無しさん2010/05/07(金) 16:08:34
>>222-224
アイデアありがとうございます。

>>223
こちらの手法で試したところ、10秒程度の時間無反応にすることができました。
ありがとうございます。

他の人がやる時のために記述しておきます。WindowsXPです。

・コンパネで「ネットワーク接続」
・「ローカルエリア接続」を選択して開く(接続の仕方によって、多分名前違うでしょう)
・プロパティ
・インターネットプロトコル(TCP/IP)を選択し、プロパティ
・「次のDNSサーバーのアドレスを使う」をONにし、優先DNSサーバーに存在しないローカルIPアドレスを割り振って「OK」ボタン
・ウインドウが1つ閉じるので、あらためてこちらも「OK」ボタンを押す(押さないとまだ設定が反映されていませんでした)

この状態で実験。
0226デフォルトの名無しさん2010/05/07(金) 16:24:44
やっぱさ、任意の通信障害を起こせるHUBってほしいよね。
0227デフォルトの名無しさん2010/05/07(金) 17:02:57
>>226
dummynet
0228デフォルトの名無しさん2010/05/07(金) 17:06:08
linuxならnetem、freebsdならaltq使えば、大抵のエラーは起こせるだろ。
fcs壊すようなL2エラーとか、ワイヤレート欲しいとかなら専用ハードになるけど。
0229デフォルトの名無しさん2010/05/07(金) 17:47:27
通信遅延とかそういう現象も全部試験したいなら、GtrcNETという装置があるぞ
0230デフォルトの名無しさん2010/05/07(金) 17:59:43
>>229
netemやdummynetは遅延出来るよ.
0231デフォルトの名無しさん2010/05/07(金) 18:31:39
長いLANケーブル使えばいいじゃん
0232デフォルトの名無しさん2010/05/07(金) 18:33:33
箱ごと何巻も繋いでるのを見たことがあるな
0233デフォルトの名無しさん2010/05/07(金) 18:41:39
まずブラジルに親戚を作ってだな・・・
0234デフォルトの名無しさん2010/05/07(金) 18:44:15
意外と近くて遠い国は北朝鮮とか
0235デフォルトの名無しさん2010/05/07(金) 20:56:51
相談よろしいでしょうか。

gethostbynameに相当する関数は、
・gehostbyname
・getaddrinfo
・WSAAsyncGetHostByName
の3つだと思うのですが、少し悩んでいます。

と言いますのも
SOCKET SocketConnect(address, port, timeout);
こんな感じの関数を作りたいのですが、上記3つはどれもタイムアウトを設定する術が無さそうなのです。

connectは
::WSAEventSelect(socket, hEvent, FD_CONNECT);
こうすることで、タイムアウト付きで呼び出せているのですが…。

何か良い方法はありますでしょうか?
(WSAAsyncを使うのが正道だとは思うのですが…)
0236デフォルトの名無しさん2010/05/07(金) 22:28:58
別スレッドでgetaddrinfoを使って問い合わせる。 MSDNでも推奨

http://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
サーバー側のWinsockプログラムで質問です。
特定のIPからのアクセスを「成立させずに却下する」ことはできないでしょうか?

現在はとりあえず成立させたあと、IPを調べ、NGユーザーなら即座にshutdown & closesocket しています。
つまり、ユーザー側はconnectに「成功」し、即座に切断されます。

ここをconnectにそもそも失敗させてやりたいのです。
0238デフォルトの名無しさん2010/05/08(土) 23:46:37
そんなもんスイッチにやらせりゃいいじゃん
0239デフォルトの名無しさん2010/05/08(土) 23:55:42
スイッチ?とはなんでしょう?
0240デフォルトの名無しさん2010/05/09(日) 00:00:52
ははは
ご冗談を
0241デフォルトの名無しさん2010/05/09(日) 00:12:23
netsh
0242デフォルトの名無しさん2010/05/09(日) 00:28:39
>>239
ルーター、サーバーのファイアウォールでしっしっ
0243デフォルトの名無しさん2010/05/09(日) 00:34:06
アプリケーションでやるのが目的となります。
何か方法があれば教えていただけますでしょうか。
0244デフォルトの名無しさん2010/05/09(日) 00:38:07
FWもアプリケーション
0245デフォルトの名無しさん2010/05/09(日) 00:55:14
すげえ揚げ足取り
0246デフォルトの名無しさん2010/05/09(日) 03:00:09
IPってゆうな。クズ。
0247デフォルトの名無しさん2010/05/09(日) 05:25:01
>>243
acceptする前にackを返すので無理です。
SYN FLOODがなぜ未だに有効な攻撃手段なのかを考えればわかると思いますが、
アプリ側でやれる事といえばせいぜいBACKLOG数を調整するくらいです。
0248デフォルトの名無しさん2010/05/09(日) 09:02:42
何度このリンクを貼ればいいのか
http://ruffnex.oc.to/kenji/text/fire_a/
0249デフォルトの名無しさん2010/05/09(日) 13:01:35
何回目?
0250デフォルトの名無しさん2010/05/09(日) 14:06:19
accept拒否はWSAAcceptのlpfnConditionを使えば出来るんじゃないの?
0251デフォルトの名無しさん2010/05/09(日) 14:30:52
>>237
可能。winsock限定になるが。
MSDNで「SO_CONDITIONAL_ACCEPT」と「WSAAccept」を参照すべし。
0252デフォルトの名無しさん2010/05/09(日) 15:43:20
>>249
もう二度目だよ
いい加減にしてほしい
0253デフォルトの名無しさん2010/05/09(日) 17:37:11
>>248
UNIX版も作って!
0254デフォルトの名無しさん2010/05/09(日) 22:22:10
>250-251
ありがとうございました。
無事できました。
しかしこれ、情報少ないですね。
気になる点としては

SO_CONDITIONAL_ACCEPT ソケット オプションを使用して通信するプログラムを使用すると、ネットワークのパフォーマンスが低下する
ttp://support.microsoft.com/kb/328264/ja

↑これと、後は「CF_REJECT」を返しても2〜3回程度WSAAcceptが反応することでしょうか。
断ってるんだからあきらめろ!
と言いたいところですが、断られたことが相手に通じるまでの間に、再要求が何度も来ているという感じでしょうか?
(もちろん、クライアントは1度のconnectしか呼んでいません)
0255デフォルトの名無しさん2010/05/10(月) 15:25:50
>>254
KBの328264についてはXP Service Pack 2で修正済みとあるよ。
ただそれでもSO_CONDITIONAL_ACCEPTを使わない場合と比較すると
一定時間内に受け付け可能な接続数とかは低下するだろうけど。

>「CF_REJECT」を返しても2〜3回程度WSAAcceptが反応することでしょうか。
えっ?マジで?
サーバからちゃんとRST出てる?
0256デフォルトの名無しさん2010/05/10(月) 17:30:07
>>255
レスありがとうございます。

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
反応というのはprintf("%d\n", user);の出力があるという事か?
その時のuserの値は?
0258デフォルトの名無しさん2010/05/10(月) 18:06:34
>>257
はい、printfが2〜3回反応します。ほとんどの場合3回です。
値は -1なのでINVALID_SOCKETです。
■ このスレッドは過去ログ倉庫に格納されています