トップ回答者
イーサネットフレームでの送受信

質問
-
お世話になります。
Visal Studio2010にてアプリケーション開発を行っております。
現在、以下のようなコードでイーサネットフレームのデータ送信を行おうとしているのですが、
このコードでは_socket.Sendの部分でエラーコード 10057のSocketExceptionが発生しております。
---------------------------------------
// ソケット設定
_socket = new Socket(AddressFamily.Unspecified, SocketType.Raw, ProtocolType.Raw);
// NICの選択
_socket.Bind(new IPEndPoint(ipAddr, 60));
// データ送信
_socket.Send(networkScanData);
// ソケットの終了
_socket.Close();
---------------------------------------------通常のソケットであれば、Connectといった処理が入るのは分かるのですが
それを無視した形で送受信というのは行えないものなのでしょうか?
送信したいデータというのが、ある通信規格のデータとなっており、
特定のMACアドレス宛にデータを送信することで機器が応答を返すといったものになっております。
質問の仕方など、不適切な部分などあるかと思いますがご教授お願いいたします。
また、不足している部分などもございましたらご指摘お願いいたします。
回答
-
挙げられましたURLではsocket()関数を
socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
のように呼び出していますが、Winsock(のヘッダーファイル)にはそもそもPF_PACKETが存在しません。前回も挙げましたがTCP/IP Raw Socketsの制限に引っかかっているかなと思います。SOでWinPcapを使ってみては、というやり取りを見つけました。
- 回答としてマーク Setsuka 2015年1月15日 10:24
すべての返信
-
基にされているC言語(たぶんUNIX系?)でのソースがあればそれも併せていただけたらと思います。
10057はWSAENOTCONNでconnect()していないから当然といえば当然ですが、C言語ではconnect()せずにsend()に成功しているのでしょうか? ともあれ、socket()、bind()、send()等にどのような引数を与えることを期待しているかが明確になれば、C#での記述も明確になります。
-
挙げられましたURLではsocket()関数を
socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
のように呼び出していますが、Winsock(のヘッダーファイル)にはそもそもPF_PACKETが存在しません。前回も挙げましたがTCP/IP Raw Socketsの制限に引っかかっているかなと思います。SOでWinPcapを使ってみては、というやり取りを見つけました。
- 回答としてマーク Setsuka 2015年1月15日 10:24