- 題名: 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();
}
}
}