Bài giảng Lập trình mạng dùng Socket - Chương 1
KHÁI NIỆM VỀ SOCKET
z Socket API
– Ðược giới thiệu ở BSD4.1 UNIX, 1981
– Ðược ứng dụng khởi tạo, sử dụng và hủy bỏ.
– Dùng cơ chế client/server
– Cung cấp hai dịch vụ chuyển dữ liệu thông qua
socket API:
• unreliable datagram
• reliable, byte stream-oriented
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Lập trình mạng dùng Socket - Chương 1", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Lập trình mạng dùng Socket - Chương 1
ntln(e); } } } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 26 LẬP TRÌNH SOCKET VỚI UDP z Cung cấp cơ chế truyền không tin cậy giữa các nhóm các byte (datagrams) giữa client và server. z Không cần thiết lập kết nối giữa client và server. z Sender phải gởi kèm địa chỉ IP và port đích z Server khi nhận dữ liệu sẽ phân tích địa chỉ của sender để truyền lại. z Có thể server chấp nhận nhiều client tại một thời điểm. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 27 LẬP TRÌNH SOCKET VỚI UDP Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 28 VÍ DỤ (UDP Client) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 29 VÍ DỤ (UDP Client) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 30 VÍ DỤ (UDP Server) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 31 VÍ DỤ (UDP Server) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 32 LẬP TRÌNH SOCKET VỚI TCP z Server – Server process phải chạy trước. – Server phải tạo một socket để lắng nghe và chấp nhận các kết nối từ client. z Client – Khởi tạo TCP socket. – Xác định IP address, port number của server. – Thiết lập kết nối đến server. z Khi server nhận yêu cầu kết nối, nó sẽ chấp nhận yêu cầu và khởi tạo socket mới để giao tiếp với client. – Có thể server chấp nhận nhiều client tại một thời điểm. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 33 LẬP TRÌNH SOCKET VỚI TCP Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 34 VÍ DỤ (TCP Client) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 35 VÍ DỤ (TCP Client tiếp theo) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 36 VÍ DỤ (TCP Server) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 37 VÍ DỤ (TCP Server – tiếp theo) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 38 BÀI TẬP z Viết chương trình trên Java/C tương tự như nslookup: – Cho 1 tên tìm ra địa chỉ IP. – Cho 1 địa chỉ IP tìm ra tên. – Giao diện tương tự như sau: Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 39 BÀI TẬP z Viết chương trình echo client trên Java. – echo : 7/tcp, 7/udp. z Viết chương trình finger client trên Java. – Finger: 79/tcp. z Viết chương trình echo server trên Java. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 40 LẬP TRÌNH SOCKET TRÊN UNIX Release the connectionCLOSE Receive some data from the connectionRECEIVE Send some data over the connectionSEND Actively attempt to establish a connectionCONNECT Block the caller until connection attempt arrivesACCEPT Announce willingness to accept connections; give queue sizeLISTEN Attach a local address to a socketBIND Create a new communication end pointSOCKET MeaningPrimitives Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 41 LẬP TRÌNH SOCKET TRÊN UNIX zMột so sánh tương tự – socket: Điện thoại – bind: Gán một số cho điện thoại – listen: Bật chế độ chuông – connect: quay số – accept: trả lời điện thoại – read/write: nói chuyện – close: kết thúc Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 42 LẬP TRÌNH SOCKET TRÊN UNIX zĐể gởi – socket, connect, write zĐể nhận – socket, bind, listen, accept, read zEndpoint – Địa chỉ IP + chỉ số port Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 43 LẬP TRÌNH SOCKET TRÊN UNIX z Hàm socket int socket(int domain, int type, int protocol); Trong đó: – domain : họ địa chỉ, thường sử dụng là AF_INET – type : Kiểu socket (SOCK_STREAM, SOCK_DGRAM, ) – protocol : giao thức được dùng, default = 0 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 44 LẬP TRÌNH SOCKET TRÊN UNIX Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 45 LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ (ex1.c) #include #include int main(void) { int sockfd; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } printf("Sockfd : %d \n", sockfd); } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 46 LẬP TRÌNH SOCKET TRÊN UNIX z Hàm bind int bind(int sockfd, struct sockaddr *my_addr, int addrlen); Trong đó: – sockfd: socket file descriptor trả về từ hàm socket – my_addr: Một con trỏ đến một cấu trúc sockaddr ??? – addrlen = sizeof(struct sockaddr). Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 47 LẬP TRÌNH SOCKET TRÊN UNIX struct sockaddr_in { short sin_family; // e.g. AF_INET unsigned short sin_port; // e.g. htons(3490) struct in_addr sin_addr; // see struct in_addr, below char sin_zero[8]; // zero this if you want to }; struct in_addr { unsigned long s_addr; // load with inet_aton() }; Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 48 LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ 2 (ex2.c) #include #include #include int main(void) { struct sockaddr_in myaddr; int sockfd; myaddr.sin_family = AF_INET; myaddr.sin_port = htons(3490); // you can specify an IP address: //inet_aton("63.161.169.137", &myaddr.sin_addr.s_addr); // or you can let it automatically select one: myaddr.sin_addr.s_addr = INADDR_ANY; if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket"); exit(1); } if(bind(sockfd, (struct sockaddr *)&myaddr, sizeof myaddr)== -1) { perror("bind"); exit(1); } printf("socket, bind \n"); } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 49 LẬP TRÌNH SOCKET TRÊN UNIX z Hàm listen int listen(int sockfd, int backlog); Trong đó: - backlog: Số kết nối cho phép của hàng đợi. Các yêu cầu kết nối của đối tác sẽ được lưu trong queue cho tới khi được accept. z Hàm accept int accept(int sockfd, void *addr, int *addrlen); Trong đó: - addr: con trỏ trỏ tới sockaddr_in (Xác định từ đâu kết nối tới ?) - addrlen: biến int = sizeof(struct sockaddr_in) Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 50 LẬP TRÌNH SOCKET TRÊN UNIX z Hàm connect int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); Trong đó: - serv_addr: struct sockaddr chứa port & IP address đích - addrlen = sizeof(struct sockaddr) z Các hàm gởi nhận int send(int sockfd, const void *msg, int len, int flags); int recv(int sockfd, void *buf, int len, unsigned int flags); int read(int sockfd, const void *buf, int len); int write(int sockfd, const void *buf, int len); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 51 LẬP TRÌNH SOCKET TRÊN UNIX z Các hàm gởi nhận (tiếp theo) int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); tolen có giá trị bằng sizeof(struct sockaddr). int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); fromlen khởi tạo bằng sizeof(struct sockaddr). z Hàm close int close(int sockfd); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 52 LẬP TRÌNH SOCKET VỚI UDP socket() sendto() CLIENT SERVER socket() bind() receivefrom() sendto()receivefrom() client address close()close() data data Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 53 LẬP TRÌNH SOCKET VỚI UDP socket() sendto() socket() bind() receivefrom() sendto()/receivefrom( ) sento()/receivefrom( ) client address close()close() close() NEW PROCESS data data socket() sendto()receivefrom() Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 54 LẬP TRÌNH SOCKET VỚI TCP socket() CLIENT SERVER socket() bind() send()/receive() close(newsocket) close(mainsocket) close() listen() accept()connect() connection request data newsocket send()/receive() Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 55 LẬP TRÌNH SOCKET VỚI TCP socket() CLIENT SERVER socket() bind() send()/receive() close(newsocket)close() listen() accept()connect() connection request data close(mainsocket ) send()/receive() newsocket NEW PROCESS Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 56 LẬP TRÌNH SOCKET TRÊN UNIX z Một số hàm liên quan tên máy và địa chỉ int gethostname(char *name, size_t len); struct hostent *gethostbyname(const char *name); struct hostent *gethostbyaddr(const char *addr, int len, int type); char *inet_ntoa(struct in_addr in); int inet_aton(const char *cp, struct in_addr *inp); in_addr_t inet_addr(const char *cp); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 57 LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ về các hàm inet_* struct sockaddr_in antelope; char *some_addr; inet_aton("10.0.0.1", &antelope.sin_addr); // store IP in antelope some_addr = inet_ntoa(antelope.sin_addr); printf("%s\n", some_addr); // prints "10.0.0.1" // and this call is the same as the inet_aton() call, above: antelope.sin_addr.s_addr = inet_addr("10.0.0.1"); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 58 LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ về hàm inet_ntoa và gethostbyname struct hostent *he; // get the addresses of www.yahoo.com: he = gethostbyname("www.yahoo.com"); // print information about this host: printf("Official name is: %s\n", he->h_name); printf("IP address: %s\n", inet_ntoa(*(struct in_addr*)he->h_addr)); printf("All addresses: "); addr_list = (struct in_addr **)he->h_addr_list; for(i = 0; addr_list[i] != NULL; i++) { printf("%s ", inet_ntoa(*addr_list[i])); } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 59 LẬP TRÌNH SOCKET TRÊN UNIX • Ví dụ về hàm inet_aton và gethostbyaddr // get the host name of 66.94.230.32: inet_aton("66.94.230.32", &addr); he = gethostbyaddr(&addr, sizeof addr, AF_INET); printf("Host name: %s\n", he->h_name); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 60 LẬP TRÌNH SOCKET TRÊN UNIX z Một số hàm chuyển đổi số uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 61 LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ về các hàm chuyển đổi số uint32_t some_long = 10; uint16_t some_short = 20; uint32_t network_byte_order; // convert and send network_byte_order = htonl(some_long); send(s, &network_byte_order, sizeof(uint32_t), 0); some_short == ntohs(htons(some_short)); // this expression is true Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 62 LẬP TRÌNH SOCKET TRÊN UNIX Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 63 LẬP TRÌNH SOCKET VỚI TCP z DateTime Server #include #include int main (int argc, char **argv) { int listenfd, connfd; struct sockaddr_in servaddr, cliaddr; char buff[MAXLINE]; time_t ticks; /* Create a TCP socket */ listenfd = socket (AF_INET, SOCK_STREAM, 0); /* Initialize server’s address and well-known port */ bzero (&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl (INADDR_ANY); servaddr.sin_port = htons (13); Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 64 LẬP TRÌNH SOCKET VỚI TCP z DateTime Server (tiếp theo) /* Bind server’s address and port to the socket */ bind (listenfd, (struct sockaddr*) &servaddr, sizeof( servaddr)); /* Convert socket to a listening socket */ listen (listenfd, 100); for ( ; ; ) { /* Wait for client connections and accept them */ clilen = sizeof(cliaddr); connfd = accept( listenfd, (struct sockaddr *)&cliaddr, &clilen); ticks = time(NULL); snprintf( buff, sizeof(buff),"%.24s\r\n",ctime(&ticks)); /* Write to socket */ write( connfd, buff, strlen(buff) ); /* Close the connection */ close( connfd ); } } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 65 LẬP TRÌNH SOCKET VỚI TCP z DateTime Client #include #include int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if( argc != 2 ) printf("Usage : gettime "); exit(1); /* Create a TCP socket */ if ( (sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); exit(2); } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 66 LẬP TRÌNH SOCKET VỚI TCP z DateTime Client (tiếp theo) /* Specify server’s IP address and port */ bzero (&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons ( 13 ); if (inet_pton (AF_INET, “127.0.0.1”, &servaddr.sin_addr) <= 0) { perror("inet_pton"); exit(3); } /* Connect to the server */ if ( connect( sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) { perror("connect"); exit(4); } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 67 LẬP TRÌNH SOCKET VỚI TCP z DateTime Client (tiếp theo) /* Read the date/time from socket */ while ( (n = read ( sockfd, recvline, MAXLINE)) > 0) { recvline[n] = ‘\0’; /* null terminate */ printf(“%s”, recvline); } if (n < 0) { perror("read"); exit(5); } close ( sockfd ); } Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 68 BÀI TẬP z Viết chương trình nslookup bằng C trên Unix/Linux z Viết echo Client/Server bằng C trên Unix/Linux z Viết một Web Server có những đặc điểm sau: – Hỗ trợ phương thức GET (GET xxx.html HTTP/1.0) – HTTP – Đáp ứng của Server có header như ExServer/b1.0 – Ví dụ z Browser Request: GET /intro.html HTTP/1.0 WebServer Response z Server Reponse case 1: HTTP/1.0 200 OK case 2: HTTP/1.0 404 File Not Found case 3: HTTP/1.0 501 Not Implemented Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 69 TOÅNG KEÁT z Khái niệm socket z Thiết kế giải thuật cho client và server z Lập trình mạng trên Java z Lập trình socket trên UNIX
File đính kèm:
- bai_giang_lap_trinh_mang_dung_socket_chuong_1.pdf