Bài giảng Lập trình Socket

ppt 40 trang hoanguyen 4480
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình 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:

  • pptbai_giang_lap_trinh_socket.ppt

Nội dung text: Bài giảng Lập trình Socket

  1. LẬP TRÌNH SOCKET Khoa Mạng máy tính & Truyền thông - Đại học Công nghệ Thông tin - 1
  2. Nội dung n Giới thiệu lập trình socket n TCP/IP n Socket và TCP/IP n Lập trình Winsock n Cấu trúc chương trình ứng dụng n Sử dụng IDE: Visual C++ n Tổng kết 2
  3. Ký hiệu viết tắt n IPC: InterProcess Communication n BSD: Berkeley Software Distribution n TCP: Transmission Control Protocol n UDP: User Datagram Protocol n IP: Internet Protocol 3
  4. Giới thiệu về Sockets n SocketSocket làlà mộtmột trongtrong nhữngnhững kỹkỹ thuậtthuật cơcơ bảnbản nhấtnhất trongtrong truyềntruyền thôngthông trêntrên mạngmạng máymáy tínhtính n SocketSocket làlà mộtmột phươngphương thứcthức thựcthực hiệnhiện truyềntruyền thôngthông giữagiữa cáccác tiếntiến trìnhtrình đượcđược BSDBSD đềđề xuấtxuất n SocketSocket đượcđược sửsử dụngdụng đểđể mộtmột tiếntiến trìnhtrình ““nóinói chuyệnchuyện”” vớivới mộtmột tiếntiến trìnhtrình kháckhác n NhiềuNhiều ứngứng dụngdụng thôngthông dụngdụng hiệnhiện naynay sửsử dụngdụng kỹkỹ thuậtthuật socketsocket nhưnhư:: trìnhtrình duyệtduyệt web,web, emailemail client,client, 4
  5. Socket API n GiaoGiao diệndiện lậplập trìnhtrình socketsocket trêntrên Windows,Windows, winsockwinsock,, làlà mộtmột đặcđặc tảtả củacủa nhiềunhiều hãnghãng phầnphần mềmmềm nhằmnhằm chuẩnchuẩn hóahóa cáchcách thứcthức sửsử dụngdụng TCP/IPTCP/IP trêntrên Windows.Windows. SocketSocket APIAPI dựadựa trêntrên nềnnền BerkeleyBerkeley socket.socket. n TrongTrong BSDBSD Unix,Unix, socketsocket làlà mộtmột phầnphần trongtrong kernelkernel củacủa hệhệ điềuđiều hànhhành NóNó cungcung cấpcấp cáccác dịchdịch vụvụ IPCIPC cụccục bộbộ hoặchoặc giữagiữa cáccác tiếntiến trìnhtrình trêntrên mạngmạng n TrongTrong MS-DOS,MS-DOS, Windows,Windows, MacOSMacOS vàvà OS/2,OS/2, socketssockets đượcđược cungcung cấpcấp dướidưới dạngdạng cáccác thưthư việnviện lậplập trìnhtrình 5
  6. Các loại socket n StreamStream socket:socket: TCPTCP socketsocket n DatagramDatagram socket:socket: UDPUDP socketsocket n RawRaw socket:socket: IPIP socketsocket 6
  7. TCP/IP (1) n TCP/IPTCP/IP làlà mộtmột bộbộ giaogiao thứcthức,, đượcđược xâyxây dựngdựng dựadựa trêntrên kỹkỹ thuậtthuật “phi“phi kếtkết nốinối”.”. DữDữ liệuliệu đượcđược truyềntruyền theotheo từngtừng dãydãy cáccác góigói tintin đơnđơn lẻlẻ n TCPTCP đượcđược sửsử dụngdụng chocho cáccác dịchdịch vụvụ vớivới khảkhả năngnăng truyềntruyền dữdữ liệuliệu lớnlớn vàvà mộtmột kếtkết nốinối liênliên tụctục n UDPUDP thườngthường đượcđược sửsử dụngdụng chocho cáccác thaothao táctác tìmtìm kiếmkiếm nhanhnhanh hayhay cáccác truytruy vấnvấn đơnđơn lẻlẻ 7
  8. TCP/IP (2) n ThôngThông thườngthường,, cáccác ứngứng dụngdụng TCP/IPTCP/IP sửsử dụngdụng 44 lớplớp:: ¨ MộtMột giaogiao thứcthức ứngứng dụngdụng,, chẳngchẳng hạnhạn nhưnhư email,email, ftpftp hayhay wwwwww ¨ MộtMột giaogiao thứcthức cungcung cấpcấp cáccác dịchdịch vụvụ cầncần thiếtthiết chocho cáccác ứngứng dụngdụng,, chẳngchẳng hạnhạn nhưnhư TCP/UDPTCP/UDP ¨ IPIP cungcung cấpcấp dịchdịch vụvụ cơcơ bảnbản chuyểnchuyển giaogiao cáccác góigói tintin đếnđến đúngđúng địađịa chỉchỉ đíchđích ¨ CácCác giaogiao thứcthức cầncần thiếtthiết đểđể quảnquản lýlý phươngphương tiệntiện truyềntruyền dẫndẫn vậtvật lýlý,, chẳngchẳng hạnhạn nhưnhư EthernetEthernet hayhay mộtmột đườngđường nốinối điểmđiểm –– điểmđiểm 8
  9. So sánh OSI với TCP/IP 5-7. Application User Application 4. Transport TCP UDP 3. Network IP 1-2. Data Link / Hardware Interface Physical Network 9
  10. TCP n HướngHướng kếtkết nốinối n ĐảmĐảm bảobảo độđộ tintin cậycậy trongtrong quáquá trìnhtrình truyềntruyền dữdữ liệuliệu n PhânPhân đoạnđoạn dữdữ liệuliệu truyềntruyền thànhthành cáccác góigói tintin đơnđơn lẻlẻ n DữDữ liệuliệu truyềntruyền đượcđược đánhđánh sốsố thứthứ tựtự n CungCung cấpcấp cơcơ chếchế phảnphản hồihồi sausau khikhi nhậnnhận đượcđược dữdữ liệuliệu n SửSử dụngdụng cơcơ chếchế phátphát hiệnhiện lỗilỗi checksumschecksums 10
  11. UDP n PhiPhi kếtkết nốinối n KhôngKhông phânphân đoạnđoạn dữdữ liệuliệu truyềntruyền n KhôngKhông cungcung cấpcấp cơcơ chếchế tậptập hợphợp dữdữ liệuliệu nhậnnhận cũngcũng nhưnhư đồngđồng bộbộ quáquá trìnhtrình truyềntruyền nhậnnhận dữdữ liệuliệu n NếuNếu cócó lỗilỗi xảyxảy rara,, ứngứng dụngdụng bắtbắt buộcbuộc phảiphải thựcthực hiệnhiện truyềntruyền lạilại dữdữ liệuliệu n KhôngKhông cócó cơcơ chếchế phảnphản hồihồi sausau khikhi nhậnnhận dữdữ liệuliệu 11
  12. Các ví dụ về TCP / UDP DịchDịch vụvụ GiaoGiao thứcthức CổngCổng dịchdịch vụvụ DNS lookup UDP 53 FTP TCP 21 HTTP TCP 80 POP3 TCP 110 Windows shared UDP 137 printer name lookup Telnet TCP 23 12
  13. Sockets n KhiKhi đượcđược tạotạo rara,, mộtmột socketsocket khôngkhông cócó nhữngnhững thôngthông tintin chỉchỉ địnhđịnh cáchcách thứcthức hoạthoạt độngđộng n BộBộ giaogiao thứcthức TCP/IPTCP/IP sẽsẽ địnhđịnh nghĩanghĩa mộtmột điểmđiểm kếtkết nốinối trêntrên socket,socket, gồmgồm cócó mộtmột địađịa chỉchỉ IPIP vàvà mộtmột sốsố hiệuhiệu cổngcổng dịchdịch vụvụ 13
  14. Địa chỉ socket n ĐịaĐịa chỉchỉ củacủa mộtmột socketsocket trêntrên mạngmạng TCP/IPTCP/IP gồmgồm cócó haihai phầnphần:: ¨ ĐịaĐịa chỉchỉ IP:IP: mộtmột sốsố nguyênnguyên 3232 bitsbits xácxác địnhđịnh duyduy nhấtnhất mộtmột cardcard mạngmạng trêntrên máymáy tínhtính (host)(host) ¨ CổngCổng dịchdịch vụvụ:: mộtmột sốsố nguyênnguyên 1616 bitsbits xácxác địnhđịnh điểmđiểm kếtkết nốinối vớivới mộtmột ứngứng dụngdụng trêntrên mộtmột host.host. CácCác ứngứng dụngdụng thươngthương mạimại hayhay cáccác dịchdịch vụvụ thôngthông dụngdụng sửsử dụngdụng cáccác cổngcổng dịchdịch vụvụ chuẩnchuẩn đãđã đượcđược đăngđăng kýký 14
  15. Passive/Active Socket n PassivePassive socketsocket đượcđược sửsử dụngdụng ởở chươngchương trìnhtrình serverserver đểđể chờchờ nhậnnhận cáccác kếtkết nốinối đếnđến từtừ clientclient n ActiveActive socketsocket đượcđược sửsử dụngdụng ởở chươngchương trìnhtrình clientclient đểđể thiếtthiết lậplập kếtkết nốinối đếnđến chươngchương trìnhtrình serverserver 15
  16. Giao thức hướng kết nối (1) n CácCác giaogiao thứcthức dựadựa trêntrên phiênphiên làmlàm việcviệc hayhay sựsự chuyểnchuyển giaogiao cáccác góigói tintin cócó thứthứ tựtự n CungCung cấpcấp dịchdịch vụvụ kếtkết nốinối haihai chiềuchiều tintin cậycậy dựadựa trêntrên mộtmột phiênphiên làmlàm việcviệc n CácCác góigói tintin đượcđược đánhđánh sốsố thứthứ tựtự duyduy nhấtnhất n TừngTừng góigói tintin chuyểnchuyển giaogiao đượcđược xácxác nhậnnhận truyền/nhậntruyền/nhận thànhthành côngcông n CácCác góigói tintin nhậnnhận trùngtrùng lắplắp đượcđược phátphát hiệnhiện vàvà loạiloại bỏbỏ 16
  17. Giao thức hướng kết nối (2) n CácCác giaogiao thứcthức hướnghướng kếtkết nốinối hoạthoạt độngđộng theotheo baba giaigiai đoạnđoạn ¨ ThiếtThiết lậplập kếtkết nốinối:: haihai tiếntiến trìnhtrình truyền/nhậntruyền/nhận thiếtthiết lậplập kếtkết nốinối vàvà thốngthống nhấtnhất cáccác thamtham sốsố địnhđịnh nghĩanghĩa kếtkết nốinối ¨ TruyềnTruyền nhậnnhận dữdữ liệuliệu:: haihai tiếntiến trìnhtrình truyềntruyền nhậnnhận dữdữ liệuliệu dựadựa trêntrên kếtkết nốinối đãđã đượcđược thiếtthiết lậplập ¨ GiảiGiải phóngphóng kếtkết nốinối:: kếtkết nốinối giữagiữa haihai tiếntiến trìnhtrình đượcđược giảigiải phóngphóng 17
  18. TCP Connection connection request Tiến trình Tiến trình Client Server Thiết lập kết nối Tiến trình Tiến trình Client Server connection Truyền nhận dữ liệu 18
  19. Giao thức phi kết nối (1) n ĐơnĐơn giảngiản,, nhưngnhưng khôngkhông tintin cậycậy KhôngKhông cungcung cấpcấp cơcơ chếchế điềuđiều khiểnkhiển đườngđường truyềntruyền dựadựa trêntrên việcviệc đánhđánh sốsố thứthứ tựtự dữdữ liệuliệu truyềntruyền hoặchoặc cơcơ chếchế xácxác nhậnnhận n CungCung cấpcấp tínhtính năngnăng broadcastbroadcast thôngthông tintin n DữDữ liệuliệu đượcđược truyền/nhậntruyền/nhận theotheo từngtừng góigói tintin đơnđơn lẻlẻ:: datagramdatagram hayhay packet.packet. n MộtMột datagramdatagram làlà mộtmột thôngthông điệpđiệp độcđộc lậplập đượcđược gửigửi quaqua mạngmạng khôngkhông đượcđược đảmđảm bảobảo đếnđến đíchđích,, thờithời điểmđiểm đếnđến đíchđích vàvà nộinội dungdung thôngthông điệpđiệp 19
  20. Giao thức phi kết nối (2) n ThíchThích hợphợp chocho cáccác ứngứng dụngdụng broadcastbroadcast n ĐượcĐược sửsử dụngdụng trongtrong cáccác môimôi trườngtrường khôngkhông xácxác địnhđịnh đượcđược hosthost nhậnnhận dữdữ liệuliệu n KhảKhả năngnăng truyềntruyền thôngthông điệpđiệp nhanhnhanh sửsử dụngdụng trongtrong cáccác ứngứng dụngdụng khôngkhông quanquan tâmtâm đếnđến việcviệc dữdữ liệuliệu đượcđược truyềntruyền đếnđến đíchđích đúngđúng vàvà đủđủ 20
  21. Lập trình Winsock (1) Server Process Server Process socket() bind() socket() listen()listen() UDP TCP bind() UDP accept() recvfrom() Client Process Client Process get a blocked client socket() socket() 1 get a blocked client recv() connect() bind() 2 process request process request send() sendto() sendto() send() 3 recv() recvfrom21()
  22. Lập trình Winsock (2) n ThưThư việnviện ¨ winsock2.h n KiểuKiểu dữdữ liệuliệu ¨ WSADATA ¨ SOCKADDR_IN ¨ LPSOCKADDR n CácCác giágiá trịtrị hằnghằng sốsố ¨ AF_INET ¨ SOCK_STREAM / SOCK_DGRAM ¨ INVALID_SOCKET ¨ SOCKET_ERROR 22
  23. TCP Client n XácXác địnhđịnh địađịa chỉchỉ IPIP vàvà cổngcổng dịchdịch vụvụ ởở serverserver n TạoTạo mộtmột socketsocket vớivới cổngcổng dịchdịch vụvụ cụccục bộbộ bấtbất kỳkỳ dodo TCPTCP chỉchỉ địnhđịnh n KếtKết nốinối socketsocket đếnđến serverserver n GửiGửi yêuyêu cầucầu vàvà nhậnnhận thôngthông tintin phảnphản hồihồi từtừ serverserver n ĐóngĐóng kếtkết nốinối 23
  24. Lập trình: TCPClient (1) void main() { /* Khai báo biến */ WSADATA wsaData; SOCKADDR_IN rAddr; char buffer[20]; int iRc; /* Nạp thư viện và khởi tạo socket */ iRc = WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sk = socket(AF_INET, SOCK_STREAM, 0); 24
  25. Lập trình: TCPClient (2) /* Kết nối đến Server */ rAddr.sin_family = AF_INET; rAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); rAddr.sin_port = htons(1024); iRc = connect(sk, (LPSOCKADDR)&rAddr, sizeof(rAddr)); /* Nhận và gửi thông điệp */ printf("Message: "); gets(buffer); iRc = send(sk, buffer, strlen(buffer), 0); /* Đóng socket và giải phóng tài nguyên */ closesocket(sk); WSACleanup(); } // end of main function 25
  26. TCP Server n TạoTạo mộtmột socketsocket vàvà gángán chocho socketsocket mộtmột địađịa chỉchỉ cốcố địnhđịnh (IP(IP vàvà port)port) đểđể cungcung cấpcấp dịchdịch vụvụ n ĐặtĐặt socketsocket ởở chếchế độđộ passivepassive n ChấpChấp nhậnnhận yêuyêu cầucầu thiếtthiết lậplập kếtkết nốinối từtừ clientclient vàvà nhậnnhận socketsocket mớimới từtừ hệhệ thốngthống n ThựcThực hiệnhiện quáquá trìnhtrình lặplặp nhậnnhận yêuyêu cầucầu vàvà gửigửi thôngthông tintin phảnphản hồihồi n KhiKhi clientclient kếtkết thúcthúc,, đóngđóng kếtkết nốinối vàvà trởtrở vềvề trạngtrạng tháithái chờchờ chấpchấp nhậnnhận yêuyêu cầucầu thiếtthiết lậplập kếtkết nốinối từtừ cáccác clientclient 26
  27. Lập trình: TCPServer (1) void main() { /* Khai báo biến */ WSADATA wsaData; SOCKADDR_IN serAddr, cliAddr; int iRc; int adsize; char buffer[256]; /* Nạp thư viện và khởi tạo socket */ iRc = WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET ssk = socket(AF_INET, SOCK_STREAM, 0); 27
  28. Lập trình: TCPServer (2) /* Thiết lập cấu trúc địa chỉ cho socket */ serAddr.sin_family = AF_INET; serAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); serAddr.sin_port = htons(1024); /* Gắn địa chỉ cho socket và thực hiện chờ thiết lập kết nối */ iRc = bind(ssk, (LPSOCKADDR)&serAddr, sizeof(serAddr)); iRc = listen(ssk, 5); adsize=sizeof(cliAddr); SOCKET sk = accept(ssk, (LPSOCKADDR)&cliAddr, &adsize); 28
  29. Lập trình: TCPServer (3) /* Nhận dữ liệu từ Client */ iRc = recv(sk, buffer, 256, 0); if (iRc == SOCKET_ERROR) printf("Could not receive data from server.\n"); else { buffer[iRc]=0; printf("Message from client: %s\n", buffer); } /* Đóng socket và giải phóng tài nguyên */ closesocket(sk); closesocket(ssk); WSACleanup(); } // end of main function 29
  30. UDP Client n XácXác địnhđịnh địađịa chỉchỉ IPIP vàvà cổngcổng dịchdịch vụvụ ởở serverserver n TạoTạo mộtmột socketsocket vớivới cổngcổng dịchdịch vụvụ cụccục bộbộ bấtbất kỳkỳ dodo UDPUDP chỉchỉ địnhđịnh n ChỉChỉ địnhđịnh serverserver cầncần giaogiao tiếptiếp n GửiGửi yêuyêu cầucầu vàvà nhậnnhận thôngthông tintin phảnphản hồihồi từtừ serverserver n ĐóngĐóng socketsocket 30
  31. Lập trình: UDPClient (1) void main() { /* Khai báo biến */ WSADATA wsaData; SOCKET sk; WORD _toPort; DWORD _toIP; SOCKADDR_IN _toAddr; int iRc, adsize; char msg[512]; /* Nạp thư viện và khởi tạo socket */ iRc = WSAStartup(MAKEWORD(2, 2), &wsaData); sk = socket(AF_INET, SOCK_DGRAM, 0); 31
  32. Lập trình: UDPClient (2) /* Nhận thông điệp cần gửi */ printf("Message: "); scanf("%s", &msg); /* Gửi dữ liệu đến server */ _toAddr.sin_family = AF_INET; _toAddr.sin_port = htons(_toPort); _toAddr.sin_addr.s_addr = inet_addr(_toIP); iRc = sendto(sk, msg, strlen(msg), 0, (LPSOCKADDR)&_toAddr, sizeof(_toAddr)); 32
  33. Lập trình: UDPClient (3) /* Đóng socket và giải phóng tài nguyên */ closesocket(sk); WSACleanup(); } // end of main function 33
  34. UDP Server n TạoTạo mộtmột socketsocket vàvà gángán chocho socketsocket mộtmột địađịa chỉchỉ cốcố địnhđịnh (IP(IP vàvà port)port) đểđể cungcung cấpcấp dịchdịch vụvụ n ThựcThực hiệnhiện quáquá trìnhtrình lặplặp nhậnnhận yêuyêu cầucầu vàvà gửigửi thôngthông tintin phảnphản hồihồi 34
  35. Lập trình: UDPServer (1) void main() { /* Khai báo biến */ WSADATA wsaData; SOCKET sk; SOCKADDR_IN _locAddr, _frAddr; int iRc, adsize; char msg[512]; /* Nạp thư viện và khởi tạo socket */ iRc = WSAStartup(MAKEWORD(2, 2), &wsaData); sk = socket(AF_INET, SOCK_DGRAM, 0); 35
  36. Lập trình: UDPServer (2) /* Gắn địa chỉ cho socket */ _locAddr.sin_family = AF_INET; _locAddr.sin_port = htons(1024); _locAddr.sin_addr.s_addr = htonl(INADDR_ANY); iRc = bind(sk, (LPSOCKADDR)&_locAddr, sizeof(_locAddr)); /* Nhận dữ liệu từ Client */ adsize = sizeof(_frAddr); iRc = recvfrom(sk, msg, 512, 0, (LPSOCKADDR)&_frAddr, &adsize); 36
  37. Lập trình: UDPServer (3) /* Hiển thị dữ liệu lên màn hình */ if (iRc == SOCKET_ERROR) printf("Could not receive data from server.\n"); else { msg[iRc] = 0; printf("\nMessage from sender: %s\n", msg); } /* Đóng socket và giải phóng tài nguyên */ closesocket(sk); WSACleanup(); } 37
  38. Visual C++ với Winsock (1) IncludeInclude WinsockWinsock header:header: n KhởiKhởi độngđộng VC++VC++ n ChọnChọn NewNew >> WindowsWindows ConsoleConsole ApplicationApplication n ChọnChọn loạiloại ứngứng dụngdụng “Hello“Hello World”World” n ThiếtThiết lậplập vùngvùng cửacửa sổsổ tráitrái sangsang chếchế độđộ FileFile ViewView n TrongTrong mụcmục “Header“Header Files”,Files”, mởmở filefile StdAfx.hStdAfx.h n ThêmThêm dòngdòng #include#include n LưuLưu filefile StdAfx.hStdAfx.h n ThêmThêm dòngdòng #include#include ““StdAfx.hStdAfx.h”” trongtrong tậptập tin chương trình tin chương trình 38
  39. Visual C++ với Winsock (2) LiênLiên kếtkết thưthư việnviện Winsock:Winsock: n ChọnChọn ProjectProject >> SettingsSettings trêntrên menumenu n ChọnChọn tabtab LinkLink n ThêmThêm wsock32.libwsock32.lib vàovào ôô “Object/Library“Object/Library modules”modules” n ĐểĐể xácxác địnhđịnh lỗilỗi trongtrong chươngchương trìnhtrình,, sửsử dụngdụng hàmhàm WSAGetLastErrorWSAGetLastError ()() ¨ Ví dụ: với lỗi 10037, sử dụng lệnh: n net helpmsg 10037 39
  40. Tổng kết n Socket và bộ giao thức TCP/IP n Lập trình Winsock: cấu trúc chương trình, thư viện sử dụng, IDE n Viết các chương trình ứng dụng sử dụng socket, với hai giao thức TCP và UDP 40