我正在尝试用C#读取网络上的设备,基本上它们出现在文件浏览器的“网络”标签中。
我能找到的唯一方法是:https://www.codeproject.com/Articles/16113/Retreiving-a-list-of-network-computer-names-using使用NetServerEnum()
无论我在谷歌搜索多么努力,一切都最终会回到那个链接。但它根本不起作用!我正在使用此代码:
static class Network {
[DllImport("Netapi32")]
static extern int NetServerEnum(string ServerNane, int dwLevel, ref IntPtr pBuf, int dwPrefMaxLen,
out int dwEntriesRead, out int dwTotalEntries, int dwServerType, string domain, out int dwResumeHandle);
[DllImport("Netapi32")]
static extern int NetApiBufferFree(IntPtr pBuf);
[StructLayout(LayoutKind.Sequential)]
struct SERVER_INFO_100 {
internal int id;
[MarshalAs(UnmanagedType.LPWStr)]
internal string name;
}
static int SV_TYPE_WORKSTATION = 1, SV_TYPE_SERVER = 2;
static int SSIZE = Marshal.SizeOf(typeof(SERVER_INFO_100));
public static ArrayList GetNetwork() {
ArrayList net = new ArrayList();
IntPtr buffer = IntPtr.Zero, tmpBuffer = IntPtr.Zero;
int read = 0, total = 0, handle = 0;
try {
int ret = NetServerEnum(null, 100, ref buffer, -1, out read, out total, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out handle);
if(ret != 0) Console.WriteLine("Error Code "+ret+": "+new Win32Exception(ret).Message);
Console.WriteLine(read+" of "+total);
if(ret == 0) {
for(int i=0; i<total; i++) {
tmpBuffer = new IntPtr((long)buffer + (i*SSIZE));
SERVER_INFO_100 inf = (SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(SERVER_INFO_100));
net.Add(inf.name);
}
}
NetApiBufferFree(buffer);
} catch(Exception ex) {
MessageBox.Show("Problem with acessing network computers in NetworkBrowser"
+"\r\n\r\n\r\n"+ex.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
return null;
}
return net;
}
}
我得到的错误代码是:
Error Code 1231: The network location cannot be reached. For information about network troubleshooting, see Windows Help
什么?我甚至没有尝试到达网络位置!此错误代码未在MSDN上的可能错误代码中列出。我做错了什么?
为什么使用已经内置于操作系统的Windows网络发现的基本功能如此困难,在一个名为.NET的API中?