Network Programming in C Lecture 6 Network Programming

  • Slides: 41
Download presentation
Network Programming in C Lecture 6: Network Programming (1) ネットワークプログラミング 第 6回「ネットワークとプログラミング(1)」 20 10年秋学期

Network Programming in C Lecture 6: Network Programming (1) ネットワークプログラミング 第 6回「ネットワークとプログラミング(1)」 20 10年秋学期 Rodney Van Meter

今期の授業スケジュール(予定) 第1回 9/28: Introduction / イントロダクション 第2回 10/5:C Basics~Functions, Variables, Data Types・ Makefiles 第3回

今期の授業スケジュール(予定) 第1回 9/28: Introduction / イントロダクション 第2回 10/5:C Basics~Functions, Variables, Data Types・ Makefiles 第3回 10/12:C Basics~Command Line Arguments ・ Structures ・ Pointers 第4回 10/19:C Basics~Pointers & Arrays ・ Lists 第5回 10/26: file I/O・ Network Protocols 第6回 11/2: Network Programming (1) 第7回 11/9: Network Programming (2) 第8回 11/16: Network Programming (3) 第9回 11/30: Applied Network Programming (1) 第10回 12/7: Applied Network Programming (2) 第11回 12/14: Work on Projects 第1 2回 12/21: Work on Projects 第13回 1/19: Final Presentations!!!

Try My Message Server (Simpler even than the attendance server) IP address: 2001: 200:

Try My Message Server (Simpler even than the attendance server) IP address: 2001: 200: 0: 8801: 20 c: 29 ff: fe 27: 6 c 98 Port : 12345 telnet! 課題:サーバ作成

Outline for Today Projects Tools Sockets Practice/Homework Make your own TCP “Success!” server

Outline for Today Projects Tools Sockets Practice/Homework Make your own TCP “Success!” server

Wireshark

Wireshark

OSI Model & Internet Architecture アプリケーション層 Application Layer プレゼンテーション層 Presentation Layer セッション層 Web XML

OSI Model & Internet Architecture アプリケーション層 Application Layer プレゼンテーション層 Presentation Layer セッション層 Web XML Webサービス Email NNTP ・・・ Messaging File transfer File sharing TCP UDP Session Layer トランスポート層 Transport Layer ネットワーク層 IP Network Layer データリンク層 Data Link Layer Ethernet 物理層 x. DSL Optical fiber 無線LAN (WLAN) Physical Layer 8

Protocol Stack & Encapsulation Sender side Each layer in stack adds headers as necessary

Protocol Stack & Encapsulation Sender side Each layer in stack adds headers as necessary Receiver side Each layer extracts headers, processes, then sends to higher layer in stack n. b. : Messages may not be 1: 1! ex:HTTP hdr Application アプリケーション Data データ TCP hdr IP hdr Ethernet Frame phy. signal TCP IP IP Ethernet/100 M CAT 5 e sender side receiver side

ネットワークアプリケーションとは? process TCP transport layer UDP IP ICMP process ARP Application layer IGMP network

ネットワークアプリケーションとは? process TCP transport layer UDP IP ICMP process ARP Application layer IGMP network layer RARP hardware interface media data link layer

Client-Server Model Primary model used on the Internet Server (e. g. , web server,

Client-Server Model Primary model used on the Internet Server (e. g. , web server, DNS server, file server) Waits to receive communication from client 反復サーバ/平行サーバ Client (e. g. , web browser) Initiates connection to server Client Server サービス要求 Time サービス提供

Port & Socket Port Access point for transport layer TCP/UDP both have Appears in

Port & Socket Port Access point for transport layer TCP/UDP both have Appears in packet headers Socket “Adapter” that connects a software process to a network port Much like a file descriptor Internal to your computer

ソケット(Socket) Process-to-process data I/O entrance/exit Allows process to send/receive like a file descriptor Process

ソケット(Socket) Process-to-process data I/O entrance/exit Allows process to send/receive like a file descriptor Process socket Process

socket() System Call int socket(int family, int type, int proto) family defines choice of

socket() System Call int socket(int family, int type, int proto) family defines choice of protocol family AF_INET 6 AF_LOCAL AF_ROUTE IPv 4 protocol IPv 6 protocol UNIX Domain Socket routing socket (経路制御ソケット) (special) Type defines how data is managed SOCK_STREAM as a stream (TCP) SOCK_DGRAM as individual datagrams (UDP) SOCK_RAW raw packets Proto is 0, except for RAW

socket() System Call Return value success: socket descriptor number failure: -1 same as with

socket() System Call Return value success: socket descriptor number failure: -1 same as with file descriptors Code usually looks like… listenfd = socket(AF_INET, SOCK_STREAM, 0) AF_INETの場合の利用されるIPv 4の上位層 SOCK_STREAM TCP SOCK_DGRAM UDP SOCK_RAW なし

bindした状態 Proto Local. Address TCP *. A クライアント プロセス Foreign. Address *. * Port

bindした状態 Proto Local. Address TCP *. A クライアント プロセス Foreign. Address *. * Port A State Closed サーバ プロセス Port B Port C ホストA IP Address: xx. xx. ホストB IP Address: xx. xx.

Datagram example (UDP) Server socket() Client bind() socket() recvfrom() Block until Data from client

Datagram example (UDP) Server socket() Client bind() socket() recvfrom() Block until Data from client bind() Data (request) sendto() Process request sendto() Data (reply) recvfrom()

Stream example (TCP) Server socket() bind() Client listen() socket() accept() Block until connect recv()

Stream example (TCP) Server socket() bind() Client listen() socket() accept() Block until connect recv() Process request send() Connection Establishmt. Data (request) connect() send() Data (reply) recv() 暗黙にbind()

エンディアン変換 u_long htonl(u_long hostlong); u_short htons(u_short hostshort); u_long ntohl(u_long netlong); u_short ntohs(u_short netshort);

エンディアン変換 u_long htonl(u_long hostlong); u_short htons(u_short hostshort); u_long ntohl(u_long netlong); u_short ntohs(u_short netshort);

“Modern” naming getaddrinfo() See: Gilligan et al. , RFC 2553 Metz, “Protocol Independence. .

“Modern” naming getaddrinfo() See: Gilligan et al. , RFC 2553 Metz, “Protocol Independence. . . , ” Free. Nix 2000 Yoshifuji et al. , “Linux IPv 6 Networking, ” Linux Symposium 2003 More next week, when we start clients

Important Structure #include<netinet/in. h> struct sockaddr_in{ u_char sin_len; ズ*/ u_char sin_family; u_short sin_port; struct

Important Structure #include<netinet/in. h> struct sockaddr_in{ u_char sin_len; ズ*/ u_char sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; } /*IP addressのサイ /*AF_INET etc*/ /*port num*/ /*IP address*/ /*padding*/

Important functions socket bind sendto recvfrom UDP Server UDP client socket() bind() sendto() Data

Important functions socket bind sendto recvfrom UDP Server UDP client socket() bind() sendto() Data (request) recvfrom() sendto() recvfrom() Data (reply)

socket int socket(int domain, int type, int protocol); (例) int sd; sd = socket(AF_INET,

socket int socket(int domain, int type, int protocol); (例) int sd; sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)        AF_UNIX , SOCK_STREAM, IPPROTO_TCP SOCK_RAW, IPPROTO_ICMP

bind int bind(int sockfd, struct sockaddr *addr, int addrlen); (例) struct sockaddr_in cl_addr; memset((void

bind int bind(int sockfd, struct sockaddr *addr, int addrlen); (例) struct sockaddr_in cl_addr; memset((void *)&cl_addr, 0, sizeof(cl_addr)); cl_addr. sin_family = AF_INET; cl_addr. sin_port = htons(0); cl_addr. sin_addr. s_addr = htonl(INADDR_ANY);  /* local host*/ bind(sd, (struct sockaddr *)&cl_addr, sizeof(cl_addr))

Example of Old-Style Code for filling in sockaddr struct sockaddr_in sv_addr; memset((void *)&sv_addr, 0,

Example of Old-Style Code for filling in sockaddr struct sockaddr_in sv_addr; memset((void *)&sv_addr, 0, sizeof(sv_addr)); sv_addr. sin_family = AF_INET; sv_addr. sin_port = htons(? ? ? ); inet_aton(? ? ? , &sv_addr. sin_addr);

Using sendto() ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct

Using sendto() ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen); (例) if (sendto(sd, (char *)&msg, sizeof(msg), 0 , (struct sockaddr *)&sv_addr, sizeof(sv_addr)) < 0) { perror("sendto"); exit(-1); }

Using recvfrom() ssize_t recvfrom() (int s, void *buf, size_t len, int flags, struct sockaddr

Using recvfrom() ssize_t recvfrom() (int s, void *buf, size_t len, int flags, struct sockaddr *from, int *fromlen); (例) recvlen = recvfrom(sd, (void *)buf, 1024, 0, (struct sockaddr *)&sv_addr, &svadlen);

#include #include <sys/types. h> <sys/socket. h> <netinet/in. h> <netdb. h> <stdio. h> #define BUFMAX

#include #include <sys/types. h> <sys/socket. h> <netinet/in. h> <netdb. h> <stdio. h> #define BUFMAX 1024 int main(int argc, char *argv[]){ int sd; int cc, svadlen; char buf[BUFMAX] char rmsg[BUFMAX]; struct sockaddr_in cl_addr, sv_addr; /* socketの作成 */ ? ? /* socketに名前をつける */ ? ? /* サーバのソケットアドレスの設定 */ ? ? /* 処理ルーチン(メッセージの送信,受信) */ ? ? return 0; }

Homework Create your own TCP “Success!” message server.

Homework Create your own TCP “Success!” message server.