2020년 8월 5일 수요일

LG QuickMemo Note 파일 (.lqm) 윈도우에서 여는 방법


얼마전 우연히 확장자 .lqm 파일을 받게 되었다.

생전 처음보는 확장자라.... 읭? 이게뭐지 싶었다.

그래서 이 파일을 열기 위해서 구글에 검색을 해봤다.

LG에서 만든 LG폰 사용자들을 위한 노트 앱에서 저장하는 형식이라고 한다.

그런데 엘지에서는 이 확장자를 열 수 있는 앱이나 프로그램을 따로 제공하지 않는것 같았다.

이에 대해 다른 방식으로 문제를 해결하는 몇몇 글들이 있었지만 복잡했다.

심지어 이걸로 장사를 하는 소프트웨어 업체도 있는거 같았다.

설치 후 lqm 파일을 여니 확장 구매를 하지 않으면 열수 없다고 해서 빛삭했다.

그러던 중 발견한 글이 있었는데

LG 폰을 사용하는 외국인도 동일한 문제에 봉착했나보다.

지식인 같은데 질문해놓은 글을 봤는데

어떤 사람이 답하길 

*여기서부터 중요하다.*

이 파일이 zip과 같이 압축한 방식이라고 한다.

그래서 윈도우에서 확장명을 강제로 .lqm -> .zip로 변경해준 후

압축을 풀면

여러가지 폴더가 들어있는데

내 경우는 이 파일이 이미지 파일을 가지고 있어서

Image라고 되어있는 폴더를 열어 .jpg로 이미지가 들어있는 것을 확인했다.


내가 이 문제로 골머리를 앓아서 간략하게 해결방법 공유한다.


2015년 7월 2일 목요일

[C#] Ping 테스트 방법


ping은 특정 ip로의 통신이 가능한지에 대해서 체크하는 기능입니다.

일반적으로 windows의 경우
cmd를 실행 --> ping ip주소 입력 으로 pingtest를 할 수 있습니다.

그렇다면 C#에서 프로그래밍 적으로 이 기능을 사용하고자 한다면

어떻게 해야 할까요?

여기에 제가 아는 두 가지 방법을 소개하고자 합니다.
첫 번째 방법은  System.Net.NetworkInformation.Ping을 사용하는 것이고
두 번째 방법은 Microsoft.VisualBasic.Devices.Network().Ping을 이용하는 것입니다.

첫 번째 보다는 두 번째 방법이 훨씬 간단합니다.

우선 첫 번째 방법은

 try
                {
                    Ping ping = new Ping();
                    PingOptions options = new PingOptions();
                    options.DontFragment = true;
                    string data = "aaaaaaaaaaaaaaaaa";
                    byte[] buffer = ASCIIEncoding.ASCII.GetBytes(data);
                    int timeout = 120;
                    PingReply reply = ping.Send(IPAddress.Parse(아이피 주소), timeout, buffer, options);
                    if (reply.Status == IPStatus.Success)
                        // 네트워크 사용 가능할 때~~
                }
                catch
                {
                }

이렇게 해서 사용할 수 있습니다.
문장도 길어질 뿐더러 쓰레기 값을 보내고 어쩌고 하는 것이기 때문에 영 마음에 들지 않습니다.
그래도 사용하는데 문제는 없습니다.

두 번째 방법은 한 줄이면 끝납니다.

 new Microsoft.VisualBasic.Devices.Network().Ping(도메인이나 아이피주소);

이렇게 하면 반환값으로 bool을 반환해 줍니다. 참 간단하게 사용할 수 있는 방법입니다.

참고로 ~~~.Network().IsAvailable이라는 녀석을 사용하면 현재 디바이스가 네트워크에 연결되어있는지 그 여부도 알 수 있습니다.
여기서 더 추가하자면 이 속성은 changed 이벤트를 제공하기 때문에 즉각적으로 네트워크 연결 상태를 점검할 수도 있습니다.

2015년 4월 14일 화요일

[c#] 현재 시점에서의 TCP 연결 확인 방법

* 아래 글은 작성자의 학습을 토대로 이해한 내용을 작성하였기 때문에 사실과 다른 부분이 있을 수 있습니다.


C# 네트워크 프로그램을 작성하다 보면 연결 상태를 체크해야 하는 경우가 있다.

Socket의 속성 IsConnected를 사용하면 될 것 같지만 그렇지 못했다.
IsConnected는 현재 시점에서의 연결 상태가 아닌 바로 이전 전송을 기준으로 연결 상태 값이 설정되기 때문이다.

예를 들어 설명하면
마지막 전송이 성공했다면 IsConnected는 true상태일 것이다.
네트워크 상태가 불안정하여 Connected 상태가 변경되었을 때에도 IsConnected는 여전히 true 상태로 남아있게 된다.
다시 말해 IsConnected 속성은 현재의 연결 상태를 바로바로 반영해주는 속성이 아니라는 것이다.


이를 해결하기 위해 구글링 한 결과 ----------------------------------------------------

1. TimeOut을 이용 --> 예제가 복잡해 보이고 어떻게 하는지도 잘 모르겠어서 패스
2. TcpConnectionInformation 이용 --> 비교적 간단한 예제를 찾을 수 있어서 활용!

--------------------------------------------------------------------------------------------


2번째 방법을 사용해 현재 시점의 연결 상태를 점검하는 기능을 구현하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 연결 상태 체크 TcpClient형의 객체명 : tcpClient 
IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
    TcpConnectionInformation[] tcpConnections;
    try{                
        tcpConnections = ipProperties.GetActiveTcpConnections()
.Where(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint) &&
x.RemoteEndPoint.Equals(tcpClient.Client.RemoteEndPoint))
.ToArray();
       }catch{
        // Exception 처리 -> 여기서는 Disconnected된 것으로 보면 된다.
       }
           if (tcpConnections != null && tcpConnections.Length > 0)
        {
            TcpState stateOfConnection = tcpConnections.First().State;
            if (stateOfConnection == TcpState.Established)
                //Connected ~~
            else
                //Disconnected ~~
         }
cs



IPGlobalProperties 객체의 GetActiveTcpConnections()를 호출하면 로컬 PC에 연결된 모든 TCP 커넥션 정보를 가져온다.

하지만 나에게 필요한 것은 특정 IP(+Port)와의 통신 상태 여부이므로 Where 문을 사용해서 나의 끝점과 연결된 곳의 끝점의 연결 정보로 제한한다.


TcpState의 경우 디테일한 TcpState Enum을 표현할 수 있는데 여기에서는 연결되어서 데이터를 주고받을 수 있는 상태를 가리키는 Established 상태만 판별하면 되기 때문에 조건을 위와 같이 주면 된다.



But!!

나의 경우 위 코드를 주기적으로 호출하도록 했는데
TcpClient 객체에서 Disconnect() 를 호출한 후 위 코드를 호출하면 nullException 예외가 발생 하였다.

아마 추가로 조건문이나 예외처리를 해줘야 하는 것 같다.

 (사실 위 코드를 사용한지가 오래 돼서 정확히 기억이 잘 안남. 나중에 확인 후 예외처리 방법도 추가 하겠음. 나의 경우는 Disconnect() 호출이 꼭 필요하지 않아서 사용하는 데 문제가 없었다.)

위 코드 전체를 그대로 사용할 수도 있지만 때로는 자신의 상황에 맞게 수정해야 할지도 모른다.

핵심적으로 구현해야 하는 내용 ---------------------------------------------------


1. IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();
=> 로컬 PC의 ip 정보 관련한 IPGlobalProperties 객체를 얻어올 것
-----------------------------------------------------------------------------------------------
2. TcpConnectionInformation[] tcpConnections;
=> Tcp 상태 정보를 얻어 올 TcpConnectionInformation 배열을 선언
-----------------------------------------------------------------------------------------------
3. tcpConnections = ipProperties.GetActiveTcpConnections()
.Where(x => x.LocalEndPoint.Equals(tcpClient.Client.LocalEndPoint) &&
x.RemoteEndPoint.Equals(tcpClient.Client.RemoteEndPoint))
.ToArray();
=> GetIPGlobalProperties()로 내가 원하는 조건에 부합하는 연결을 필터링해서 tcpConnectionInformation형 배열에 할당

-----------------------------------------------------------------------------------------------
위의 내용만 잘 숙지하면 간단한 활용은 무난할 것이다.

이 글에서 사용한 클래스 및 자세한 구조에 대해서는 나중에 추가로 작성하겠다.