- 題名: C#でwinsock
- 日時: 2009/06/23 11:40:45
- ID: 24802
- この記事の返信元:
- (なし)
- この記事への返信:
- [24803] Re[1]: C#でwinsock2009/06/23 12:52:15
- ツリーを表示
■No24805に返信(みさんの記事)
> これで実行してもWinSock 2.0と返ります。
バージョン確認に使うのは szDescription ではなく、wVersion の方だと思います。
今回の「36」を含め、バージョン指定を幾つか変更してみました。
WSAData data = new WSAData();
foreach (short ver in new short[] { 36, 0x0, 0x1, 0x2, 0x100, 0x101, 0x102, 0x200, 0x201, 0x202 })
{
Console.Write("reqVer={0,3:d}.{1:d3}(0x{2:x4}): ", ver & 0xff, ver >> 8, ver);
int ret = WSAStartup(ver, out data);
if (ret == SUCCESS)
{
Console.WriteLine("ver=0x{0:x4}, highVer=0x{1:x4}, [{2}]",
data.wVersion, data.wHighVersion, data.szDescription);
WSACleanup();
}
else
{
Console.WriteLine("Error 0x{1:x8}", ver, ret);
}
}
Console.ReadLine();
当方での実行結果は下記の通り。なお、ws2_32.dll ファイルのバージョンは 5.1.2600.5512 です。
reqVer= 36.000(0x0024): ver=0x0202, highVer=0x0202, [WinSock 2.0]
reqVer= 0.000(0x0000): Error 0x0000276c
reqVer= 1.000(0x0001): ver=0x0001, highVer=0x0202, [WinSock 2.0]
reqVer= 2.000(0x0002): ver=0x0002, highVer=0x0202, [WinSock 2.0]
reqVer= 0.001(0x0100): Error 0x0000276c
reqVer= 1.001(0x0101): ver=0x0101, highVer=0x0202, [WinSock 2.0]
reqVer= 2.001(0x0102): ver=0x0102, highVer=0x0202, [WinSock 2.0]
reqVer= 0.002(0x0200): Error 0x0000276c
reqVer= 1.002(0x0201): ver=0x0101, highVer=0x0202, [WinSock 2.0]
reqVer= 2.002(0x0202): ver=0x0202, highVer=0x0202, [WinSock 2.0]
これを見ると、WSAStartup(36, out data) を指定した場合というのは、
「ver 36.0 を要求したが、2.2 しか返されなかった」
という状況に相当しますので、本来はアプリ側でサポート外として扱うべきかと思います。
一方、WSAStartup(0x202, out data) として指定した場合には、wVersion も
0x202 となりますので、アプリが想定されるバージョンが使用可能ということを意味し、
そのまま処理を続行させる事ができます。
分類:[.NET]
お世話になっております。
C#にてリモートIPアドレス取得するため以下のコードでテストコードを
作成しましたがWSAStartupでAccessViolationException例外が発生していまいます。
すいませんがご教授をお願いします。
namespace ws2_32
{
public partial class Form1 : Form
{
[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();
public const int SUCCESS = 0;
public const int HIGH_VERSION = 2;
public const int LOW_VERSION = 2;
public const Int16 WORD_VERSION = 36;
public const int MAX_WSA_DESCRIPTION = 256;
public const int MAX_WSA_SYS_STATUS = 128;
public struct WSAData
{
public Int16 wVersion;
public Int16 wHighVersion;
public String szDescription;
public String szSystemStatus;
public Int16 iMaxSockets;
public Int16 iMaxUdpDg;
public IntPtr lpVendorInfo;
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
WSAData data = new WSAData();
int result = 0;
data.wHighVersion = HIGH_VERSION;
data.wVersion = LOW_VERSION;
result = WSAStartup(WORD_VERSION, ref data);
if (result == SUCCESS)
{
Console.WriteLine("szDescription:" + data.szDescription);
WSACleanup();
}
Console.ReadLine();
}
}
}