ネットワークプログラミング相談室 Port27at TECH
ネットワークプログラミング相談室 Port27 - 暇つぶし2ch234:デフォルトの名無しさん
11/04/13 12:32:56.36
>>232
>INADDR_ANYで送信するときって、送信元として入るアドレス選択に
>きまりはあるのでしょうか?

ホストのルーティングテーブルでネクストポップを決定して、
そのネクストポップと同じサブネットのアドレス。

>>233
>してなければ、出て行ったインタフェースのアドレス

232が聞いてるのは一つのインターフェイスに複数のIPアドレス振ってる時の話でしょ。

235:デフォルトの名無しさん
11/04/13 12:38:44.84
同じNICに二つのIPアドレス振ってるときは
出て行くのはプライマリのIPアドレスからになる


236:デフォルトの名無しさん
11/04/13 18:19:07.72
>>235
んなわけあるかい。
「プライマリの」なんて概念が前時代的。

237:232
11/04/14 00:35:43.37
>>233-235
ありがとうございます。
>>234さんの指摘のように、1つのインタフェースに複数のアドレスが定義されている場合です。

>>234
> ホストのルーティングテーブルでネクストポップを決定して、
> そのネクストポップと同じサブネットのアドレス。

浅学ですみません。。。定義した複数アドレスが、同一ネットワークの場合はどうなるでしょうか?
基本的な質問で恐縮なのですが、なぜこういう質問をしているか、
>>232の話をもう少し具体的に言うと

① サーバ    : アドレス 192.168.0.20/24 さらに同じNICに対して、エイリアスで 192.168.0.1/24 を定義している
② クライアント : アドレス 192.168.0.10/24

この状態で①→②へ送信します。送信方法は>>232に書いたように、UDPで、ポートは固定で指定、
ホストアドレスは INADDR_ANY で作ってバインドしてあります。
①でsendtoして②でrecvfromしたとき、②で受信したときの送信元(①)のアドレスがどうなるか?なのです。
というのも、①がWindowsXPの場合は、送信元アドレスが 192.168.0.20 となったのですが、
Windows7の場合は、192.168.0.1 となるのです・・・
>>234さんの指摘をもらって、route print してみると、
確かに WindowsXP では、192.168.0.0/24 の interface が 192.168.0.20 となっているのですが(>>235さんの言うプライマリですね)
Windows7の場合は、192.168.0.0/24 の interface は 192.168.0.1 となっています。
Windows7の場合、アドレスが小さいものが interface に優先されてしまう?と疑問を持った次第です。

これまでXPで使っていたプログラムで、Windows7へ持っていくと動作が変わるので、
これをなんとかしたい、というのが背景です。

238:デフォルトの名無しさん
11/04/14 06:30:29.12
INADDR_ANYをやめる

239:デフォルトの名無しさん
11/04/14 15:29:36.22
Linuxのソケットで
まだreadしてないたまっているバッファをすべて破棄するには
どうするのが一番スマートで速くて格好いいデスか?

240:デフォルトの名無しさん
11/04/14 15:43:31.87
select, readループ

241:デフォルトの名無しさん
11/04/14 15:53:11.93
>>240
空読みが許されるのは童貞までだよねー

242:232
11/04/14 18:19:21.77
自己解決しました。

結論から言うと、OSの仕様でした。(無印Win7しか確認していませんが)
URLリンク(support.microsoft.com)

↑のKBの修正Hotfixを当ててから、
netsh で skipassource=true にしてエイリアスのIPアドレスを
同一NICに追加してやると、プライマリ相当のアドレスで返ってくるようになりました。
またこのとき、route print すると Gateway と Interface がプライマリ相当のアドレスになることが確認できました。

>>236さんの言うようにプライマリという概念がそもそもなくなってるともいえますし、
OSの動作が、XP/2003Server → Win7/2008R2 で変わったともいえると思います。
まあプログラム側がOSの仕様を決め打ちした動きになってるのが悪いんですが・・・w

とりあえずOSのアップデートか、>>238さんの言うようにプログラム側で対処するか、
どちらかで検討します。
お騒がせしました。

243:デフォルトの名無しさん
11/04/14 19:55:54.78
くっそ
ソケットに対してlseekするとエラーになるんじゃん!

244:デフォルトの名無しさん
11/04/14 19:59:14.69
いやいやいやいや
常識的に考えて出来るはずなかろう?

245:デフォルトの名無しさん
11/04/14 20:01:50.14
向こうが shutdown で閉じてれば あるいわ… ってTCP限定の話になっちゃうか

soket 閉じて開きなおすのはマズイのだろうか と戯言

246:デフォルトの名無しさん
11/04/14 21:36:35.72
shutdownマナーはFAQです。よく読んでください。

247:デフォルトの名無しさん
11/04/14 21:43:05.47
>>244
lseek を実装して、現在あるバッファを読み飛ばす(捨てる)だけは可
にすればいいんだがまぁ、対称性に著しく書けるインターフェースだわな


248:196
11/04/14 21:52:01.14
ソケットでのプロセス間通信について質問です。
AとBのプログラムで通信する場合ですが、こういう認識で合ってますか?

 プログラムA    プログラムB
   ↑         ↑    ユーザランド
-----|-----------------|---------
 プログラムAの   プログラムBの
  ソケット←ーーーー→ソケット  カーネル

249:デフォルトの名無しさん
11/04/14 21:52:44.84

名前の196は関係ないです。
すいません。

250:デフォルトの名無しさん
11/04/14 22:10:21.58
>>248
ええ。
まあ環境によるんですけど。

251:デフォルトの名無しさん
11/04/14 22:13:46.39
>>250
例外もあるんですか?

252:デフォルトの名無しさん
11/04/14 22:27:29.18
プロトコルスタックがカーネルにある必要は無いし、
逆に、インカーネルなhttpdとかありうるし。

253:デフォルトの名無しさん
11/04/14 22:52:12.25
NFSサーバとかカーネル内にある。

254:デフォルトの名無しさん
11/04/15 00:08:01.48
インターフェースがupされた直後に
いくつかのソケットでconnectし始めるプログラムを実行すると
一番最初のconnectはつながるまで約3秒かかるのに
ほぼ同時ながら別のスレッドでconnect呼ぶところではほぼ即座につながる
ってことが起こるんですが、何が原因でしょう?
あと、一発のconnectの待ちを短くしてやるにはどうすればいいでしょう?

255:デフォルトの名無しさん
11/04/15 00:13:37.91
DHCPとかDNS引いてるんじゃない?

256:デフォルトの名無しさん
11/04/15 00:18:31.32
ああすいません
インターフェースは固定IPでupさせてます
あと、接続もIPアドレス直です
1回目のconnectと2回目のconnectは同一ホストへの接続で
ポート番号が1個違うだけなのに2回目の方が先につながるのが納得いかない。。

257:デフォルトの名無しさん
11/04/15 00:27:05.93
ARPが必要だけど、そんな時間かからない。
OSは何?

258:デフォルトの名無しさん
11/04/15 00:31:52.32
linuxです
ひょっとしてarpテーブル見に行って該当無かったら
arp投げて3秒後synリトライしているとか?

259:デフォルトの名無しさん
11/04/15 00:35:34.94
ARP終わらなければパケット投げられません。
リトライになるはずないです。
ルーティング設定も手動ですか?
DNSの逆引きが行われてませんか?

260:デフォルトの名無しさん
11/04/15 00:36:19.85
ethersharkでパケットダンプすれば?

261:デフォルトの名無しさん
11/04/15 02:23:27.15
>>260
ちょ、まじってる

262:デフォルトの名無しさん
11/04/15 14:06:04.59
>>253
マジ?

263:デフォルトの名無しさん
11/04/15 15:40:07.26
>>262
常識

264:デフォルトの名無しさん
11/04/15 16:46:17.40
>>263
いや、今でも使ってる人いるの?

265:デフォルトの名無しさん
11/04/15 16:50:47.51
>>264 うちでは、普通に使ってるが


266:デフォルトの名無しさん
11/04/15 19:03:36.63
>>259
ルーティング設定も手動、DNSの逆引きは行われていないと思います。

>>260
wiresharkが使えればよいのですが
組み込み系かつWiFi直結間での通信なので・・・

とりあえずノンブロッキングで
connect→close→connect
ってすると即座につながったのでこれで良し?

267:デフォルトの名無しさん
11/04/15 19:15:37.64
Peerも組み込み?
PeerをPCにしてperrでwireshark動かせば?

268:デフォルトの名無しさん
11/04/15 19:30:43.86
>>264
たとえばWindowsのIISのHTTPサーバーはカーネルで動作するように実装されてた。
パフォーマンス優先で設計すると、そうなる。

269:デフォルトの名無しさん
11/04/15 19:43:28.92
されてたってまたユーザモードに戻されたの?
カーネルモードに移動したのがServer 2003あたりの比較的最近だった気がするけど

ちなみにLinuxにもカーネルモードのhttpdがある

270:デフォルトの名無しさん
11/04/18 12:02:15.56
NFSもカーネルモードのがあったな

271:デフォルトの名無しさん
11/04/18 12:06:45.71
あったなじゃなくて、元祖のSUNの実装がインカーネルなんだよ。
坊やならしょうがないけど、人前でそういう発言しな方が良いぞ。w

272:デフォルトの名無しさん
11/04/18 13:56:48.22
>>271
システムコール呼んだら2度と帰ってこないって、あれだっけ?
まぁ、当時はカーネルスレッドなんかなかったからなぁ


273:デフォルトの名無しさん
11/04/18 15:36:01.74
>>271
元祖の話とかしてどうするの? 懐かしむの?

274:デフォルトの名無しさん
11/04/18 16:29:33.47
NFS-3GもFUSEからカーネルに取り込まれたよ。

275:デフォルトの名無しさん
11/04/18 17:03:04.79
>>273
しょうがないよ。坊やが生まれる前からある技術だから。

276:デフォルトの名無しさん
11/04/18 18:05:41.66
今はもう使われてないしなぁ

277:デフォルトの名無しさん
11/04/27 10:01:35.90
おじいちゃんは昔話好きだからな。
今頃バブルの話とか太古のアイドルの話しても分からないってw

nfsに限らずファイル周り呼んだら帰って来なく成るって多いorz

無線だと無線の物理層のリンクもいろいろごにょごにょしてそう。
ipで下位レイヤを気にせず使える分、いろんな状況を想定する事が求められる。

被災地の観測機器にパケット飛ばしたら、無線基地局が流されて消失してたとかね。

278:デフォルトの名無しさん
11/04/27 10:55:57.72
都会ね。

279:デフォルトの名無しさん
11/04/27 17:18:18.60
ちょっとお尋ねします。

サーバからデータをpush送信したいと思いってます。

ちょっと調べた範囲では余りよく分かりませんでした。特にプログラミング言語で当該機能を実装するような具体的な例を見つけることができませんでした。

何かヒントとか、または、ここを
見れば分かりやすいよ、とかありましたら、よろしく願いします。

なお、サーバはwindowsでクライアントはandroidです。


280:デフォルトの名無しさん
11/04/27 19:39:28.10
.NET framework4.0とC#で非同期TCPでソケット通信してバイナリデータの
送受信クライアントアプリ作ってみたいな~
なんて思ってる人生の初心者です。
invokeとかBeginInvokeとかEndInvokeとかIAsyncResultとかもうちんぷんかんぷんです。
基礎からじっくりと使い方の学習してみたいのですが、お勧めは何かありますでしょうか?

コードの断片だけじゃてんで頭にはいんないし、書籍は○○層があってだなとかフレームの中身の話とか
で、言葉の定義で実際にはソケットよりもNIC担当の処理内容に紙面を費やしてたりと
意欲だけ空回りで、てんで前進してる気配がないので、お助けください。

281:デフォルトの名無しさん
11/04/27 19:42:56.80
> invokeとかBeginInvokeとかEndInvokeとかIAsyncResultとか

それはネットワークとは関係のないC#自体の話ではありませんか
ネットワークの話とは分けて勉強した方がいいと思いますが

282:デフォルトの名無しさん
11/04/27 20:02:26.51
確かにそうかも。
送信した後に非同期で受信した側の処理を身に付けたいんですけど
ソケットの使い方じゃなくて、非同期の勉強でつまづいてるってところが大きいですね。
非同期だとF10押していってもデバッグ出来ないですよね?別スレに行ってしまって。
どう試行錯誤していいのか、先ずそんなところから錯誤してますです。

283:デフォルトの名無しさん
11/04/27 23:33:33.79
>>280
ぐぐれば非同期の作り方の例が出てくるよ。
でもスレッド作って同期でしたほうが分かりやすいし作りやすいと思う。

C#内容についてはこちらで
スレリンク(tech板)

284:デフォルトの名無しさん
11/05/02 16:12:32.87
winsockでプロセスが生成しているソケットを
列挙するようなI/Fがありますでしょうか?

285:デフォルトの名無しさん
11/05/02 21:03:46.47
ない。

286:デフォルトの名無しさん
11/05/03 03:56:32.35
>>284
WinSockには無い。
IP Helper APIを使う。

287:デフォルトの名無しさん
11/05/05 04:39:15.21
ご存知の方いらっしゃれば助言頂ければ幸いです。

NAT越え関係のプログラミングを作らないといけないのですが
何をどうすればよいのやらで、行き着いたのが
uPnPでのポートマッピングに行き着きました。

諸所の本、サイト等は見て回ったのですが、
「マルチキャストでM-SEARCH」の一点張り
マルチキャスト(UDP)で送信しても受信側がどうしてもできない?
※sendtoでの戻り値状は送れていると思うのですが。
といった所で、このGWをほぼ潰す結果になりました(´・ω・`)

何か コレみれば(・∀・)イイ!! といった物はありませんでしょうか?

288:287
11/05/05 05:03:06.46
補足:環境は、Win32のVC++です。

289:デフォルトの名無しさん
11/05/05 09:27:46.55
>>287
Microsoft Windows SDKのサンプル。 google依存症だな。

290:デフォルトの名無しさん
11/05/05 12:28:27.64
無理(無駄)なことをしてるだけのような

291:デフォルトの名無しさん
11/05/06 15:42:33.43
使ってるルータがちゃんと対応してるかどうか調べたほうがいいよ。
それからどうでもいいことだけどUは大文字。Universal Plug a'n'd Play


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch