프로그래밍/MFC

MFC TCP/IP

에어버스 2016. 7. 14. 19:46

MFC TCP/IP

TCP와 IP를 비롯한 다양한 프로토콜을 총칭

- 프로토콜
통신 규약으로 통신에 참여하는 개체가 상호 작용하는 절차와 방법을 정의한 것.

 응용프로그램 계층 

 TELNET, FTP, HTTP, SMTP, MIME, SNMP 등 

 전송 계층 

 TCP, UDP 

 인터넷 계층 

 IP 

 네트워크 액세스 계층 

 장치 드라이버, 네트워크 하드웨어 

TCP 

UDP 

연결형(Connection-oriented) 프로토콜 

비 연결형(Connectionless) 프로토콜 

1:1 통신 (Unicast) 

1:1 통신 (Unicast), 1:다 (Broadcast), 다:다(Multicast) 

신뢰성 있는 데이터 전송 - 데이터 재전송을 함 

비 신뢰적인 전송 - 데이터 재전송을 하지 않음 

데이터 경계 구분하지 않음 

데이터 경계 구분함 

- 루프백 주소 (127.*.*.*)
호스트, (컴퓨터, 라우터 등)에 할당하지 않음
하나의 컴퓨터에서 네트워크 프로그램을 작성하여 테스트할 때 매우 유용하다.

- IP, 포트
IP : 목적지 주소로 32비트 값이며 일반적으로 8비트 단위로 구분하여 각각 10진수로 표시
    IP 주소나 도메인은 목적지 컴퓨터를 지정하는것

포트 : 목적지 프로세스를 지정하는 것

포트번호 

분류 

 0~1023 

 Well Known Ports 

 1024~49151 

 Registered Ports 

 49152 ~ 65535 

 Dynamic and / or Private Ports 

 

<서버>

- 포트 생성용 객체와 Accept()의 인수로 사용할 객체 2개가 필요

- Accept() 와 Receive() 는 클라이언트가 언제 접속할지, 또 언제 데이터를 보낼지 모르므로 무한루프로 구현해야 한다.
MFC로 구현할 경우, CSocket 을 상속받는 클래스를 만들어 OnAccept() 와 OnReceive() 를 각각 오버라이딩해서 처리하게 된다. 또, 서버에서 클라이언트로 데이터 전송(Send)할때는 Accept() 인수에 사용한 객체에서 전송해야 한다. 즉, 포트 생성용 객체는 연결관리만 하고 데이터 주고 받는것은 Accept() 인수에 사용한 객체로 한다.

CSocket Listen;
Listen.Create(포트번호); // // 포트 생성
Listen.Listen(); // 서버 시작

while(1)
{
  Listen.OnAccept(*(CSocket Data)); // 클라이언트 접속 가상함수
  Listen.GetPeerName(CString, UINT); // 접속 클라이언트 IP, ㅠ포트번호 얻음
  while(1)
  {
    Data.Receive(char*, 버퍼트기); // data 수신
    받은 데이터가 없으면 루프 탈출;    
  }
}
Data.Close(); - delete Data; delete m_Data;

 

MFC 코드 (무한 루프없이 OnAccept(), OnReceive() 가상함수를 재정의해서 사용하면 된다.)

// 초기화 선언하는 함수에 추가
m_Listen = new CSocket;
m_Listen.Create(포트번호); // // 포트 생성
m_Listen.Listen(); // 서버 시작

// CSocket을 상속받은 클래스에서 OnAccepet()를 가상함수로 재 정의해서 사용
m_Listen.OnAccept(*(m_Data = new Socket)); // 클라이언트 접속 가상함수
m_Listen.GetPeerName(CString, UINT); // 접속 클라이언트 IP, ㅠ포트번호 얻음

// CSocket을 상속받은 클래스에서 OnReceive()를 가상함수로 재 정의해서 사용
m_Data
.OnReceive(char*, 버퍼트기); // data 수신

// 클라이언트에 데이터 전송
m_Data
.Send(void char*, 버퍼트기); // data 송신


m_Data.OnClose(); - m_Data-Close(); delete m_Data;

<클라이언트>

- 포트 생성용 객체 1개만 필요

m_Data = new CSocket;
m_Data.Create(); // 자동 포트번호로 생성
m_Data.Connect(주소, 포트번호); // 서번 연결
m_Data.Send(LPCTSTR, 버퍼길이);
m_Data.Close();