掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
[VB.NET]VistaでSetSocketOptionを使用するとInvalid argumentが発生します (ID:100780)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
自己解決しましたので、方法を記しておきます。もし興味のある方がいましたら、参考にしていただけると幸いです。なにぶん素人ですので、誤りもあるかもしれませんがご勘弁を。 『他アプリケーションにBindされているLocal Endpointから、UDPパケットを飛ばす』ことが目的なのですが、SocketOptionName.ReuseAddress や SocketOptionName.HeaderIncluded は、Windows Vistaでは正常に動作しないようです。 そこで、SocketType.rawを使うことで問題を解決しました。 まずは、基礎知識を。 <UDPパケットの構造> UDPパケットは、大まかに 送受信側MACアドレス + IPヘッダ + UDPヘッダ + データ部 という構造をしています。(各ヘッダの構造については、Googleで調べれば簡単に出てきます) UDPパケットのポートのデータは、UDPヘッダ内に格納されています。 <ソース> --------------------------------- 'ソケットを定義します。 Dim soc As New Sockets.Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Udp) '送信先へ接続 soc.Connect(New IPEndPoint(New IPAddress(RemoteHost), RemotePort)) 'データを送信します soc.Send(data, data.Length, SocketFlags.None) 'ソケットの開放 soc.Shutdown(SocketShutdown.Both) soc.Close() --------------------------------- <解説> ソースは、以上のとても簡素なものです。ですが、定義してあるソケットが通常の SocketType.Dgram, ProtocolType.Udp ではなく、 SocketType.raw, ProtocolType.Udp ですから、Socketが作成してくれるパケットのヘッダは、 [送受信側MACアドレス + IPヘッダ] のみです。ですから、送信するdata(Byteの一次配列) に、あらかじめ自分で作ったUDPヘッダを含める必要があります。その部分のソースは割愛しますが、調べれば容易に書けることでしょう。Checksumの計算がやや煩雑ではありますが。 以上です。板汚し失礼しました。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.