Understand IPv4 Addressing
IPv4: originally Classfull Addressing Special address Host ID = 0: network address Network ID = 0, host ID = 0 i.e means this network 127.x.y.z : “looped back” Host ID = all 1s : broadcasting NAT address 10/8 /12 /12 Broadcast address Limited broadcast router 밖에는 나가지 못함 Network-directed broadcast 그 네트워크까지 가서 네트워크 내에 broadcast /24 Subnet-directed broadcast /24 subnet 내에 broadcast IPv4 address 는 host 의 address 가 아니라 interface 의 address 이다.
Subnet Network address IP address && mask Network ID network consisting of 3 subnets subnet / / / /16 CIDR (Classless Inter-Domain Routing) Subnetting + suppernetting
Tip: Develop and Use Application “Skeletons”
Simple TCP Client and Server Client: simplec.c Server: simples.c
Making UNIX/Windows Compatible UNIX: bsd/skel.hWindows: win/skel.h wincompat.c: Window 에서 socket 을 생성전에 call 해야
TCP Server Skeleton tcpserver.skel: “mclab.hufs.ac.kr” or “ ” or “” -- server “http” or “80”
TCP Server Skeleton - Cont’d Usage: % myserver [local_addr | local_name] {local_port | service} Example: %myserver %myserver localhost http
TCP Client Skeleton tcpclient.skel: Usage: % myclient {peer_addr | peer_name} {peer_port | service} Example: % myclient % myclient http
UDP Server & Client Skeleton udpserver.skel:udpclient.skel:
Build Your Own Library and Use It ! etcp.h
TCP Client & Server Starting Functions Host name or IP addr or “” (my addr for server) “http” or “80”
UDP Client & Server Starting Functions
Remember that TCP is a Stream Protocol
TCP is a Stream Protocol No message boundary, just a byte stream TCP application 에서 하나의 message 를 send() 했다고 해서 recevier application 에서 그 message 를 한 덩어리로 recv() 되는 것이 아니다. Message 를 send() 했어도 TCP segment 에 언제, 어떻게 실릴지 모른다. (buffering 되기 때문 ) Recv() 하면 몇 byte 읽힐지 모른다. If you want to read exactly n bytes ?? If you want to make a record ??? Use end-of-record mark. e.g) new line Handle variable records (using fixed header) #include /* UNIX */ #include /* Windows */ int recv (SOCKET s, void *buf, size_t bufsize, int flags); int read (SOCKET s, void *buf, size_t bufsize);/* UNIX */ Returns: # of bytes read (>0), 0 if received FIN and no more data, -1 on failure int send (SOCKET s, const void *buf, size_t len, int flags); int write (SOCKET s, const void *buf, size_t len);/* UNIX */ Returns: # of bytes transferred on success, -1 on failure 메시지를 읽을 user buffer 의 크기 즉, 최대로 읽을 수 있는 크기 Socket send buffer 에 저장할 메시지 길이
Use End-of-record mark: read a line lib/readline.c:
Read n bytes and Read a variable-length record Record Length Other Header Data Variable Data lib/readn.c: lib/readvrec: #include “etcp.h” int readn (SOCKET s, char *buf, size_t len); Returns: # of bytes read, -1 on failure int readvrec (SOCKET s, char *buf, size_t len); Returns: # of bytes read, -1 on failure len cnt bp Header size Network byte order
Example: Client/Server using variable records vrc.c: vrs.c: