none
UWP에서 예외 발생 'System.Runtime.InteropServices.COMException'(mscorlib.ni.dll) 해결방법 RRS feed

  • 질문

  • 예외 발생: 'System.Runtime.InteropServices.COMException'(mscorlib.ni.dll)
    WinRT 정보: Only one usage of each socket address (protocol/network address/port) is normally permitted.

    예외 발생: 'System.Runtime.InteropServices.COMException'(mscorlib.ni.dll)
    WinRT 정보: An existing connection was forcibly closed by the remote host.

    현재 ThreadPool을 사용해서 echo_server()를 실행 신호에 따른 GPIO를 제어하고 있습니다.

    ThreadPoolTimer로 echo_client()가 1초마다 한번씩 특정 디바이스에 신호를 보내고 있는데요

    작동은 되고 있습니다. 주기적으로 1초마다 신호를 보내고 있고 echo_server에서도 받는 신호에 따라서 특정 GPIO를 제어는 하고 있습니다.
    근데 예외사항 관련 호출 문제 메세지가 뜨고 있습니다. 현재 에러가 뜨고 있는 부분은 체크해 보았습니다.


    ####으로 표시해놓은 두 곳
    여기와 await socketListener.BindServiceNameAsync("15530");

    여기에 await socket.ConnectAsync(serverHost, serverPort);

    System.DirectoryServices.DirectoryServicesComException이 발생합니다.

    각 소켓 서버 프로토콜 주소 포트는 하나만 쓸 수 있다 라는 이야기인데 일단 서버와 클라이언트 포트는 바꿔보았지만 포트를 바꾸는게 문제가 아닌지 해결은 되지 않았습니다.

    쓰레드 사용을 잘못하고 있기 때문인가요? 익셉션을 어떻게 처리해야 할까요?

    그리고 또 한가지 1초마다 수신을 하도록 만들어 놨는데 10초마다 한번 정도는 초가 어긋나는데요 이 경우는 그냥 시스템의 문제인가요?

    public sealed partial class MainPage : Page
        {
            public MainPage()
            {
                this.InitializeComponent();
                InitGPIO();
                IAsyncAction threadPoolWorkItem = Windows.System.Threading.ThreadPool.RunAsync((source) =>
                {
                    //Perform the thread pool work item activity.
                    while (true)
                    {
                        //When WorkItem.Cancel is called, work items that have not started are canceled.
                        //if a work item is already running, it will run to completion uniess it supports cancellation.
                        //To support cancellatin, the work item should check IAsyncAction.Status for cancellation status
                        //and exit cleanly if it has been canceled.
                        if (source.Status == AsyncStatus.Canceled)
                        {
                            break;
                        }

                        echo_server();

                    }
                }, WorkItemPriority.Normal);
                //echo_server();
                //echo_client();
                //DispatcherTimerSetup();

                TimeSpan period = TimeSpan.FromSeconds(1);

                ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer(async (source) =>
                {
                    await

                                    //TODO: Work
                                    
                                    //Update the UI thread by using the UI core dispatcher.

                                    Dispatcher.RunAsync(CoreDispatcherPriority.High,
                                        () =>
                                        {
                                            echo_client();

                                        //UI components can be accessed within this scope.


                                    });

                }, period);
            }
            
           
            private GpioPin pin = null;   //LED가 연결된 핀을 전역으로 제어하기 위해 메서드 밖에서 선언합니다.

            //우리가 사용할 GPIO를 초기화하는 메서드입니다.
            private void InitGPIO()

            {
                // 시스템의 기본 Gpio 컨트롤러를 가져옵니다.

                var gpio = GpioController.GetDefault();
                if (gpio == null) // 에러 처리 - null이면 GPIO를 사용할 수 없는 장치입니다.
                {
                    pin = null;
                    this.textBlock.Text = "There is no GPIO controller on this device.";
                    return;
                }
                pin = gpio.OpenPin(18);  //LED가 연결된 GPIO 18번 핀을 오픈합니다.

                //pin 객체는 InitGPIO() 메서드 바로 위에 전역으로 선언해 놨습니다.

                if (pin == null) //에러처리 - null이면 해당 핀 번호를 사용할 수 없습니다.
                {
                    this.textBlock.Text = "There were problems initializing the GPIO pin.";
                    return;
                }
                //LED 불을 끕니다.
                pin.Write(GpioPinValue.Low);
                //LED가 연결된 핀을 출력 모드로 설정합니다.
                pin.SetDriveMode(GpioPinDriveMode.Output);

                //텍스트 박스에 GPIO 사용이 완료되었다고 표기합니다.

                this.textBlock.Text = "GPIO pin initialized correctly.";
            }
           
            private async void echo_server()
            {
                
                try
                {
                    //TCP 접속을 대기 시작하는 StreamSocketlistener를 만든다.
                    Windows.Networking.Sockets.StreamSocketListener socketListener = new Windows.Networking.Sockets.StreamSocketListener();
                    //연결이 수신 될 때 호출하는 이벤트 핸들러를 연결
                    socketListener.ConnectionReceived += SocketListener_ConnectionReceived;

                    // String a = socketListener.BindEndpointAsync(HostName localhost, String local);
                    //지정된 포트에 들어오는 TCP 접속을 대기 시작. 당신은 현재 사용하는 모든 포트를 지정할 수 있다.
                    

                   ####여기 에러입니다. await socketListener.BindServiceNameAsync("15530");

                }
                catch (Exception e)
                {
                    //Handle exception.

                }

            }
            private async void SocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender,
        Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args)
            {
                //원격 클라이언트에서 읽어오기
                string a = args.Socket.Information.RemoteAddress.DisplayName.ToString();
                Stream inStream = args.Socket.InputStream.AsStreamForRead();
                StreamReader reader = new StreamReader(inStream);
                string request = await reader.ReadLineAsync();
                this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    textBox1.Text = a + " " + DateTime.Now.ToString("HH:mm:ss") + "\n";

                    textBlock_Copy.Text = request;

                    if (request.Equals("b"))
                    {
                        textBlock2_Copy.Text = "켜짐";
                    }
                    else
                    {
                        textBlock2_Copy.Text = "꺼짐";
                    }
                    //MessageDialog msgdlg = new MessageDialog("Choose a color", "How To Async #1");
                    //msgdlg.Commands.Add(new UICommand("Red", null, Colors.Red));
                }).AsTask().Wait();
                if (request.Equals("b"))
                {
                    pin.Write(GpioPinValue.High);
                }
                else
                {
                    pin.Write(GpioPinValue.Low);
                }

                //Send the line back to the remote client.
                Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
                StreamWriter writer = new StreamWriter(outStream);
                await writer.WriteLineAsync(request);
                await writer.FlushAsync();
            }

            private async void echo_client()
            {
                try
                {
                    //Create the StreamSocket and establish a connection to the echo server.
                    Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
                    
                    //The server hostname that we will be establishing a connection to. We will be running the server and client locally,
                    //so we will use localhost as the hostname.
                    Windows.Networking.HostName serverHost = new Windows.Networking.HostName("192.168.10.142");

                    //Every protocol typically has a standard port number. For example HTTP is typically 80, FTP is 20 and 21, etc.
                    //For the echo server/client application we will use a random port 1337.
                    string serverPort = "16530";
                    
                    ####여기 에러 입니다. await socket.ConnectAsync(serverHost, serverPort);

                    //Write data to the echo server.
                    Stream streamOut = socket.OutputStream.AsStreamForWrite();
                    StreamWriter writer = new StreamWriter(streamOut);
                    string request = DateTime.Now.ToString("HH:mm:ss");
                    await writer.WriteLineAsync(request);
                    await writer.FlushAsync();

                    //Read data from the echo server.
                    Stream streamIn = socket.InputStream.AsStreamForRead();
                    StreamReader reader = new StreamReader(streamIn);
                    string response = await reader.ReadLineAsync();
                }
                catch (Exception e)
                {
                    //Handle exception here.           
                }
            }
            private void button_Click(object sender, RoutedEventArgs e)
            {
                echo_client();
            }
         }
    2015년 12월 24일 목요일 오전 5:25