0

私は Windows 7 で Qt5 を使用しています。
私のアプリケーション ( TCP サーバー) では、現在 QTcpSocket クラスのいくつかのメソッドを使用し
QAbstractSocket::peerAddress()ます
-ピア ポートQAbstractSocket::peerPort()を取得するため。

通信相手のMAC アドレスも取得したいと思います。
これは、カスタム プロトコルを使用せずに (つまり、アプリとピアの間でカスタム メッセージを交換する必要なく) 可能ですか? はいの場合、どのように?

レイト編集:数か月前に実装した非常に優れたソリューションがあります。その間にテストしましたが、100% 完璧に動作します。楽しみ :)

4

3 に答える 3

1

一般に、いいえ、これは不可能です。通信相手が MAC アドレスを持っていない可能性があるためです (たとえば、イーサネットに基づいていないネットワーク ハードウェアを使用している場合)。特に、MAC アドレスに関する情報は、IP、TCP、または UDP 層によって伝達されません。これらの層は、代わりに IP アドレスを使用します。そのため、ピアの MAC アドレスを知りたい場合は、アプリケーション レベルで、ピアのプログラムから MAC アドレスを送信する必要があります。

(上記の小さな例外: IPv6 経由で通信し、自己割り当てのリンクローカル IPv6 アドレス (fe80::blah など) を使用している場合、自己割り当ての IPv6 アドレスからコンピューターの MAC アドレスを導出することが可能です。自己割り当ての IPv6 アドレスは通常、MAC アドレスから派生し、IPv6 アドレスのサブセットとして MAC アドレスを含みます [リンクローカル アドレスは、両方のマシンが同じ場所にある場合にのみ役立つため、これはインターネット経由では機能しないことに注意してください。同じ LAN])

リモート ピアがプログラムのホストと同じ LAN 上にある (そして LAN がイーサネット LAN である) 場合、プログラムは Windows 固有の API を使用して、マシンの ARP テーブルで IPAddress<->MACAddress マッピングを検索している可能性があります。リモート ピアがインターネット上の別の場所にある場合、それがどのように行われるのかわかりません。

于 2016-02-07T00:42:05.427 に答える