본문 바로가기
[ Program ]/C#

네트워크 연결확인방법

by 관이119 2022. 3. 20.

<<< UI >>>

 

 

<<< Source >>>

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp13
{
    public partial class connectcheck : Form
    {

        public connectcheck()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ip = textBox1.Text.Trim();
            string id = textBox2.Text.Trim();
            string pw = textBox3.Text.Trim();

            ConnectNetworkDrive(ip, id, pw);
        }

        public void ConnectNetworkDrive(string p_ip,string p_id, string p_pw)
        {
            string ip = $@"\\{p_ip}";      //네트워크 드라이브 주소
            string userID = p_id;          // 사용자 계정
            string pwd = p_pw;             // 비밀번호

            //공유폴더 접근 객체 생성
            NetworkConnector netc = new NetworkConnector();

            int n = 0;
            while (true)
            {
                n++;

                int state = netc.TryConnectNetwork(ip, userID, pwd);
                if (state == 0)
                {
                    MessageBox.Show("접속됨(o)");
                    break;
                }

                if(n>50)
                {
                    MessageBox.Show("접속불가(x)");
                    break;
                }
            }
        }
    }

    public class NetworkConnector
    {
        public NETRESOURCE NetResource = new NETRESOURCE();
        [DllImport("mpr.dll", CharSet = CharSet.Auto)]
        public static extern int WNetUseConnection(
                    IntPtr hwndOwner,
                    [MarshalAs(UnmanagedType.Struct)] ref NETRESOURCE lpNetResource,
                    string lpPassword,
                    string lpUserID,
                    uint dwFlags,
                    StringBuilder lpAccessName,
                    ref int lpBufferSize,
                    out uint lpResult);
        [DllImport("mpr.dll", EntryPoint = "WNetCancelConnection2", CharSet = CharSet.Auto)]
        public static extern int WNetCancelConnection2A(String lpName, int dwFlags, int fForce);
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct NETRESOURCE
        {
            public uint dwScope;
            public uint dwType;
            public uint dwDisplayType;
            public uint dwUsage;
            public string lpLocalName;
            public string lpRemoteName;
            public string lpComment;
            public string lpProvider;
        }
        public int TryConnectNetwork(string remotePath, string userID, string pwd)
        {
            int capacity = 1028;
            uint resultFlags = 0;
            uint flags = 0;
            StringBuilder sb = new StringBuilder(capacity);
            NetResource.dwType = 1; // 공유 디스크
            NetResource.lpLocalName = null;   // 로컬 드라이브 지정하지 않음
            NetResource.lpRemoteName = remotePath;
            NetResource.lpProvider = null;
            int result = WNetUseConnection(IntPtr.Zero, ref NetResource, pwd, userID, flags, sb, ref capacity, out resultFlags);
            return result;
        }
        public void DisconnectNetwork()
        {
            WNetCancelConnection2A(NetResource.lpRemoteName, 1, 0);
        }

    }

}

댓글