Bài giảng môn Lập trình mạng - Chương 1: Lập trình mạng dùng Socket

pdf 35 trang phuongnguyen 6190
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng môn Lập trình mạng - Chương 1: Lập trình mạng dùng Socket", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_mon_lap_trinh_mang_chuong_1_lap_trinh_mang_dung_so.pdf

Nội dung text: Bài giảng môn Lập trình mạng - Chương 1: Lập trình mạng dùng Socket

  1. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG DÙNG SOCKET CHƯƠNG 1 Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 1 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM KHÁI NIỆM VỀ SOCKET z Socket API – Ðượcgiớithiệu ở BSD4.1 UNIX, 1981 – Ðược ứng dụng khởitạo, sử dụng và hủybỏ. – Dùng cơ chế client/server – Cung cấphaidịch vụ chuyểndữ liệuthôngqua socket API: • unreliable datagram • reliable, byte stream-oriented Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 2
  2. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM KHÁI NIỆM VỀ SOCKET Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 3 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER z Thiếtkế giảithuật cho client – Giảithuậtchochương trình client dùng UDP z Xác định địachỉ server. z Tạo socket. z Gởi/nhậndữ liệutheogiaothứclớp ứng dụng đãthiếtkế. z Đóng socket. – Giảithuậtchochương trình client dùng TCP z Xác định địachỉ server z Tạo socket. z Kếtnối đếnserver. z Gởi/nhậndữ liệutheogiaothứclớp ứng dụng đãthiếtkế. z Đóng kếtnối. Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 4
  3. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER z Thiếtkế giảithuật cho Server – Chương trình server có hai loại: z Lặp(iterative) z Đồng thời (concurrent). – Hai dạng giao thứcchương trình server: z Connection-oriented z Connectionless. Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 5 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 6
  4. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 7 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 8
  5. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 9 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 10
  6. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM THIẾT KẾ GIẢI THUẬT CLIENT/SERVER Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 11 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z Gói java.net – InetAddress – ServerSocket – Socket – URL – URLConnection – DatagramSocket Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 12
  7. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z InetAddress class – Class mô tả vềđịachỉ IP (Internet Protocol) – Các phương thức getLocalHost, getByName, hay getAllByName để tạomột InetAddress instance: z public static InetAddess InetAddress.getByName(String hostname) z public static InetAddess [] InetAddress.getAllByName(String hostname) z public static InetAddess InetAddress.getLocalHost() – Để lấy địachỉ IP hay tên dùng các phương thức: z getHostAddress() z getHostName() Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 13 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z In địachỉ IP củalocalhost import java.net.*; public class HostInfo { public static void main(String args[]) { HostInfo host = new HostInfo(); host.init(); } public void init() { try { InetAddress myHost = InetAddress.getLocalHost(); System.out.println(myHost.getHostAddress()); System.out.println(myHost.getHostName()); } catch (UnknownHostException ex) { System.err.println("Cannot find local host"); } } } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 14
  8. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z In địachỉ IP của proxy.hcmut.edu.vn import java.net.*; class kku{ public static void main (String args[]) { try { InetAddress[] addresses = InetAddress.getAllByName(“proxy.hcmut.edu.vn"); for (int i = 0; i < addresses.length; i++) { System.out.println(addresses[i]); } } catch (UnknownHostException e) { System.out.println("Could not find proxy.hcmut.edu.vn"); } } } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 15 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z Các chương trình đọcthêm – Tạomột địachỉ IP từ mảng byte, chuỗi String. z InetAddressFactory.java – Cho một địachỉ tìm tên máy. z ReverseTest.java Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 16
  9. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 17 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z Socket class – Class mô tả về socket – Tạomột socket z Socket(InetAddress address, int port) z Socket(String host, int port) z Socket(InetAddress address, int port, InetAddress, localAddr, int localPort) z Socket(String host, int port, InetAddress, localAddr, int localPort) z Socket() Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 18
  10. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z Socket class (tiếptheo) – Lấy thông tin về một socket z InetAddress getInetAddress() : trả vềđịachỉ mà socket kếtnối đến. z int getPort() : trả vềđịachỉ mà socket kếtnối đến. z InetAddress getLocalAddress() : trả vềđịachỉ cụcbộ. z int getLocalPort() : trả vềđịachỉ cụcbộ. – Sử dụng Streams z public OutputStream getOutputStream() throws IOException Trả về một output stream cho việcviếtcácbyte đến socket này. z public InputStream getInputStream() throws IOException Trả về một input stream cho việc đọc các byte từ socket này. Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 19 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z Kếtnối đên 1 số webserver import java.net.*; import java.io.*; public class getSocketInfo { public static void main(String[] args) { for (int i = 0; i < args.length; i++) { try { Socket theSocket = new Socket(args[i], 80); System.out.println("Connected to " + theSocket.getInetAddress() + " on port " + theSocket.getPort() + " from port " + theSocket.getLocalPort() + " of " + theSocket.getLocalAddress()); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 20
  11. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z Kếtnối đên 1 số webserver (tiếptheo) } catch (UnknownHostException e) { System.err.println("I can't find " + args[i]); } catch (SocketException e) { System.err.println("Could not connect to " + args[i]); } catch (IOException e) { System.err.println(e); } } // end for } // end main } // end getSocketInfo Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 21 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z ServerSocket class – Class mô tả về ServerSocket – Tạomột ServerSocket z ServerSocket(int port) throws IOException z ServerSocket(int port, int backlog) throws IOException z ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 22
  12. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z ServerSocket class – Các phương thức trong ServerSocket z Socket accept() throws IOException : Lắng nghe mộtkếtnối đến socket này và chấpnhận nó. z void close() throws IOException : Đóng socket. z InetAddress getInetAddress() : trả vềđịachỉ cụcbộ củasocket z int getLocalPort() : Trả về port mà server đang lắng nghe. z void setSoTimeout(int timeout) throws SocketException z Enable/disable SO_TIMEOUT với khai báo timeout (milliseconds) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 23 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z DateTime Server import java.net.*; import java.io.*; import java.util.Date; public class DayTimeServer { public final static int daytimePort = 5000; public static void main(String[] args) { ServerSocket theServer; Socket theConnection; PrintStream p; try { theServer = new ServerSocket(daytimePort); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 24
  13. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH MẠNG TRÊN JAVA z DateTime Server (tiếptheo) while (true) { theConnection = theServer.accept(); p = new PrintStream(theConnection.getOutputStream()); p.println(new Date()); theConnection.close(); theServer.close(); } }catch (IOException e) { System.err.println(e); } } } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 25 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI UDP z Cung cấpcơ chế truyền không tin cậygiữa các nhóm các byte (datagrams) giữa client và server. z Không cầnthiếtlậpkếtnốigiữa client và server. z Sender phảigởikèmđịachỉ IP và port đích z Server khi nhậndữ liệusẽ phân tích địachỉ của sender để truyềnlại. z Có thể server chấpnhậnnhiều client tạimộtthời điểm. Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 26
  14. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI UDP Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 27 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (UDP Client) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 28
  15. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (UDP Client) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 29 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (UDP Server) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 30
  16. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (UDP Server) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 31 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP z Server – Server process phảichạytrước. – Server phảitạomột socket để lắng nghe và chấpnhậncáckếtnốitừ client. z Client – Khởitạo TCP socket. – Xác định IP address, port number củaserver. – Thiếtlậpkếtnối đếnserver. z Khi server nhậnyêucầukếtnối, nó sẽ chấpnhậnyêucầuvà khởitạo socket mới để giao tiếpvới client. – Có thể server chấpnhậnnhiều client tạimộtthời điểm. Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 32
  17. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 33 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (TCP Client) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 34
  18. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (TCP Client tiếp theo) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 35 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (TCP Server) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 36
  19. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM VÍ DỤ (TCP Server – tiếp theo) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 37 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM BÀI TẬP z Viếtchương trình trên Java/C tương tự như nslookup: – Cho 1 tên tìm ra địachỉ IP. – Cho 1 địachỉ IP tìm ra tên. – Giao diệntương tự như sau: Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 38
  20. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM BÀI TẬP z Viếtchương trình echo client trên Java. – echo : 7/tcp, 7/udp. z Viếtchương trình finger client trên Java. – Finger: 79/tcp. z Viếtchương trình echo server trên Java. Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 39 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX Primitives Meaning SOCKET Create a new communication end point BIND Attach a local address to a socket LISTEN Announce willingness to accept connections; give queue size ACCEPT Block the caller until connection attempt arrives CONNECT Actively attempt to establish a connection SEND Send some data over the connection RECEIVE Receive some data from the connection CLOSE Release the connection Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 40
  21. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Một so sánh tương tự – socket: Điệnthoại – bind: Gán mộtsố cho điệnthoại – listen: Bậtchếđộchuông – connect: quay số – accept: trả lời điệnthoại – read/write: nói chuyện – close: kết thúc Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 41 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Để gởi – socket, connect, write z Để nhận – socket, bind, listen, accept, read z Endpoint – Địachỉ IP + chỉ số port Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 42
  22. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Hàm socket int socket(int domain, int type, int protocol); Trong đó: – domain : họđịachỉ, 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 Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 43 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 44
  23. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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); } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 45 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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ỏđếnmộtcấu trúc sockaddr ??? – addrlen = sizeof(struct sockaddr). Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 46
  24. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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() }; Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 47 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ 2 (ex2.c) // or you can let it automatically #include select one: #include myaddr.sin_addr.s_addr = INADDR_ANY; #include int main(void) if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { { struct sockaddr_in myaddr; perror("socket"); int sockfd; exit(1); } myaddr.sin_family = AF_INET; if(bind(sockfd, (struct sockaddr myaddr.sin_port = htons(3490); *)&myaddr, sizeof myaddr)== -1) { perror("bind"); // you can specify an IP exit(1); address: } //inet_aton("63.161.169.137", &myaddr.sin_addr.s_addr); printf("socket, bind \n"); } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 48
  25. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Hàm listen int listen(int sockfd, int backlog); Trong đó: - backlog: Số kếtnối cho phép củahàngđợi. Các yêu cầukếtnốicủa đối tác sẽđượclưu trong queue cho tớikhiđượ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ếtnốitới?) - addrlen: biếnint= sizeof(struct sockaddr_in) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 49 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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ởinhậ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); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 50
  26. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Các hàm gởinhận(tiếptheo) 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ởitạobằng sizeof(struct sockaddr). z Hàm close int close(int sockfd); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 51 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI UDP CLIENT SERVER socket() socket() bind() data sendto() receivefrom() client address receivefrom() data sendto() close() close() Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 52
  27. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI UDP socket() socket() bind() sendto() data receivefrom() close() client address socket() NEW PROCESS receivefrom() sendto() sento()/receivefrom( sendto()/receivefrom( ) data ) close() close() Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 53 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP CLIENT SERVER socket() socket() bind() listen() connection request connect() accept() newsocket send()/receive() data send()/receive() close() close(newsocket) close(mainsocket) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 54
  28. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP CLIENT SERVER socket() socket() bind() listen() connection connect() request accept() close(mainsocket ) newsocket send()/receive() data send()/receive() NEW PROCESS close() close(newsocket) Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 55 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Mộtsố hàm liên quan tên máy và địachỉ 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); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 56
  29. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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"); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 57 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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])); } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 58
  30. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 59 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Mộtsố hàm chuyển đổisố uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 60
  31. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX z Ví dụ về các hàm chuyển đổisố 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 Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 61 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET TRÊN UNIX Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 62
  32. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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); Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 63 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP z DateTime Server (tiếptheo) /* 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 ); } } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 64
  33. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM 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); } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 65 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP z DateTime Client (tiếptheo) /* 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); } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 66
  34. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM LẬP TRÌNH SOCKET VỚI TCP z DateTime Client (tiếptheo) /* 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 ); } Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 67 Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM BÀI TẬP z Viếtchươ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ếtmột Web Server có những đặc điểmsau: – 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 Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 68
  35. Tröôøng Ñaïi Hoïc Baùch Khoa Tp.HCM TOÅNG KEÁT z Khái niệmsocket z Thiếtkế giảithuật cho client và server z Lậptrìnhmạng trên Java z Lập trình socket trên UNIX Baûn quyeàn ®2005- Khoa Coâng Ngheä Thoâng Tin Trang 69