MFC TCP/IP
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();