Lectures/NP/2015

From MCLab
Jump to: navigation, search

Contents

네트워크프로그래밍및실습 Class Overview

평가방법
programming assignments(40%), team project(30%), 시험(20%), 실습 report(10%)
결석 -1%p, 지각 -0.5%
이민섭, phone : 010-6822-0194 eminsub2@naver.com, 공과대학 304-1호

공지사항

과제물 제출요령
별도의 명기 없으면 PDF 파일로 e-class에 제출하세요. (보통 강의 전날 자정에 마감됨)
A+, A0, ...D0, F 로 평가되며, 10점 만점 점수로 환산하면 10, 9, ..., 3, 0 (미제출인 경우 F)
지각제출을 허용하는 경우 지체한 1일당 한 등급씩 낮아짐. (만점이 10% 하락)
서버 계정 신청 (3/9일까지)
수강신청자 전원에서 np.hufs.ac.kr에 계정이 부여되니 신청하세요. ID는 자동적으로 지정되며, 개인이 입력한 password는 기억해 두세요. 추후 SVN server의 ID와 password도 동일하게 부여될 것입니다.
List 버튼을 눌러 계정이 만들어졌는지 확인하세요. np가 'created'나 'exists'이면 사용할 수 있습니다. ssh나 Xshell(Windows에서)로 접속해 보세요.
SVN 계정 생성 및 Repository(저장소) 제공
개인별로 SVN repository가 할당됩니다. Repository URL은 'http://np.hufs.ac.kr/svn/<ID>', password는 np login 계정의 암호와 동일합니다.
Eclipse 설치 후에 사용하게 됩니다.

강의자료

Socket API and UNIX Network Programming in C

UNIX Network Programming (PDF)
참고자료
Computer Networks Chapter 2 Application Layer
POSIX Thread Programming, https://computing.llnl.gov/tutorials/pthreads/
Multithreaded Programming, http://randu.org/tutorials/threads/

Python Programming

Handouts
On-line Books
On-line Tutorials
Manual
참고
Python 2 vs Python 3

Advanced Python Programming

Handouts
GUI
Web Applications
Textbook
웨슬리 천, Core Python Applications Programming, 에이콘, Third Ed., 2014(번역판)
Online version

Python Books and Sites

실습/숙제/팀프로젝트 환경

실습

Lab-1. Installing Cygwin

Lab-2. (Cygwin) Stevens' UNIX Network Programming Library

Cygwin에서 UNP library를 설치하고 이를 이용한 프로그램을 build하고 시험한다.

Lab-2 Report (3/4까지)
Lab 2의 마지막 과정 Project에서 UNP library 이용하기의 전 과정에 대한 script 파일을 Lab-2.txt라는 파일명으로 만들어 e-class에 제출하시오.
참고 - 터미널에서 입출력한 모든 것을 파일로 저장하기
script라는 UNIX command는 터미널에서 입출력되는 모든 문자들을 파일에 저장하며, exit 명령으로 기록 작업이 종료된다. script와 exit 명령 사이의 모든 명령과 화면에 나타난 결과가 파일에 저장된다. <file name>이 생략되면 current directory에 typescript라는 파일에 저장된다.
 script <file name>
 ...
 exit

Lab-3. (Windows) Installing Eclipse IDE on Windows for Java, C/C++, and SVN

Windows에서 UNIX 환경을 emulation하는 Cygwin을 설치한다. Windows OS에서 C/C++ 프로그램을 개발하기 위한 Eclipse IDE와 관련된 plug-in들을 설치한다.

Lab-4. C Project using Eclipse

Lab-5. Echo Client and Server

Lab-5 Report tcpcli01@localhost - tcpserv04@np.hufs.ac.kr 실행 (3/12까지, 지연제출 불가)

Server에서 다음 과정의 script를 만들어 e-class에 제출한다.

  1. np.hufs.ac.kr에서 tcpserv04를 실행시키고, local machine의에서 tcpcli01을 실행한다.
  2. client/server의 접속 상태를 보여주는 'netstat' 명령을 접속 전/중/후에 내려 여러분의 SERV_PORT 상태를 확인한다.
  3. 'ps' 명령 결과로 zombie가 생기지 않았음을 확인한다.

Lab-6. Making Your Own Ubuntu Machine on a PC

Lab-7. (Ubuntu) Installing Eclipse IDE on Ubuntu for Java, C/C++, and SVN

Lab-8. Client-Server Development Environment

Lab-8 Report (3/19까지) 
자신의 Ubuntu VM에 있는 echo client를 np.hufs.ac.kr의 echo service daemon과 시험해 보고, np.hufs.ac.kr에서 echoserv를 빌드 한 후 local machine의 echo client와 연결하여 시험하는 전 과정의 script 파일(local machine 및 np.hufs.ac.kr에서)을 제출하라.

Lab-9. Source Version Control

Lab-10. Installing Python on Windows and Linux

5/4일 수업 전까지 Windows에 설치해 놓으세요.

Lab-11 Python Programming Exercises

Report-11. Word Frequency (5/17까지)
주어진 파일의 word의 빈도수를 구하라. 자세한 내용은 다음의 source를 참고하고 완성하라. 같이 첨부된 파일에 대해 시험해서 결과를 source와 함께 제출하라.
wordfreq (ZIP 파일)
wordfreq.py - source to be completed
small.txt - small text file
alice.txt - big text file

Programming Assignments

PA-1. Word Counter (3/11까지)

PA-2. Get File (3/25까지)

PA-3. Get File with URL(4/1까지)

PA-4. 1:1 Chatting (4/15까지)

PA-5. Python Exercise 1, 2, 3, 4: string and list (5/10까지)

PA-6. Get File with URL in Python (5/13까지)

PA-7. Poker Game (5/20까지)

PA-8. Poker Game - Class Implementation (5/24까지)

PA-9. 1:1 Chatting Client-Server (5/31까지)

참고 - Client-Server Model for Chatting
채팅을 peer-to-peer 방식으로 구현할 때 단점은 peer가 고정 IP가 없는 경우, 즉, private IP를 사용하는 경우에는 원천적으로 메시지를 보낼 수 없다. (이문제는 IPv4 address가 부족해서 private IP를 쓸 수 밖에 없기 때문이다.) Private IP를 가진 host는 고정 IP를 가진 server에게는 connect할 수 있지만, 반대 방향으로는 connect할 수 없다. 일단, connection이 설정되면 client와 server간에 양방향으로 데이터를 주고 받는데 문제없다.
따라서, chatting server를 별도로 두고 chatting client들이 이 server에게 connect해서 server를 매개로 메시지를 교환하는 1:1 chatting client/server를 채택하는 편이 현실적이다. (IPv6가 확산되면 이럴 필요 없다.)
Protocol Description

Chatting client는 메시지를 보내는 sender 역할을 할 수도 있고, server를 경유해서 도착한 메시지를 받는 receiver 역할도 있다. Chatting client에서 server로 보내는 request message와 이에 대응하여 server가 client에게 보내는 response message의 syntax는 다음과 같이 주어진다.

<request msg> ::= <request> <LF>
<response msg> ::= <response><LF>
<LF> = '\n'
sender request server response receiver
Assume receiver already logged in
LOGIN <sender id> 200 OK
410 Already logged in
MSG <sender id> <receiver id> <message> 200 OK
400 Not logged in
210 MSG <sender id> <receiver id> <message>
EXIT <sender id> 200 OK
closing the connection
illegal syntax 500 Syntax error

Response message는 HTTP response처럼 3 digit의 string으로 시작되며 이후의 string은 comment일 뿐이다. (단, 210 response message의 string은 receiver에게 전달된 message이다.)

  • 2xy: success
  • 4xy: temporary failure
  • 5xy: permanent failure

Server는 항상 client의 request에 대해 response message를 보내야 한다. Server는 LOGIN 하는 사용자의 connected socket을 기억하기 위해 id와 socket object를 (dictionary에) 저장해야 한다. MSG request message를 받은 경우, <receiver id>의 socket object를 찾아 210 response message를 이 socket으로 보내면 충분하다.

Client의 user interface는 자유롭게 설계할 수 있다. 예를 들어, 다음과 같이 정의할 수 있다.

  • my_id = raw_input('Login: ')
  • other_id = raw_input('Talk to: ')
  • msg = raw_input(other_id + ': ') -- my_id와 other_id를 concatenation해서 MSG request를 만듬
  • empy line -- end of session --> EXIT

Server로 부터 전달된 메시지도 항상 받을 수 있게 client를 thread로 구현함이 좋다.

  • 참고: Windows에서는 socket 이외의 file descriptor에 대해 select() 함수가 지원하지 않는다.
Problem

주어진 chatting protocol에 따라 chatting client와 server를 구현하라. chat_server.py를 완성하고, chat_client.py를 작성하면 된다.

  • 제공되는 source - added echo_client_thread.py at 5/28 06:00PM
    • select_server.py -- base class server using select()
    • echo_client.py -- sample echo client
    • echo_client_thread.py -- sample echo client using thread
    • echo_server.py -- sample echo server
    • chat_server.py -- to be completed by yourself

PA-10. 1:1 Chatting Client-Server with GUI (6/5까지)

Tkinter module을 이용하여 PA-9에 GUI를 제공한다.

PA-9의 기능에 더해 Log-in 안한 사용자에 전달할 메시지는 server가 저장하고 있어야 하며, 이 사용자가 추후 log-in 할 때 저장된 메시지를 전달하고 서버의 메시지는 삭제해야 한다. 예외적인 이유로 terminate되면 없어지므로 메시지를 저장할 때 persistent dictionary인 shelve를 사용해야 한다.

한번 사용자가 id를 입력하면 client는 'settings'라는 이름의 shelve에 저장해 두었다가 다음에 실행될 때 이를 읽어서 id를 물어보는 일을 생략해야 한다.

Tkinter GUI에서 한글을 display하기 위해서는 utf-8으로 encoding 되어야 한다. socket 통신에서서 utf-8으로 encoding해서 보내자. 물론, source encoding도 utf-8이 되어 있어야 한다.

Coding Exam-1

Team Project

팀구성 - 5/14까지
3인으로 팀을 구성하여 Team Project를 진행하라. 주제는 제한이 없다.
팀명(영문), 팀원, 팀장을 e-class에 제출
평가요소
팀 평가와 개인평가는 7:3
팀 평가(70%): 제안서(10%), 프로젝트의 난이도(15%), 완성도 및 활용가능성(30%), 발표(5%), 보고서의 품질(10%)
개인 평가(30%): 팀 공헌도 (상대평가)
최종결과 발표 및 시연 ()
최종결과를 시연하면서 발표한다.
제출물: PPT, 보고서(PDF), source code, SVN history (e-class에 제출)
팀 SVN repository

Project: 카카오톡 방식의 SNS (6/11까지)

카카오톡을 분석하여 1:1 채팅과 그룹 채팅이 지원되는 client와 server를 설계하고 구현한다.

전제 조건
  • Client의 설정은 'settings'라는 shelve에 저장되어 있으며, 여기에는 자신의 이름, 휴대전화번호 등이 저장된다.
  • Client의 disk에는 연락처가 shelve로 저장되어 있다. 여기에는 이름, 휴대전화번호 등이 저장된다. 이를 읽어서 친구 dictionary를 'friends'라는 이름의 dictionary로 만든다. (한번만)
    • NP 수강생 연락처 shelve가 별도 제공될 것임
  • Server는 사용자가 가져가지 않은 메시지를 저장둬야 한다.
카카오톡에서 채팅 방식 (추정)
  • 당연히 client-server model로 구현되었을 것이다.
  • 사용자의 ID는 전화번호로 식별한다. 따라서, 연락처(Contact)를 가지고 있다면, 다른 카톡 이용자에게 메지지를 보낼 수 있다.
  • 채팅 client가 server에 연결되지 않았을 경우도 server가 보관하고 있기 때문에 후에 메시지를 가져올 수 있다.
    • Server
      • 송신하는 채팅 메시지는 server가 받아 shelve에 저장한다.
    • Client
      • 채팅 client가 실행될 때 마다 server에 connect해서 도착한 새로운 메시지가 있는지 체크하고 가져온 후 connection을 끊는다.
      • 이후 채팅 client는 주기적으로 server에 연결하여 새로운 메시지가 도착했는지 체크하고 가져온다.
발표 및 시연회
6/11(목)일 수업시간

참고자료

Ubuntu

Apache, MySQL, and PHP

WireShark Protocol Anaylzer

  • WireShark download [1]:
  • WireShark 사용법 [2]