-
[..프로그래밍..] [C#] Cloudtree Refernce Class - v1.0.22018.07.16 PM 05:08
오랜만에 Cloudtree reference class를 업데이트 하여 관련 포스팅을 합니다.
이전 버전의 레퍼런스 1.0.1 버전을 여러 사업에서 적용해 사용하기도 했고, 직장 후배에게 공유해주어 사용하기도 했는데요.
TCP 통신의 사용 방법이 복잡하다는 피드백을 두어번 받았습니다.
그렇다면 수정을 다시 한번 더 해야겠죠.
레퍼런스 클래스의 복잡했던 통신 관련 구조를 싹 갱신해버렸습니다.
초보자가 적용하려 해도 사용방법이 쉽도록 최대한 간결하게 바꾸어 보았습니다.
CloudtreeReferences v1.0.2 |
|||
수학함수 |
유클리딘 거리 함수 |
2차원 |
EuclideanDistance(x1,y1, x2, y2) |
3차원 |
EuclideanDistance(x1,y1, z1, x2, y2, z2) | ||
가우시한 랜덤 함수 |
Gaussian(mean, stdev) | ||
좌표계 |
위경도 두 점간 시선각 |
bearingP1toP2(p1_Lat,p1_Lon, p2_Lat, p2_Lon) | |
위경도 두 점간 거리 |
LatLonDistance(p1_Lat,p1_Lon, p2_Lat, p2_Lon) | ||
ECEF to LLA(위경고도) |
ECEF2LatLonAlt(x, y,z, result_Lat, result_Lon, result_Alt) | ||
시간 |
클럭 타이머 시간 경과 |
GetDuration(DateTimestart_time) | |
공유메모리 |
공유메모리 생성 |
CreateSharedMemory(SharedMemKey) | |
공유메모리 해제 |
CloseSharedMem() | ||
공유메모리 쓰기 |
WriteSharedMemory(SharedMemKey,ref data) | ||
공유메모리 읽기 |
ReadSharedMemory(SharedMemKey,ref data) | ||
곡선생성 |
베지어 곡선 |
getBezier2DPointList(refpoints, int point_of_curves, ref result) | |
캣멀롬 곡선 |
getCatmullRom2DPointList(refpoints, ref result) | ||
통신 |
TCP 서버 |
Netxxxxxxx(string ip, int port); // 생성자 SetMaxDataLength(int length); // 송수신 패킷 최대 크기 설정 Connect(); // 소켓 생성 및 접속 OnUpdate += RcvdDataProcess; // 데이터 수신 처리부 델리게이트 SendData(byte[] data, int length); // 데이터 송신 DIsconnect(); // 통신 종료 |
|
TCP 클라이언트 |
|||
UDP 유니캐스트 |
|||
UDP 멀티캐스트 |
레퍼런스 클래스 DLL의 public 함수는 위와같이 구성되어 있습니다.
이전 게시물을 보시거나 아래 첨부할 레퍼런스 클래스 예제 폼 샘플을 열어보시면 사용법을 쉽게 아실 수 있으리라 생각합니다.
이번 포스팅에서는 이전 버전에서의 변경점에 대해서만 언급하고자 합니다.
이전 버전과의 주요 변경점은 TCP 서버/클라이언트, UDP 유니캐스트, UDP 멀티캐스트 함수가 있습니다.
각 통신 방법에 따른 인스턴스를 선언한 이후로 크게 여섯가지 정도의 함수만으로 각 통신 소켓을 사용할 수 있도록 구성했습니다. 이는 TCP 서버/클라이언트와 UDP 유니캐스트, UDP 멀티캐스트에 일괄 공통 적용 사항입니다.
각 통신 방법에 따른 함수를 TCP 서버를 대표 예로 설명드리자면...
1. 인스턴스에 의한 통신 클래스 생성
NetTcpServer m_NetTcpServer = new NetTcpServer(tbTcpServerIP.Text, Convert.ToInt32(tbTcpServerPort.Text)); |
생성자에 서버 IP와 사용할 포트를 인자로 전달합니다.
예외적으로 UDP 유니캐스트의 경우 송수신 안정성을 위하여 전송과 수신 소켓을 분리하였으므로, 수신 IP, 수신 포트, 송신 목적지 IP, 송신 목적지 Port 네 개의 인자를 생성자에 전달합니다.
2. 송수신 패킷의 최대 크기 설정
m_NetTcpServer.SetDataMaxLength(2048); |
이전 버전에서는 네트워크 관련 함수에 쓸 Constants 클래스를 두고 이를 활용하였으나, 한 눈에 파악되지 않고 처음 사용자의 경우 소스코드 여기저기를 뒤져봐야 파악이 된다는 지적이 있어 직관적으로 SetDataMaxLength() 함수를 만들었습니다.
3. 통신 접속
m_NetTcpServer.Connect(); |
각 통신 방법에 따른 소켓을 열어 서버라면 바인딩, 클라이언트라면 서버에 접속 등을 수행하는 Connect() 함수입니다.
4. 데이터 수신
m_NetTcpServer.OnUpdate += OnUpdate_TcpServer; |
이전 버전까지는 데이터 수신부를 클래스 외부에서 각 사용자가 직접 만들어 콜백을 붙이도록 하였으나, 초심자의 경우 콜백 함수를 구성해서 적용하는 로직을 제대로 이해하지 못하는 경우도 많았고, 적지않은 예외 상황으로 결국 레퍼런스 클래스 내부를 건드리는 일도 발생함을 확인하였습니다.
이번 버전에서는 각 통신 방법에서 위 1~3의 과정을 거치면 데이터 수신용 스레드를 자동으로 생성하고, OnUpdate로 델리게이트된 함수에 수신된 byte array를 전달하도록 변경했습니다.
패킷 수신은 신경쓸 필요 없이, 수신된 데이터의 처리부만 사용자가 직접 코딩하면 되겠습니다.
5. 데이터 전송
m_NetTcpServer.SendData(StrByte, StrByte.Length); |
각 통신 방법에 따라 TCP는 서버와 클라이언트간 데이터 전송, UDP는 유니캐스트일 경우 목적지에 직접, 멀티캐스트일 경우엔 멀티캐스트 주소에 publish하는 SendData() 함수입니다.
6. 통신 종료
m_NetTcpServer.Disconnect(); |
각 방법에 따른 통신을 수행 후 통신 종료를 원할 경우 호출하는 Disconnect() 함수입니다.
데이터 수신용 스레드를 종료한 후 각 소켓을 닫아주는 것으로 통신을 종료합니다.
추가적으로, 기존 버전에서는 내 시스템의 IP를 자동으로 읽어올 때 vmWare 등의 가상 IP가 있는 경우, 또는 둘 이상의 네트워크 어댑터가 있는 경우를 상정하지 않았기에 제대로 동작하지 않는 경우가 있었습니다.
따라서 이번 버전에서는 게이트웨이를 통해 패킷이 나가는지를 검사하여 실제 외부로 연결중인 IP를 할당하도록 수정하였습니다.
위 예제 프로그램과 레퍼런스 클래스의 소스코드가 포함된 압축파일을 첨부합니다.
제가 쓰기 편하려고 만든 레퍼런스 클래스이긴 하지만, 필요하신 분이 계시다면 자유롭게 사용하셔도 무방합니다.
다만, 다른곳으로 공유 링크를 남기시거나 할 경우에는 본 포스팅 댓글에 공유한 주소를 알려주시면 감사하겠습니다.
user error : Error. B.