intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình mạng trong NET FRAMEWORK - Chương 3

Chia sẻ: Nguyen Nhi | Ngày: | Loại File: PDF | Số trang:39

109
lượt xem
22
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tài liệu tham khảo giáo trình Lập trình mạng trong NET FRAMEWORK - Chương 3 Xây dựng ứng dụng mạng dành cho sinh viên khoa công nghệ thông tin

Chủ đề:
Lưu

Nội dung Text: Lập trình mạng trong NET FRAMEWORK - Chương 3

  1. CHƯƠNG 3: XÂY D NG NG D NG M NG 3.1. Giao th c ICMP Gi i thi u giao th c ICMP (Internetwork Control Message Protocol) - Giao th c ICMP ho t ñ ng trên layer 2 - Internetwork trong mô hình TCP/IP ho c layer 3 - Network trong mô hình OSI Cho phép ki m tra và xác ñ nh l i c a Layer 3 Internetwork trong mô hình TCP/IP b ng cách ñ nh nghĩa ra các lo i thông ñi p có th s d ng ñ xác ñ nh xem m ng hi n t i có th truy n ñư c gói tin hay không. Trong th c t , ICMP c n các thành ph n c a m i gói tin IP ñ có th ho t ñ ng ñư c. C u trúc c a gói tin IP và ICMP + Type: có th là m t query hay m t l i + Code: Xác ñ nh ñây là lo i query hay thông ñi p l i + Checksum: Ki m tra và s a l i cho d li u ICMP + Message: Tuỳ thu c vào Type và Code 3.1.1. S d ng Raw Socket Gói tin ICMP không s d ng TCP ho c UDP nên chúng ta không th s d ng các l p ñư c h tr như TcpClient hay UdpClient mà ph i s d ng m t Raw Socket Mu n t o Raw Socket khi t o ra Socket b n s d ng SocketType.Raw, giao th c ICMP T o Raw Socket như sau Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); Raw Socket Format Value Description Ggp Gateway-to-Gateway Protocol Icmp Internet Control Message Protocol 55
  2. Idp IDP Protocol Igmp Internet Group Management Protocol IP A raw IP packet Ipx Novell IPX Protocol ND Net Disk Protocol Pup Xerox PARC Universal Protocol (PUP) Raw A raw IP packet Spx Novell SPX Protocol SpxII Novell SPX Version 2 Protocol Unknown An unknown protocol Unspecified An unspecified protocol G i gói d li u Raw ICMP là giao th c không hư ng k t n i S d ng phương th c SendTo() c a l p Socket ñ g i C ng trong giao th c ICMP không quan tr ng IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 0); sock.SendTo(packet, iep); Nh n gói d li u Raw S d ng phương th c ReceiveForm c a l p Socket D li u nh n v là m t gói tin IP chúng ta ph i tách ra ñ l y gói tin ICMP Raw Socket không t ñ ng ñ nh d ng gói tin ICMP cho chúng ta. Chúng ta ph i t làm Data Variable Size Type Type 1 byte Byte Code 1 byte Byte Checksum 2 bytes Unsigned 16-bit integer Message multibyte Byte array ð nh nghĩa l p và phương th c kh i t o m c ñ nh class ICMP { public byte Type; public byte Code; public UInt16 Checksum; public int Messagesize; public byte[] Message = new byte[1024]; public ICMP() { } } T o ra gói tin ICMP ICMP packet = new ICMP(); 56
  3. packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; public ICMP(byte[] data, int size) { Type = data[20]; Code = data[21]; Checksum = BitConverter.ToUInt16(data, 22); MessageSize = size - 24; Buffer.BlockCopy(data, 24, Message, 0, MessageSize); } public byte[] getBytes() { byte[] data = new byte[MessageSize + 9]; Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1); Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1); Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2); Buffer.BlockCopy(Message, 0, data, 4, MessageSize); return data; } public UInt16 getChecksum() { UInt32 chcksm = 0; byte[] data = getBytes(); int packetsize = MessageSize + 8; int index = 0; while (index < packetsize) { chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index)); index += 2; } chcksm = (chcksm >> 16) + (chcksm & 0xffff); chcksm += (chcksm >> 16); return (UInt16)(~chcksm); } 3.1.2. S d ng giao th c ICMP và Raw Socket ñ xây d ng chương trình Ping 57
  4. class Program { static void Main(string[] args) { byte[] data = new byte[1024]; int recv; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(argv[0]), 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("test packet"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getChecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); } catch (SocketException) { Console.WriteLine("No response from remote host"); return; } ICMP response = new ICMP(data, recv); Console.WriteLine("response from: {0}", ep.ToString()); Console.WriteLine(" Type {0}", response.Type); Console.WriteLine(" Code: {0}", response.Code); int Identifier = BitConverter.ToInt16(response.Message, 0); 58
  5. int Sequence = BitConverter.ToInt16(response.Message, 2); Console.WriteLine(" Identifier: {0}", Identifier); Console.WriteLine(" Sequence: {0}", Sequence); string stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4); Console.WriteLine(" data: {0}", stringData); host.Close(); } } 3.1.3. S d ng giao th c ICMP và Raw Socket ñ xây d ng chương trình TraceRoute class TraceRoute { public static void Main(string[] argv) { byte[] data = new byte[1024]; int recv, timestart, timestop; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPHostEntry iphe = Dns.Resolve(argv[0]); IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("test packet"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getCchecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); int badcount = 0; for (int i = 1; i < 50; i++) { host.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, i); timestart = Environment.TickCount; host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); timestop = Environment.TickCount; ICMP response = new ICMP(data, recv); if (response.Type == 11) Console.WriteLine("hop {0}: response from {1}, {2}ms", i, ep.ToString(), timestop - timestart); if (response.Type == 0) { Console.WriteLine("{0} reached in {1} hops, {2}ms.", ep.ToString(), i, timestop - timestart); break; 59
  6. } badcount = 0; } catch (SocketException) { Console.WriteLine("hop {0}: No response from remote host", i); badcount++; if (badcount == 5) { Console.WriteLine("Unable to contact remote host"); break; } } } host.Close(); } } 3.2. Giao th c SMTP, POP3 3.2.1. Cơ b n v h th ng Mail và giao th c SMTP, POP3 60
  7. * Giao th c SMTP M t s l nh cơ b n c a giao th c SMTP: L nh Mô t HELO Hello. S d ng ñ xác ñ nh ngư i g i ñi n. L nh này này ñi kèm v i tên c a host g i ñi n. Trong ESTMP (extended protocol), thì l nh này s là EHLO. MAIL Kh i t o m t giao d ch g i thư. Nó k t h p "from" ñ xác ñ nh ngư i g i thư. RCPT Xác ñ nh ngư i nh n thư. DATA Thông báo b t ñ u n i dung th c s c a b c ñi n (ph n thân c a thư). D li u ñư c mã thành d ng mã 128-bit ASCII và nó ñư c k t thúc v i m t dòng ñơn ch a d u ch m (.). RSET Hu b giao d ch thư VRFY S d ng ñ xác th c ngư i nh n thư. NOOP Nó là l nh "no operation" xác ñ nh không th c hi n hành ñ ng gì QUIT Thoát kh i ti n trình ñ k t thúc SEND Cho host nh n bi t r ng thư còn ph i g i ñ n ñ u cu i khác. M t s l nh không yêu c u ph i có ñư c xác ñ nh b ng RFC 821 SOML Send or mail. Báo v i host nh n thư r ng thư ph i g i ñ n ñ u cu i khác ho c h p thư. SAML Send and mail. Nói v i host nh n r ng b c ñi n ph i g i t i ngư i dùng ñ u cu i và h p thư. EXPN S d ng m r ng cho m t mailing list. HELP Yêu c u thông tin giúp ñ t ñ u nh n thư. TURN Yêu c u ñ host nh n gi vai trò là host g i thư. - Mã tr ng thái c a SMTP Khi m t MTA g i m t l nh SMTP t i MTA nh n thì MTA nh n s tr l i v i m t mã tr ng thái ñ cho ngư i g i bi t ñang có vi c gì x y ra ñ u nh n. Và dư i ñây là b ng mã tr ng thái c a SMTP theo tiêu chu n RFC 821. M c ñ c a tr ng thái ñư c 61
  8. xác ñ nh b i s ñ u tiên c a mã (5xx là l i n ng, 4xx là l i t m th i, 1xx–3xx là ho t ñ ng bình thư ng). - M t s mã tr ng thái c a SMTP 211 Tình tr ng h th ng, hay reply giúp ñ h th ng 214 Thông ñi p giúp ñ . 220 d ch v s n sàng 221 d ch v ñóng kênh giao chuy n 250 Hành ñ ng mail yêu c u OK, hoàn thành 251 User không c c b ; s hư ng ñ n 354 Kh i ñ ng vi c nh p mail; k t thúc v i . 421 d ch v không s d ng ñư c, ñóng kênh giao chuy n 450 Không l y hành ñ ng mail yêu c u; mailbox không hi u l c 451 Không nh n hành ñ ng ñư c yêu c u; lưu tr c a h th ng không ñ . 500 L i cú pháp; không ch p nh n l nh 501 L i cú pháp trong tham s hay ñ i s 502 L nh không ñư c cung c p 503 Dòng l nh sai 504 Tham s c a dòng l nh không ñư c cung c p 550 Không nh n hành ñ ng ñư c yêu c u ; mailbox không hi u l c [như mailbox không tìm th y hay không truy c p ñư c] 551 User không c c b ; vui lòng th 552 B qua hành ñ ng mà mail yêu c u, vư t quá ch ñ nh lưu tr 554 Không nh n hành ñ ng ñư c yêu c u; tên mailbox không ñư c ch p nh n. [như sai cú pháp mailbox] giao chuy n sai. - ð nh d ng c a m t b c thư thông thư ng không có ph n ñính kèm như sau: * Giao th c POP3 Giao th c dùng ñ l y thư, POP3 Server l ng nghe trên c ng 110, mô t trong RFC 1939 62
  9. - M t s l nh c a POP3 USER Xác ñ nh username PASS Xác ñ nh password STAT Yêu c u v tr ng thái c a h p thư như s lư ng thư và ñ l n c a thư LIST Hi n danh sách c a thư RETR Nh n thư DELE Xoá m t b c thư xác ñ nh NOOP Không làm gì c RSET Khôi ph c l i như thư ñã xoá (rollback) QUIT Th c hi n vi c thay ñ i và thoát ra 3.2.2. Cài ñ t SMTP, POP3 Client/Server Vi t chương trình g i Mail ñơn gi n theo giao th c SMTP using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; class Program { static void Main(string[] args) { string nguoigui, nguoinhan, tieude,body; string diachimaychu; int portmaychu; Console.Write("Nhap di chu SMTP Server:"); diachimaychu = Console.ReadLine(); Console.Write("Nhap cong cua may chu:"); portmaychu = int.Parse(Console.ReadLine()); Console.Write("Nhap dia chi nguoi gui:"); nguoigui = Console.ReadLine(); Console.Write("Nhap dia chi nguoi nhan:"); nguoinhan = Console.ReadLine(); Console.Write("Nhap tieu de buc thu:"); tieude = Console.ReadLine(); Console.Write("Nhap noi dung buc thu:"); body= Console.ReadLine(); //Tao Endpoit cua may chu IPEndPoint iep = new IPEndPoint(IPAddress.Parse(diachimaychu), portmaychu); TcpClient client = new TcpClient(); client.Connect(iep); string Data = "Helo"; StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); 63
  10. //Gui dia chi nguyoi gui Data = "MAIL FROM: "; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Gui dia chi nguyoi gui Data = "RCPT TO: "; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Bat dau gui noi dung buc thu Data = "Data"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Gui noi dung buc thu Data = "SUBJECT:" + tieude + "\r\n" + body + "\r\n" + "." + "\r\n"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); //Ngat ket noi Data = "QUIT"; sw.WriteLine(Data); sw.Flush(); //Doc thong bao tu Server gui ve va xu ly neu can thiet Console.WriteLine(sr.ReadLine()); sr.Close(); sw.Close(); client.Close(); Console.ReadLine(); } } 64
  11. Vi t chương trình l y thư ñơn gi n theo giao th c POP3 using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.IO; using System.Net; using System.Net.Sockets; namespace MyPop3 { public partial class Form1 : Form { TcpClient popclient; StreamReader sr; StreamWriter sw; public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; 65
  12. } private void btLogin_Click(object sender, EventArgs e) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txtPOP.Text), int.Parse(txtPort.Text)); popclient = new TcpClient(); popclient.Connect(iep); sr = new StreamReader(popclient.GetStream()); sw = new StreamWriter(popclient.GetStream()); sr.ReadLine(); string data = ""; data = "User " + txtUser.Text; sw.WriteLine(data); sw.Flush(); sr.ReadLine(); data = "PASS " + txtPass.Text; sw.WriteLine(data); sw.Flush(); sr.ReadLine(); data = "LIST"; sw.WriteLine(data); sw.Flush(); lstHeader.Items.Clear(); string s = sr.ReadLine(); char[] ch = { ' ' }; string[] tam = s.Split(ch); //MessageBox.Show("so buc thu la:" + tam[1]); while ((s = sr.ReadLine()) != ".") { lstHeader.Items.Add(s); } } private void lstHeader_SelectedIndexChanged(object sender, EventArgs e) { int i = lstHeader.SelectedIndex + 1; //Lay buc thu ve va tien hanh phan tich string data = "RETR " + i.ToString(); sw.WriteLine(data); sw.Flush(); string s; //MessageBox.Show(sr.ReadLine()); //Lay phan header while ((s = sr.ReadLine().Trim()) != null) { //MessageBox.Show(s); if (s.Length == 0) break; if (s.ToUpper().StartsWith("DATE")) { DateTime dt=DateTime.Parse(s.Substring(5, s.Length - 5)); txtDate.Text = dt.ToShortDateString() +" " +dt.ToLongTimeString(); } if (s.ToUpper().StartsWith("FROM")) 66
  13. txtFrom.Text = s.Substring(5, s.Length - 5); if (s.ToUpper().StartsWith("TO")) txtTo.Text = s.Substring(3, s.Length - 3); if (s.ToUpper().StartsWith("SUBJECT")) txtSubject.Text = s.Substring(8, s.Length - 8); } //Lay phan body textBox4.Clear(); //MessageBox.Show("Lay body"); while (!sr.EndOfStream) { s = sr.ReadLine().Trim(); if (s.Equals(".")) break; textBox4.Text += s + "\r\n"; } //MessageBox.Show("Het noi dung buc thu"); } } } 3.3. Giao th c HTTP 3.3.1. Cơ b n v giao th c HTTP HTTP (Hypertext Transfer Protocol) giao th c truy n siêu văn b n. HTTP là giao th c t ng ng d ng cho Web. Nó ho t ñ ng theo mô hình client/server. - Client: browser yêu c u, nh n, hi n th các ñ i tư ng Web. - Server: Web server g i các ñ i tư ng Hai phiên b n c a giao th c HTTP hi n ñư c ph bi n là HTTP1.0 ñư c ñ c t trong RFC 1945 và HTTP1.1 ñư c ñ c t trong RFC 2068. HTTP là giao th c “không tr ng thái” server không lưu l i các yêu c u c a client. HTTP s d ng giao th c TCP c a t ng giao v n. Các bư c ti n hành t khi client k t n i t i server sau ñó g i và nh n k t qu t server g i v như sau: 67
  14. + client kh i t o k t n i TCP (t o socket) v i server, qua c ng 80 + server ch p nh n k t n i TCP t client + Các thông ñi p HTTP (thông ñi p t ng ng d ng) ñư c trao ñ i gi a browser (HTTP client) và Web server (HTTP server) + ðóng k t n i TCP. Chúng ta xem m t ví d v quá trình trao ñ i gi a browser và Web server như sau: (bao g m text, User nh p URL tham chi u t i 10 www.someSchool.edu/someDepartment/home.index nh d ng jpeg) 1a. HTTP client kh i t o k t n i TCP t i HTTP server (ti n 1b. HTTP server ñi ch trình)t i ñ a ch www.someSchool.edu ñ i www.someSchool.edu. C ng k t n i TCP c ng 80, ch p m c ñ nh là 80. nh n k t n i, thông báo l i cho client. 2. HTTP client g i thông ñi p yêu c u HTTP (bao g m URL) 3. HTTP server nh n thông ñi p yêu vào trong TCP connection c u,l y các ñ i tý ng ñý c yêu c u socket g i vào trong thông ñi p tr l i, (someDepartment/home.index) g i thông ñi p vào socket 4. HTTP server ñóng k t n i TCP. 5. HTTP client nh n thông ñi p tr l i bao g m t p html, hi n th html.Phân tích t p html file, tìm 10 jpeg ñ i tý ng ñý c tham chi u time 6. Các bư c t 1 ñ n 5 ñư c l p l i cho t ng ñ i tư ng trong 10 ñ i tư ng jpeg Có hai ki u thông ñi p HTTP là yêu c u (Request) và tr l i (Response). Các thông ñi p ñư c ñ nh d ng ki u mã ASCII. ð nh d ng thông ñi p yêu c u HTTP 68
  15. Dòng yêu c u (l nh GET, POST, GET /somedir/page.html HTTP/1.0 HEAD) User-agent: Mozilla/4.0 Accept: text/html, image/gif,image/jpeg Nh ng dòng header Accept-language:fr (CR,LF) CR,LF,kí hi u k t thúc thông ñi p ð nh d ng thông ñi p tr l i HTTP Dòng tr ng thái (mã tr ng thái) HTTP/1.0 200 OK Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998 …... Nh ng dòng header Content-Length: 6821 Content-Type: text/html data data data data data ... d li u,e.g., t p html ñý c yêu c u 69
  16. Quá trình trao ñ i gi a Browser và Web Server có th ñư c minh h a như hình sau: Mã tr ng thái trong thông ñi p HTTP Response: ðư c ghi dòng ñ u tiên trong thông ñi p response t server v client. M t s mã thư ng g p: 200 OK Yêu c u thành công,các ñ i tư ng ñư c yêu c u ph n sau thông ñi p. 301 Moved Permanently ð i tư ng ñư c yêu c u ñã ñư c chuy n và ñ a ch m i c a ñ i tư ng ñư c ñ t trong trư ng Location: 400 Bad Request Server không hi u ñư c thông ñi p yêu c u 404 Not Found Tài li u ñư c yêu c u không có trong server 505 HTTP Version Not Supported Server không h tr version c a giao th c HTTP. - ð ki m tra các l nh c a HTTP bên phía Client chúng ta có th th c hi n như sau: + Telnet t i Web server 70
  17. T o k t n i TCP c ng 80 telnet www.eurecom.fr 80 (c ng m c ñ nh cho HTTP server) at www.eurecom.fr. + L nh GET trong thông ñi p HTTP G i thông ñi p yêu c u l y t p GET /~ross/index.html HTTP/1.0 Index.html trong thư m c ~ross v client + Xem thông ñi p response ñư c g i v t Server - Gõ các l nh khác ñ ki m tra. 3.3.2. Cài ñ t HTTP Client/Server a. Chương trình HTTP Client using System; using System.IO; using System.Net.Sockets; using System.Windows.Forms; namespace HttpView { public partial class MainForm : Form { [STAThread] public static void Main(string[] args){ Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } public MainForm(){ // // The InitializeComponent() call is required for Windows Forms designer support. // InitializeComponent(); // // TODO: Add constructor code after the InitializeComponent() call. // } // G i yêu c u và nh n v ph n h i t web server void BtGoClick(object sender, EventArgs e){ //Thêm ti n t http:// n u không có if (txtAddress.Text.StartsWith("http://", StringComparison.OrdinalIgnoreCase) == false) txtAddress.Text = "http://" + txtAddress.Text; TcpClient client = new TcpClient(); try{ client.Connect(GetHost(txtAddress.Text), GetPort(txtAddress.Text)); } catch{ 71
  18. rtfBody.Text = "Không th k t n i ñ n server"; return; } StreamWriter OutStream = new StreamWriter(client.GetStream()); StreamReader InpStream = new StreamReader(client.GetStream()); // G i ñi yêu c u b ng phương th c GET OutStream.WriteLine("GET " + txtAddress.Text + " HTTP/1.0"); OutStream.WriteLine("Content-Type:text/html"); OutStream.WriteLine("Content-Language:en"); OutStream.WriteLine(); OutStream.Flush(); //L y ph n Header rtfHeader.Text = ""; string s; while (null != (s = InpStream.ReadLine())){ if (s.Equals("")) break; rtfHeader.Text += s; } //L y ph n Body rtfBody.Text = ""; int c; while (true){ c = InpStream.Read(); if (c == -1) break; rtfBody.Text += (char)c; } client.Close(); } // Khi gõ Enter thì g i ñi yêu c u void TxtAddressKeyPress(object sender, KeyPressEventArgs e){ if ((int)e.KeyChar == 13) btGo.PerformClick(); } // L y v tên máy trong URL internal string GetHost(string url){ url = url.ToLower(); Uri tmp = new Uri(url); return tmp.Host; } // L y v s hi u c ng trong URL internal int GetPort(string url){ Uri tmp = new Uri(url); return tmp.Port; } } } b. Chương trình HTTP Server using System; using System.IO; 72
  19. using System.Net; using System.Net.Sockets; public class SimpleWebServer { public void StartListening(int port) { IPEndPoint LocalEndPoint = new IPEndPoint(IPAddress.Any, 8080); TcpListener server = new TcpListener(LocalEndPoint); server.Start(); while (true) { TcpClient client = server.AcceptTcpClient(); // Cho doi ket noi processClientRequest(client); } } //X lý yêu c u c a m i máy khách private void processClientRequest(TcpClient client) { Console.WriteLine("May khach su dung cong: " + (client.Client.RemoteEndPoint as IPEndPoint).Port + "; Dia chi IP may khach: " + client.Client.RemoteEndPoint.ToString() + "\n"); Console.WriteLine("Yeu cau: "); readRequest(client); sendResponse(client); client.Close(); } //ð c ph n header c a gói d li u g i t máy khách private void readRequest(TcpClient client) { StreamReader request = new StreamReader(client.GetStream()); String nextLine; while (null != (nextLine = request.ReadLine())) { if (nextLine.Equals("")) { break; } else { Console.WriteLine(nextLine); } } Console.WriteLine("---------------------------------------"); } //Ph n h i yêu c u cho máy khách private void sendResponse(TcpClient client) { StreamWriter response = new StreamWriter(client.GetStream()); response.Write(_mainPage); response.Flush(); } //M i ph n h i v trình duy t private const String _mainPage = "HTTP/1.0 200 OK\n" + 73
  20. "Content-type: text/html\n" + "Connection: close\n" + "\n\n" + "\n" + "Hello World\n" + "\n" + " Hello World \n" + " \n\n"; } class TestWebServer { public static void Main(String[] args) { SimpleWebServer webServer1 = new SimpleWebServer(); webServer1.StartListening(8080); } } 3.4. Giao th c FTP 3.4.1. Cơ b n v giao th c FTP Giao th c FTP là m t giao th c trao ñ i file khá ph bi n Khái ni m và ho t ñ ng cơ b n c a FTP: Nh ng ngư i phát tri n giao th c FTP c n ph i cân b ng nhu c u gi a vi c phát tri n m t b giao th c v a có nhi u ch c năng và v a ñơn gi n trong tri n khai. Do ñó, FTP không ñơn gi n như “ñ a em trai” c a nó – là giao th c TFTP. Ho t ñ ng c a giao th c này có th chia ra thành nhi u thành ph n nh , ho t ñ ng cùng nhau ñ th c hi n các công vi c như kh i t o k t n i, truy n thông tin ñi u khi n và truy n l nh. N i dung mà bài vi t này hư ng t i là ñưa t i ngư i ñ c nh ng khái ni m quan tr ng nh t ñ ng sau giao th c FTP, cũng như gi i thích t ng quan v nguyên lý ho t ñ ng c a nó. 1 - Mô hình ho t ñ ng c a FTP, các thành ph n trong giao th c, và các thu t ng cơ b n Giao th c FTP ñư c mô t m t cách ñơn gi n thông qua mô hình ho t ñ ng c a FTP. Mô hình này ch ra các nguyên t c mà m t thi t b ph i tuân theo khi tham gia vào quá trình trao ñ i file, cũng như v hai kênh thông tin c n ph i thi t l p gi a các thi t b ñó. Nó cũng mô t các thành ph n c a FTP ñư c dùng ñ qu n lý các kênh này c hai phía – truy n và nh n. Do ñó, mô hình này t o cho ta m t kh i ñi m lý tư ng ñ xem xét ho t ñ ng c a FTP m c khái quát. Ti n trình Server-FTP và User-FTP 74
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2