C#에서 SNMP 메시지 수신을 시각화하여 SNMP 메시지 디코딩

11684 단어 ASN.1BERsnmpudpC#

개요


지난번SNMP의 GetNext 메시지를 C#로 인코딩합니다.
이전 "ASN.1의 Object Identifier를 C#로 인코딩합니다." 이전
SNMP의 GetNext Request 메시지를 인코딩할 수 있습니다.
다음은 수신된 SNMP 메시지를 디코딩 처리하는 방법으로, 그 전에 C#의 UdpClient를 사용하여 SNMP 메시지를 보내고, 수신된 메시지를 16진수 문자열(16진수 문자열)로 표시하는 테스트 프로그램을 만듭니다.

테스트 양식 만들기


아래 설명과 같이 발송 목적지의 주소와 취득한 OID를 입력하고 발송 단추를 누르십시오
마지막으로 만든 SnmpGetNextMessage 클래스에서 SNMP 메시지 인코딩
"메시지 보내기"에서 인코딩된 바이트의 배열을 16진수 문자열로 표시한 후
수신된 SNMP 메시지의 바이트 문자열을 수신 메시지에 16진수 문자열로 표시하는 SNMP 전송
화면 준비해.

UdpClient 인스턴스 작성 및 대기


udpClient 변수를 창 카테고리의 인스턴스 변수로 선언합니다.
private UdpClient udpClient;
양식의 Load 이벤트에서 인스턴스를 생성합니다.
        private void Form1_Load(object sender, EventArgs e)
        {
            udpClient = new UdpClient(0);
            udpClient.BeginReceive(ReceiveCallback, udpClient);

        }
또 반의 머리는 다음과 같은 using이 필요하다.
using System.Net;
using System.Net.Sockets;
UdpClient 구조기를 사용하여 포트 번호를 매개변수로 전달하여 UDP의 Listen을 시작합니다.
포트 번호에 "0"을 지정하여 빈 포트를 자동으로 사용할 수 있습니다.
비동기식 Begin Receive를 사용하여 대기 프로세스를 시작합니다.
UDP 메시지가 수신되면 Receive Callback이 호출됩니다.
수신된 데이터를 일시적으로 중단했다가 Begin Receive를 통해 다시 수신(Listen)을 시작합니다.
받은 메시지를 16진수 문자열로 변환하여 Form의 텍스트 상자에 표시합니다.
        private void ReceiveCallback(IAsyncResult ar)
        {
            UdpClient udp = (UdpClient)ar.AsyncState;

            IPEndPoint remoteHost = null;
            byte[] receiveData;
            try
            {
                receiveData = udp.EndReceive(ar, ref remoteHost);
            }
            catch (SocketException ex)
            {
                ShowReceiveMessage(ex.Message);
                return;
            }
            catch (ObjectDisposedException ex)
            {
                ShowReceiveMessage(ex.Message);
                return;
            }

            ShowReceiveMessage(BitConverter.ToString(receiveData).Replace("-", " "));

            // 非同期受信開始
            udp.BeginReceive(ReceiveCallback, udp);
        }

ShowReceive Message 메서드에는 약간의 장치가 필요합니다.
비동기적으로 호출된 "Receive Callback"에서 창 제어에 직접 액세스할 수 없기 때문입니다.
InvokeRequird를 사용하여 컨트롤에 직접 액세스할 수 있는 스레드에서 부팅되는지 확인합니다.
인보크 리퀘스트가 사실이라면 인보크에 따라 다시 자신을 불러라.
이렇게 하면 창에 접근하는 컨트롤을 비동기적으로 처리할 수 있습니다.

        delegate void ShowReceiveMessageDelegate(String message);

        void ShowReceiveMessage(String message)
        {
            if (InvokeRequired)
            {
                // 別スレッドから呼び出された場合
                Invoke(new ShowReceiveMessageDelegate(ShowReceiveMessage), message);
                return;
            }

            txtReceive.Text = message;

        }

메시지 보내기 처리


보내기 버튼 이벤트에서 SnmpGetNextMessage 클래스를 사용하여 메시지 생성
udpClient 기반 SNMP 메시지를 전송합니다.
SnmpGetNext Message를 사용하여 메시지를 인코딩하고 인코딩된 바이트를 인코딩합니다.
16진수 문자열을 텍스트 상자로 내보냅니다.
        private void btnSendSnmpGetNextRequestMessage_Click(object sender, EventArgs e)
        {
            SnmpGetNextMessage getNextMessage = new SnmpGetNextMessage("public");
            getNextMessage.AddRequestOid(txtOriginal.Text);

            string remoteHost = txtIp.Text;
            int remotePort = 161;

            byte[] sendData = getNextMessage.GetBytes().ToArray();

            txtSendMessage.Text = BitConverter.ToString(sendData).Replace("-"," ");

            udpClient.Send(sendData, sendData.Length, remoteHost, remotePort);

        }

UdpClient의 뒷처리


이번 Form의 FormClossing 행사에서 수습을 실시합니다.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (udpClient != null)
            {
                try
                {
                    udpClient.Close();
                } catch(Exception){
                    // NOP
                }
            }
        }

해볼게요.


Windows10 Pro에서 시도하고 있습니다.

또한 Windows 10Pro를 SNMP 에이전트로 사용하는 방법은 전번"ASN.1의 Object Identifier를 C#로 인코딩합니다."에 설명되어 있습니다.

최후


다음에 받은 SNMP 메시지를 디코딩 처리할 수 있습니다.
또한 여기서 사용하는 UDP 송수신 처리는 SNMP 메시지의 디코딩 처리를 실현하기 위해 디코딩 대상인 SNMP 메시지의 실현을 얻는 데 사용된다.
또 16진수 문자열의 수신 정보를 화면에 표시함으로써 시각화할 수 있다.
네트워크 프로그래밍의 비결은 Visualization, Visualization 또는 Visualization입니다.

좋은 웹페이지 즐겨찾기