DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C# winsock gethostname 文字化け

環境/言語:[http://]
分類:[.NET]

お世話になります。
またすいません ご教授をお願いします。
ホスト名の取得で化けてしまいます。
C言語バージョンでは「EPSON・・・」と表示されます。




[DllImport("ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern Int32 WSAStartup(Int16 wVersionRequested, ref WSAData wsaData);

[DllImport("Ws2_32.DLL", CharSet = CharSet.Auto,SetLastError = true)]
private extern static Int32 WSACleanup();

[DllImport("Ws2_32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
private extern static Int32 gethostname(StringBuilder name, int length);


[DllImport("Ws2_32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
private extern static Int32 gethostbyname( StringBuilder szHost);

public const int SUCCESS = 0;
public const int HIGH_VERSION = 2;
public const int LOW_VERSION = 2;
public const Int16 WORD_VERSION = 0x202;

public const int MAX_WSA_DESCRIPTION = 256;
public const int MAX_WSA_SYS_STATUS = 128;

//Winsock構造体
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
public struct WSAData
{
public Int16 wVersion;
public Int16 wHighVersion;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_WSA_DESCRIPTION + 1)]
public String szDescription;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_WSA_SYS_STATUS + 1)]
public String szSystemStatus;

public UInt16 iMaxSockets;
public UInt16 iMaxUdpDg;
public IntPtr lpVendorInfo;
}

private void button1_Click(object sender, EventArgs e)
{

WSAData data = new WSAData();
int result = 0;

//winsockへバージョンを指定
data.wHighVersion = HIGH_VERSION;
data.wVersion = LOW_VERSION;

//winsockの初期化
result = WSAStartup(0x202, ref data);

if (result == SUCCESS)
{
//ホスト名の取得
StringBuilder hostname = new StringBuilder();
hostname.Length = 0;

if (gethostname(hostname, 0x100) != 0)
{
Console.WriteLine("** error ** gethostname");
WSACleanup();
return;
}
Console.WriteLine("ホスト名:" + hostname);
WSACleanup();
}

}
2009/06/24(Wed) 17:19:11 編集(投稿者)

http://msdn.microsoft.com/en-us/library/ms738527(VS.85).aspx
第一引数は char* です。TCHAR* じゃありません。
> [DllImport("Ws2_32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
> private extern static Int32 gethostname(StringBuilder name, int length);
CharSet.Auto では NT 系 OS の場合 StringBuilder を Unicode のバイト列としてマーシャリングするため、char* を正しく文字列に変換できません。

// なんで System.Net.Sockes.Socket とか System.Net.Dns とか使わないんだろう?
Hongliangさん 返信ありがとうございます。


>>[DllImport("Ws2_32.DLL", CharSet = CharSet.Auto, SetLastError = true)]
>>private extern static Int32 gethostname(StringBuilder name, int length);
> CharSet.Auto では NT 系 OS の場合 StringBuilder を Unicode のバイト列としてマーシャリングするため、char* を正しく文字列に変換できません。

System.Text.Encoding.GetEncodingを使用して変換もできませんか?

>
> // なんで System.Net.Sockes.Socket とか System.Net.Dns とか使わないんだろう?
サーバーを介して取得するんですが使用できるのでしょうか
お世話になります
DLLの宣言を修正したらサーバー名が取得できました。

[DllImport("ws2_32.dll", SetLastError = true)]
private static extern int gethostname(StringBuilder name, int length);

解決???
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板