Microsoft MVP성태의 닷넷 이야기
글쓴 사람
Sungwoo Park (musicbox3 at nate.com)
홈페이지
첨부 파일
 

예외 발생: '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();
        }
     }








[최초 등록일: ]
[최종 수정일: 12/24/2015]


비밀번호

댓글 작성자
 



2015-12-25 07시15분
우선 소켓에 대한 사용 개념이 잘 서 있지 않은 것 같습니다. 간단하게 우선 윈폼이나 콘솔 응용 프로그램 형식으로 자신이 하려는 GPIO 로직을 다른 걸로 대체해서 테스트를 해보세요. 제 생각에는 박성우님이 지금 프로젝트를 진행하기 보다는 좀 더 공부가 필요한 것 같습니다.
정성태
2015-12-27 11시16분
[sungwoo park] 예 사실 소켓에 대한 개념이 아직 인게 사실입니다. 소켓부터 공부하도록 하겠습니다. 답변 감사합니다.
[guest]

... 31  32  33  34  35  36  37  38  39  40  41  42  43  [44]  45  ...
NoWriterDateCnt.TitleFile(s)
4748Bere...8/3/201610985그냥 생각이 들어서 여기 글 써봅니다. [1]
4746힘찬도약8/2/201611247[asp.net] local에서 cookies값이 읽혀지지 않는 경우 [1]
4747힘찬도약8/3/201611987    답변글 [예제 첨부]: [asp.net] local에서 cookies값이 읽혀지지 않는 경우 [3]파일 다운로드1
4745힘찬도약7/27/201612090.NET 자식창 데이터를 부모창에 전달시 오류 질문드립니다. [4]파일 다운로드1
4744변찬연7/27/201611858안녕하세요 그 edge를 이용하는 데 조금 불편함이 있어서 문의드립니다 [1]
4743딸랑구아빠7/26/201610795IE 사용 시 인증 정보 계속 보내기? [1]
4741차가워7/20/201612434UWP 에서 COM 참조 불가능한가요? [6]
4740luna...7/19/201612860clickonce manifest 파일 질문 [1]
4739윤똘씨7/19/201612338정말 감동적입니다... [7]
4738닷넷초보7/7/201611197안녕하세요. C#의 개체 전달방식(참조)에 관련해서 질문 있습니다. [3]파일 다운로드1
4737beau...7/6/201613517python embedding 한 c++ 프로그램의 배포에 관해서 질문드리고 싶습니다. [1]
4736spow...7/6/201610393Property Lambda에 대한 심층 분석을 의뢰합니다 [7]
4735힘찬도약7/5/201611553.Net/Web.config에서 MSSQL을 쓰는데, MysqlSiteMap 참조오류 [3]파일 다운로드1
4734spow...6/28/201611137Visual Studio 2015 + Windows Forms 환경에서 컴파일 할 때 드물게 개발환경이 Crash 됩니다 [1]
4733feel...6/15/201611601타 서버로 소스 이전 중 [3]파일 다운로드1
4732구봉근6/14/201610341안녕하세요 [1]파일 다운로드1
4731초급개발자6/7/201612826Windows Form Application는 사라질까요? [2]
4730김시현6/4/201610890책으로 공부하던 도중 생성자에 대해서 궁금한게 생겼는데 혹시 답변좀 해주실수 있나요? [1]
4729Jeah...6/3/201612326C#.Net 프로그램에서 C++로 만들어진 dll 파일 이용관련 문의 하나 드립니다. [3]
4727링거5/30/201610977WPF MediaElement 파일 실행 후 삭제시 오류 문의 [1]파일 다운로드1
4728링거5/30/201611364    답변글 [답변]: WPF MediaElement 파일 실행 후 삭제시 오류 문의 [2]파일 다운로드1
4726spow...5/25/201610794덧글을 달고 나서 F5를 눌렀을 때 똑같은 덧글이 달리는 현상 고쳐주세요 [4]
4725Futu...5/23/201611262책 잘보고 있습니다. Task관련 질문을!!! [1]
4724학생15/23/201612512웹소켓과 소켓 관련해서 질문 드립니다. [2]
4722지나가던...5/15/201614353Part 3 pdf파일 그림 재수정 문의 [1]
4723지나가던...5/16/201611584    답변글 [답변]: Part 3 pdf파일 그림 재수정 문의 [1]
... 31  32  33  34  35  36  37  38  39  40  41  42  43  [44]  45  ...