340 likes | 535 Views
Socket 程式設計. Outline. Introduction Function Call Design. Introduction. TCP/IP 是一個協定,是一組支援網路溝通協定的集合 。 定義網路 傳送時 的封包 說明封包應 包含哪些資訊 TCP/IP 模組架構包含 4 個 階層 網路 存取 層 ( 提供主機與實體網路連接,並具有發送封 包的能力 ) 網際網路層 ( 提供與硬體無關 的 IP address ,並將封包封送至網路上 ) 傳輸層 ( 是與網路應用程式間的界 面,可分為 TCP 、 UDP)
E N D
Outline • Introduction • Function Call • Design
Introduction • TCP/IP是一個協定,是一組支援網路溝通協定的集合。 • 定義網路傳送時的封包 • 說明封包應包含哪些資訊 • TCP/IP模組架構包含4個階層 • 網路存取層 (提供主機與實體網路連接,並具有發送封包的能力) • 網際網路層 (提供與硬體無關的IP address,並將封包封送至網路上) • 傳輸層 (是與網路應用程式間的界面,可分為TCP、UDP) • 應用層 (為網路除錯、檔案傳輸、遠端控制和網際網路活動提供應用程式)
Introduction (cont.) • TCP • TCP是一個連結協定,透過TCP可確保接收端收到完整、正確的資料 • UDP • UDP則是一個非連結協定,比TCP快,但可靠度差
Introduction (cont.) • “Socket” 是一種可做雙向資料傳輸的通道,可經由此與 local 或是 remote 的程式做溝通。 • Socket • local socket:主要用來與本地端的程序溝通 • internet-domain socket:用來與遠地端的程序溝通
Outline • Introduction • Function Call • Design
Function Call • IPv4 socket定址結構 structsockaddr_in { sa_family_tsin_family; unsigned short intsin_port; structin_addrsin_addr; };
Function Call (cont.) • IPv4 socket定址結構 • Ex: #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> structsockaddr_inadr_srvr; adr_srvr.sin_family = AF_INET; adr_srvr.sin_addr.s_addr = inet_addr("192.168.1.100"); //adr_srvr.sin_addr.s_addr = inet_addr(INADDR_ANY); adr_srvr.sin_port = htons(8000);
Function Call (cont.) • 不論是TCP或UDP作為傳輸協定,都要透過socket作資料傳輸,首要工作是先建立socket • intsocket(int domain, int type, protocol);
Function Call (cont.) • socket() • Ex: #include <sys/types.h> #include <sys/socket.h> Intsockfd; sockfd= Socket(AF_INET, SOCK_STREAM, 0); 傳回值: 成功:傳回socket ID。 失敗:傳回-1。
Function Call (cont.) • 將IPv4 socket定址結構連結到所建立的socket • int bind(intsockfd, conststructsockaddr *my_addr, size_tadr_len);
Function Call (cont.) • bind() • Ex: #include <sys/socket.h> bind(sockfd, (structsockaddr*)&adr_srvr, sizeof(structsockaddr)); 傳回值: 成功:傳回 0。 失敗:傳回-1。
Function Call (cont.) • 等待client端的連線要求,會把連線請求放在連線佇列中 • int listen(int sockfd, int backlog);
Function Call (cont.) • listen() • Ex: #include <sys/socket.h> Intnum = 5; listen(sockfd, num); 傳回值: 成功:傳回 0。 失敗:傳回-1。
Function Call (cont.) • 呼叫accept函數來處理並接受佇列中的連線請求 • int accept(intsocketfd, structsockaddr *addr, socklen_taddrlen);
Function Call (cont.) • accept() • Ex: #include <sys/socket.h> accept(sockfd, (structsockaddr*)&adr_srvr, (structsockaddr*)&sizeof(adr_srvr)); 傳回值: 成功:傳回client的socket ID,稱為connect socket 。 失敗:傳回-1。
Function Call (cont.) • 用connect()函數向server端要求建立連線 • int connect(intsockfd, structsockaddr *serv_addr, intaddrlen);
Function Call (cont.) • connect() • Ex: #include <sys/socket.h> connect(sockfd, (structsockaddr*)&adr_srvr, (structsockaddr*)&sizeof(adr_srvr)); 傳回值: 成功:傳回 0。 失敗:傳回-1。
Function Call (cont.) • 將資料寫入已經開啟的socket • intwrite(intsockfd, char *buf, intlen);
Function Call (cont.) • write() • Ex: #include <sys/socket.h> Char buf[MAX_PATH] = “HelloWorld”; write(sockfd, buf, sizeof(buf)); 傳回值: 成功:傳回寫入的字元數。 失敗:傳回-1。
Function Call (cont.) • 從已經開啟的socket讀取資料 • int read(intsockfd, char *buf, intlen);
Function Call (cont.) • read() • Ex: #include <sys/socket.h> Char buf[MAX_PATH]; read(sockfd, buf, sizeof(buf)); 傳回值: 成功:傳回接收的字元數。 失敗:傳回-1。
Function Call (cont.) • 從已經開啟的socket傳送資料 • int send(intsockfd, const void *msg, intlen, unsigned int flags);
Function Call (cont.) • send() • Ex: #include <sys/types.h> #include <sys/socket.h> Char buf[MAX_PATH] = “HelloWorld”; send(sockfd, buf, sizeof(buf), 0); 傳回值: 成功:傳回傳送的字元數。 失敗:傳回-1。
Function Call (cont.) • 從已經開啟的socket接收資料 • intrecv(intsockfd, const void *msg, intlen, unsigned int flags);
Function Call (cont.) • recv() • Ex: #include <sys/types.h> #include <sys/socket.h> Char buf[MAX_PATH]; recv(sockfd, buf, sizeof(buf), 0); 傳回值: 成功:傳回接收的字元數。 失敗:傳回-1。
Function Call (cont.) • 呼叫close()終止client端和server端的連線。 • intclose(intsockfd);
Function Call (cont.) • close() • Ex: #include <unistd.h> int close(intsockfd); 傳回值: 成功:傳回 0。 失敗:傳回-1。
Outline • Introduction • Function Call • Design
Design • 設計tcp網路程式 • TCP client端 • 1.建立socket(使用socket()函數) • 2.向server要求連線(使用connect()函數) • 3.若連線成功,使用輸出入函數和server端互傳訊息 • 4.關閉socket,結束連線(使用close()函數) • TCP server端 • 1.建立socket(使用socket()函數) • 2.連結socket(使用bind()函數) • 3.開啟listening socket(使用listen()函數) • 4.等待client連線要求(使用accept()函數) • 5.若連線成功,使用輸出入函數和client端互傳訊息 • 6.關閉socket,結束連線(使用close()函數)
Design (cont.) • TCP程式設計流程