P/Invokeを使用してネイティブDLLとやりとりしようとしていますが、構造パラメータin_addr
が必要です。私はそれについて多くの異なる種類の定義を見ていますが、どちらを使うのがベストですか?Cでのin_addrの使用#
また、C#IPAddress
オブジェクトをin_addr
構造体に変換するにはどうすればよいですか?
P/Invokeを使用してネイティブDLLとやりとりしようとしていますが、構造パラメータin_addr
が必要です。私はそれについて多くの異なる種類の定義を見ていますが、どちらを使うのがベストですか?Cでのin_addrの使用#
また、C#IPAddress
オブジェクトをin_addr
構造体に変換するにはどうすればよいですか?
は、匿名の名前をクリーンアップPInvoke Interop Assistant
EDITで生成され、次の
[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct in_addr {
/// Anonymous1
public Anonymous1 S_un;
}
[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)]
public struct Anonymous1 {
/// Anonymous2
[System.Runtime.InteropServices.FieldOffsetAttribute(0)]
public Anonymous2 S_un_b;
/// Anonymous3
[System.Runtime.InteropServices.FieldOffsetAttribute(0)]
public Anonymous3 S_un_w;
/// u_long->unsigned int
[System.Runtime.InteropServices.FieldOffsetAttribute(0)]
public uint S_addr;
}
[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Anonymous2 {
/// u_char->unsigned char
public byte s_b1;
/// u_char->unsigned char
public byte s_b2;
/// u_char->unsigned char
public byte s_b3;
/// u_char->unsigned char
public byte s_b4;
}
[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct Anonymous3 {
/// u_short->unsigned short
public ushort s_w1;
/// u_short->unsigned short
public ushort s_w2;
}
を試してみてください。
誰かが興味がある場合は、ここに完全なコードがあります。 IPAddress
オブジェクトを構造体in_addr
にアンパックして戻すことができます。 JaredPar同様
[StructLayout(LayoutKind.Sequential)]
public struct in_addr {
public Anonymous1 S_un;
[StructLayoutAttribute(LayoutKind.Explicit)]
public struct Anonymous1 {
[FieldOffsetAttribute(0)]
public Anonymous2 S_un_b;
[FieldOffsetAttribute(0)]
public Anonymous3 S_un_w;
[FieldOffsetAttribute(0)]
public uint S_addr;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct Anonymous2 {
public byte s_b1;
public byte s_b2;
public byte s_b3;
public byte s_b4;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct Anonymous3 {
public ushort s_w1;
public ushort s_w2;
}
public in_addr(IPAddress address) : this(address.GetAddressBytes()) { }
public in_addr(byte[] address) {
// Set this first, otherwise it wipes out the other fields
S_un.S_un_w = new Anonymous3();
S_un.S_addr = (uint)BitConverter.ToInt32(address, 0);
S_un.S_un_b.s_b1 = address[0];
S_un.S_un_b.s_b2 = address[1];
S_un.S_un_b.s_b3 = address[2];
S_un.S_un_b.s_b4 = address[3];
}
/// <summary>
/// Unpacks an in_addr struct to an IPAddress object
/// </summary>
/// <returns></returns>
public IPAddress ToIPAddress() {
byte[] bytes = new[] {
S_un.S_un_b.s_b1,
S_un.S_un_b.s_b2,
S_un.S_un_b.s_b3,
S_un.S_un_b.s_b4
};
return new IPAddress(bytes);
}
}
、私はまだAnonymous3で何をするかわかりませんが、それはとにかく設定することができないので、それは本当に問題ではありません。それらはすべて同じFieldOffsetを持つため、1つのフィールドを設定すると他のすべてのフィールドがクリアされます。でも、私はあまり心配していません。
これをIPAddressオブジェクトとの間で変換する方法はありますか? –
@David、組み込み関数はありませんが、コード化するのはあまりにも恐ろしいことではありません。 – JaredPar
私はCの経験があまりありませんでしたので、私にこの権利があるかどうか教えてください。 BitConverterを使ってIPAddressのバイトをInt32に変換し、それをS_addrに割り当てました(それをuintにキャストします)。 Anonymous2の4バイトのフィールド(s_b1-s_b4)には、IPAddressのバイト配列の最初の4バイトがそれぞれ割り当てられます。それは働くだろうか? s_w1とs_w2をどうすればいいですか? –