구형 노트북에 Linux로 Apache 웹 서버를 구축했다. 그리고 ipTIME의 DDNS로 도메인을 만들고 동영상 스트리밍 서버를 간단하게 만들었다.

그리고는 도메인으로 접속을 하니 잘 되었다. 

그런데 외부에 있는 사람에게 URL 주소를 주고 접속하게 했더니 .... 접속이 되지를 않았다.

말이 안되는 상황이 벌어졌다.


몰론 당연히 ipTIME에서 80 포트를 웹 서버로 사용하는 노트북으로 포트 포워딩을 했다.

결국 추적해 보니 사용하고 있는 통신사 LGU+에서 80 포트를 막아놓았다는 것을 알아냈다.

LGU+에 몇 차례에 걸쳐서 전화를 해 본 결과 실토를 받아냈다.


보안상의 이유 어쩌고 하는 말도 안되는 소리를 했고(80포트가 그렇게 보안상 막아야 한다면 기업 인터넷에서 왜 열어주는 것임?) 정책상 열어 줄수 없다는 최종적인 실토를 받아냈다.  통신사들의 갑질 아닌가 이게? 정상적으로 사용료를 지불하는데 어째서 80 포트를 사용 못해야한단 말인가?

이 과정에서 포트 개폐 유무를 체크해 주는 좋은 사이트를 발견했다.

아래 사이트는 포트 뿐만 아니라 IP 위치, Traceroute 등 다양한 유용한 기능들을 제공하는 쓸모가 많은 사이트이다.


http://www.whatsmyip.org/port-scanner/


결국 위의 문제는 세상 모든 사람들이 공통적으로 사용하는 80 포트를 사용하지 못하고 외부에서 들어오는 포트를 별다른 포트(예를들어 8181)로 만들고 그것을 내부에서는 80포트로 포트 포워딩 하는 작업을 해서 처리는 했지만 재미없는 일이다.




그래서 결국은 xxx.iptime.org:8181/xxx.php와 같은 방식으로 접속을 해야하는 수 밖에 없게 되었다.


포트포워딩 얘기가 나온김에 참고적으로 ipTIME 공유기의 DDNS를 이용해서 외부에서 puTTY를 이용해서 SSH로 접속이 가능할려면 SSH로 사용할 포트에 대해서도 역시 ipTIME 공유기의 관리자 페이지에서 포트포워딩해 주어야 된다.

FTP나 SFTP 등의 경우에 대해서도 역시 마찬가지 작업을 해 주어야 FileZilla나 puTTY를 통해 웹 서버에 접속이 가능하게 된다.

물론 Linux 서버단에서의 설정도 당연히 해 주어야 하는 건 그 또한 당연한 일이다.


짜증 나는 LGU+ 통신사로구나. 다른 통신사도 마찬가지인지 모르겠다. 80 포트 허용해 주는 통신사로 이동해야겠다.



가상 포트를 만들어 Serial 통신 기능을 구현해보고자 한다.

특정 장비와 Serial 통신을 하고자 한다면 해당 장비가 제공하는 통신 프로토콜을 파악해야 하는데 이 프로토콜을 파악한 것이 맞는지 어떤지 처음에는 확인이 되지 않을수가 있다.


따라서 가상 포트를 만드는 이유는 실제 장비와 Serial 통신을 함에 있어서 정상적으로 데이터 송/수신이 되는지을 확인한다거나 할 때 유용하기 때문에 가상 포트를 통해서 구현해 보고자 한다.

미션 수행은 다음과 같은 단계로 처리가 된다.


-. VSPE(Virtual Serial Port Emulator)를 이용한 가상 포트 만듦

-. Hyper Terminal을 이용해 VSPE가 만든 가상 포트에 연결 해 둠

-. C#에서 VSPE가 만든 가상 포트를 열어 해당 포트에 연결되어 있는 하이퍼터미널과 통신


먼저 VSPE를 설치한다. 

SetupVSPE.zip


그리고 가상 포트에 연결될 장비로 여기서는 하이퍼터미널을 사용할 것이다.

역시 하이퍼 터미널을 설치한다.

HyperTerminal_Kor.zip


VSPE를 실행해 보자. 64bit를 사용해 달라는 창이 뜨면 '아니요'를 선택한다.



위의 적색 박스안의 아이콘을 클릭해서 가상 포트를 만들어 보자.



위의 창에서 Device Type을 Connector 상태에서 '다음' 버튼 클릭한다.




위의 창에서 이제 원하는 포트를 선택해서 가상 포트를 하나 만든다. 여기서는 COM9을 선택했다.

이렇게 만들어진 가상 포트에 하이퍼터미널을 연결해서 C# 응용프로그램에서 COM9에 연결된 장비(하이퍼터미널)과 시리얼 통신을 할 것이다.

이제 하이퍼터미널을 실행한다.



새 연결 이름을 포트의 이름과 같이 명명했다. 확인 버튼을 클릭한다.



위의 창에서 '연결에 사용할 모뎀' 항목에 앞에서 만들었던 가상포트(COM9)를 선택한 후 확인 버튼 클릭




포트의 속성 정보를 설정한다. 여기서 속도(비트/초(B)와 '흐름 제어'를 위와 같이 설정한 후 확인을 클릭한다.



파일 - 속성 메뉴를 클릭해서 뜨는 창에서 '설정' 탭을 클릭한다. 그리고 적색 박스 부분의 'ASCII 설정' 버튼을 클릭한다.



ASCII 설정 창이 뜨면 위와 같이 항목들을 체크한다.

이렇게 하는 이유는 하이퍼터미널에서 송/수신 데이터를 화면에 보이도록 하기 위함이다.

이제 통신을 위한 준비 작업은 끝났다.


C#에서 만든 시리얼 통신 프로그램을 실행해서 통신을 해보자.



앞에서 만든 가상 포트에 연결된 하이퍼터미널로 위와 같은 데이터를 전송해 보았다.




이렇게 시리얼 통신이 잘 되고 있다.


아래는 시리얼 통신용 C# 쪽의 소스 코드이다.


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO.Ports;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;


namespace ExSerialCom

{

    public partial class Form1 : Form

    {


        private SerialPort sPort;

        private string portName = "Select Port";

        private string rxText = "";


        public Form1()

        {

            InitializeComponent();


            string[] ptNum = SerialPort.GetPortNames();


            for (int i=0; i<ptNum.Length; i++)

            {

                cmbPort.Items.Add(ptNum[i]);

            }

        }


        private void btnOpen_Click(object sender, EventArgs e)

        {

            sPort = new SerialPort();


            if(portName.Contains("Select"))

            {

                MessageBox.Show("포트를 선택해 주세요");

                return;

            }


            if(sPort.IsOpen)

            {

                MessageBox.Show("포트가 이미 열려있습니다");

                return;

            }


            sPort.PortName = portName;

            sPort.BaudRate = 9600;

            sPort.DataBits = 8;

            sPort.Parity = Parity.None;

            sPort.DataReceived += Port_DataReceived;

            //sPort.ErrorReceived += new SrialErrorReceivedEventHandler(serialPort_ErrorReceived);


            sPort.Open();

            if(sPort.IsOpen == true)

            {

                MessageBox.Show("포트 열기 성공");

            } else

            {

                MessageBox.Show("포트 열기 실패");

            }


        }


        private void btnClose_Click(object sender, EventArgs e)

        {

            if(sPort != null && sPort.IsOpen)

            {

                sPort.Close();

            }

        }


        private void btnSend_Click(object sender, EventArgs e)

        {

            if(richTextBox1.Text.Length > 0)

            {

                //포트 오픈 여부 체크

                if(sPort == null || sPort.IsOpen == false)

                {

                    MessageBox.Show("포트를 열어 주세요");

                    return;

                } else

                {

                    sPort.Write(richTextBox1.Text);

                }

            }

        }


        private void cmbPort_SelectedIndexChanged(object sender, EventArgs e)

        {

            portName = cmbPort.SelectedItem.ToString();

        }


        private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            rxText = sPort.ReadExisting();

            this.Invoke(new EventHandler(DisplayText));

        }


        private void DisplayText(object sender, EventArgs s)

        {

            richTextBox1.Text += rxText;

        }

    }

}





ping을 통해서 네트워크 연결 상태 체크하기 - 커맨더 창(DOS 창)에서


예를들어서 내 PC에서 폰의 연결 네트워크 상태를 체크할려면 우선 내 폰의 IP를 알아야 한다.

폰의 IP가 192.168.0.12이라고 할 경우


D:\>ping -n 5 192.168.0.12


여기서 -n은 ping을 날릴 횟수를 의미한다. 여기서는 5회.

아래 그림과 같은 결과를 보이면 정상적으로 연결된 상태이다.




만일 DDNS가 살아있는지 연결 상태를 체크하고자 한다면

(DDNS가 mycom.iptime.org라고 한다면)


D:\>ping mycom.iptime.org

를 하면 위의 이미지와 같은 결과를 보이면 네트워크가 정상적으로 연결된 상태이다.


+ Recent posts