受け取ったUDPパケットのデスティネーションアドレスを知る方法
recvfrom()には若干欠点があって、peerのアドレスは分かってもローカル側のアドレスが分からない。複数のアドレスが付いているマシンで、どのアドレスのどのポート宛てに来たのかを知りたいっていう需要は無くもないはずなのだが。
2011-06-30 19:20:46それを知りたい場合には、一つのソケットにINADDR_ANYでbind()するんじゃなくて、アドレスの数だけソケットを作ってひとつずつbind()するという方法はある。
2011-06-30 19:23:36@AoiMoe @takawata さんが書いてるけど、IP_RECVDSTADDRつうのが。ただしLinuxだと代わりにIP_PKTINFOを使うらしい。Solarisは昔はIP_RECVDSTADDRだけだったんだけど、今はIP_PKTINFOもあるみたい。
2011-06-30 20:02:56とはいうものの、自分のプログラムでは、複数のソケット使ってます>UDP受信の宛先アドレス/UDP送信アドレス問題。どうせaccept(2)との両面待ちでselectしてるとこなので問題ないせいもあるけど。
2011-06-30 20:32:15@n_soda @AoiMoe @takawata IPv6に関してはRFC3542でAPIがまとめられてるんですが、IPv4はOS依存でバラバラなのです。IPv4もv6にならって送受信時ともにIP_PKTINFOで統一すべきですよね…
2011-06-30 20:17:10@n_soda @AoiMoe @takawata あぁ、正確には、受信時はIP_RECVDSTADDR、送信時はIP_PKTINFO、です。
2011-06-30 20:19:26@n_soda @AoiMoe @takawata だあああああああ、間違った。。受信時はIP_RECVPKTINFO、送信時はIP_PKTINFO、です…。死んできます。
2011-06-30 20:22:06@AoiMoe @n_soda @takawata19 recvpair(2) はないですが recvfromto(3) なら http://www.google.com/codesearch#search&q=recvfromto
2011-06-30 20:33:43オレオレ実装ですがsendfromto(3), recvfromto(3)。http://www.nerv.org/~ryo/files/netbsd/sendfromto/sockfromto.c
2011-06-30 20:34:46@AoiMoe ぐぐってみると、WinXP以降はあるみたい(IP_PKTINFO): http://t.co/UjK9RVF
2011-06-30 20:22:29(複数socketを使ってbindする手法の問題点)
@AoiMoe @n_soda @takawata19 一つ忘れてましたが、宛先アドレス毎にsocket作って多面待ちでacceptする方法だと、アドレス付け替えられた時に動かなくなるので真面目にやるとbindやntpのようにルーティングソケット監視する必要があるんですよね。
2011-07-01 15:15:01@rsh @AoiMoe @takawata19 ウウム、それは面倒ですね。NetBSDでも動かそうとすると、受信はIP_RECVDSTADDRして、送信時はまだbindしてなければbnidする方が簡単?
2011-07-01 15:30:53@n_soda @AoiMoe @takawata19 その方法だと、送ろうとするsocketでbindした瞬間に相手からパケットが来たら、そのsocketで受信しちゃう問題があるのです ;-)
2011-07-01 15:33:38@rsh @AoiMoe @takawata19 ガビーン。ルーティングソケット監視めどいです。そのソケットで受信してもちゃんと動くようにしておけばいいのかしら。アドレスが変わる前提だと、bindしたソケットを捨てるタイミングが悩ましいなあ。毎回捨てるのも勿体ない気が…
2011-07-01 15:40:56@n_soda @AoiMoe @takawata19 受信してcloseするまでをatomicにできない以上どうしようもない気が。ルーティングメッセージ監視するか、NetBSDにもIP_PKTINFOを導入しましょう!!
2011-07-01 15:43:40@rsh @AoiMoe @takawata19 non-block readして何もなければclose、raceはあるけど、それは再送で対処してもらう…で、実用上はまあOKな気が。駄目かな?気合があればルーティング監視の方が勿論いいですね。IP_PKTINFO導入は賛成です。
2011-07-01 15:55:55