Network Programming Version 2.1
학습목표 소켓 프로그래밍의 개념을 이해한다. 소켓을 사용하여 네트워크 프로그램을 구현할 수 있다.
1. 소켓 프로그래밍 개요 TCP/IP 프로토콜계층 응용계층 트랜스포트 계층 인터넷계층 네트워크 액세스계층 응용프로그램 FTP, HTTP, Telnet, SMTP UDP 응용프로그램 NFS, TFTP 응용계층 트랜스포트 계층 TCP UDP RARP ARP IP ICMP 인터넷계층 Hardware Interface 네트워크 액세스계층 응용계층(Application): 응용프로그램계층, Telnet, FTP, SMTP, HTTP 등 전송방법 규정 트랜스포트계층(Transport) : 네트워크 종단 간 데이터전송을 지원하는 계층(TCP/UDP방식) 인터넷계층(Internetwork) : 인터넷layer로 불리며 IP,ICMP,ARP등의 프로토콜로 구성 네트워크 액세스계층(Network Interface) : 데이터링크 레이어라고 불리며, IEEE 802.2,ATM, X25등의 전송방식을 포함
1. 소켓 프로그래밍 개요 TCP와 UDP 전송방식 TCP 방식 UDP 방식 신뢰성 100% 신뢰성 보장 신뢰성 없음 TCP/IP 프로토콜은 연결 지향방식인 TCP (Transmission Control Protocol)와 비연결 지향방식인 UDP (User Datagram Protocol)로 구성 TCP 방식 UDP 방식 신뢰성 100% 신뢰성 보장 신뢰성 없음 네트워크부하 많음 상대적으로 적음 사용 예) 신뢰성이 요구되는 FTP, Telnet, SMTP, POP3, HTTP 등에 사용 대용량 미디어 파일 전송 (물리적으로 100% 신뢰할 수 있는 케이블) TCP방식 소켓프로그래밍 예 IPEndPoint ipep = new IPEndPoint (IPAddress.Any, 9999); Socket newsock = new Socket (AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); Newsock.Bind (ipep); Newsock.Listen(10); Socket client = newsock.Accept (); UDP방식 소켓프로그래밍 예 IPEndPoint ipep = new IPEndPoint (IPAddress.Any, 9999); Socket newsock = new Socket (AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); Newsock.Bind (ipep);
1. 소켓 프로그래밍 개요 System.Net 네임스페이스 IP 주소관련 클래스 클래스 설 명 IPAddress 클래스 설 명 IPAddress IP 주소를 나타내는 클래스 IPHostEntry 하나의 호스트에 대한 상세 정보를 제공하는 클래스 Dns 호스트 이름을 IP주소로 변환할 때 사용하는 클래스 IPEndPoint IP주소와 포트로 네트워크 종단점 정보를 가져오는 클래스 IPAddress 클래스 IPAddress 클래스는 주로 맴버메소드인 Parse()를 이용해 IP주소를 문자열 형태로 입력 ex)IPAddress addr = IPAddress.Parse(“192.168.0.1”); 네 개의 예약필드를 포함하고 있음. 예약 필드명 설 명 Any 로컬시스템에서 사용할 수 있는 IP주소를 나타낼 때 Broadcast 로컬 네트워크의 IP 브로드캐스트 주소를 나타낼 때 Loopback 시스템의 루프백 주소를 나타낼 때 None 시스템에 네트워크 인터페이스가 없음을 나타낼 때
1. 소켓 프로그래밍 개요 사용 예) - 콘솔프로그램 using System; using System.Net; class IPTest { static void Main(string[] args) IPAddress ex1 = IPAddress.Parse(“211.179.124.1”); IPAddress ex2 = IPAddress.Any; IPAddress ex3 = IPAddress.Broadcast; IPAddress ex4 = IPAddress. Loopback; IPAddress ex5 = IPAddress. None; Console.WriteLine(“{0}={1}”, “ex1”, ex1); Console.WriteLine(“{0}={1}”, “ex2(Any)”, ex2); Console.WriteLine(“{0}={1}”, “ex3(Broadcast)”, ex3); Console.WriteLine(“{0}={1}”, “ex4(Loopback)”, ex4); Console.WriteLine(“{0}={1}”, “ex5(None)”, ex5); }
1. 소켓 프로그래밍 개요 IPEndPoint 클래스 using System; using System.Net; class ExIPEndPoint { static void Main(string[] args) IPAddress ex = IPAddress.Parse(“211.179.124.1”); IPEndPoint ie = new IPEndPoint(ex, 8000); Console.WriteLine(“ToString() : {0}”, ie.ToString()); Console.WriteLine(“AddressFamily : {0}”, ie.AddressFamily); Console.WriteLine(“Address : {0}”, ie.Port); Console.WriteLine(“MaxPort:{0} MinPort:{1}”, IPEndPoint.MaxPort, IPEndPoint.MinPort); }
2. 소켓 사용하기 Socket 생성 (System.Net.Sockets) Socket sock = new Socket(AddressFamily af, SocketType st, ProtocolType pt;) SocketType ProtocolType 설 명 Dgram Udp 비 연결 통신(UDP) 통신 Stream Tcp 연결 지향 통신 (TCP) 통신 Raw Icmp ICMP(Internet Control Message Protocol) 패킷 통신
3. Socket 클래스를 이용한 바이트 단위 채팅 프로그램 Server IPEndPoint ipep = new IPEndPoint(IPAddress.Any,7000); //7000번포트열기 Socket server = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind (ipep); //채팅서버 바인딩 server.Listen (10); // 최대 10개의 클라이언트 접속 대기 Socket client = server.Accept (); // 클라이언트 접속처리 Client IPEndPoint ipep = new IpEndPoint (IPAddress.Parse(ip), 7000);//접속할IP Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); client.Connect (ipep); // ip에 해당하는 컴퓨터 7000포트로 접속시도
4. NetworkStream 클래스 이용 문자열 기반 채팅프로그램 Server IPEndPoint ipep = new IPEndPoint (IPAddress.Any,7000); //7000번포트열기 Socket server = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Bind (ipep); //채팅서버 바인딩 server.Listen(10); //클라이언트 접속 대기 Socket client = server.Accept (); //클라이언트 접속처리 NetworkStream stream = new NetworkStream (client); //네트워크스트림 StreamReader reader = new StreamReader (stream); //읽기 스트림 StreamWriter writer = new StreamWriter (stream); //쓰기 스트림 string msg = reader.ReadLine (); //상대방이 보낸 메시지 읽어오기 writer.WriteLine (); //상대방에게 문자열단위로 데이터 보내기 writer.Flush (); //버퍼에 있는 내용을 모두 전송
4. NetworkStream 클래스 이용 문자열 기반 채팅프로그램 Client IPEndPoint ipep = new IpEndPoint (IPAddress.Parse(ip), 7000); //접속할IP Socket client = new Socket (AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp); client.Connect (ipep) ; //ip에 해당하는 컴퓨터 7000포트로 접속시도 NetworkStream stream = new NetworkStream (client); //네트워크스트림 StreamReader reader = new StreamReader (stream); //읽기스트림 StreamWriter writer = new StreamWriter (stream); //쓰기 스트림 string msg = reader.ReadLine (); //상대방이 보낸 메시지 읽어오기 writer.WriteLine (); //상대방에게 문자열단위로 데이터 보내기 writer.Flush (); //버퍼에 있는 내용을 모두 전송
5. C# 헬퍼 클래스를 이용한 채팅 프로그램 작성 Server Client server.Start(); //서버프로그램 실행 TcpListener server = new TcpListener(7000); //7000번 포트 열기 server.Start(); //서버프로그램 실행 TcpClient client = server.AcceptTcpClient(); //클라이언트 접속대기 NetworkStream stream = client.GetStream(); StreamReader reader = new StreamReader(stream); StreamWriter writer = new StreamWriter(stream); string msg = reader.ReadLine(); writer.WriteLine(); writer.Flush(); Client TcpClient client = new TcpClient(ip, 7000); NetworkStream stream = client.GetStream(); StreamReader reader = new StreamReader(stream); StreamWriter writer = new StreamWriter(stream); string msg = reader.ReadLine(); writer.WriteLine(); writer.Flush();
6. 활용 예제 √ √ √ 인터넷 웹 브라우저 만들기 특정 컴퓨터의 활성화된 포트번호 검사 인터넷 웹 브라우저 만들기 특정 컴퓨터의 활성화된 포트번호 검사 WebInfo (웹서버에 GET /index.html HTTP/1.0\r\n\n 전송) 웹사이트분석 프로그램(WebRequest/WebResponse) 파일 전송 프로그램(소켓 채팅기반) CTOC_FILE_TRANS_INFO (전송할 파일정보) CTOC_FILE_TRANS_YES (파일 전송 수락) CTOC_FILE_TRANS_NO (파일 전송 거부) 7500포트이용 이모티콘 채팅 프로그램 파일전송/이모티콘 멀티채팅 SMTP 프로토콜을 이용한 전자메일 √ √ √