Danh mục

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

Số trang: 39      Loại file: pdf      Dung lượng: 887.71 KB      Lượt xem: 11      Lượt tải: 0    
Hoai.2512

Xem trước 4 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

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
Nội dung trích xuất từ tài liệu:
Lập trình mạng trong NET FRAMEWORK - Chương 3 CHƯƠNG 3: XÂY D NG NG D NG M NG3.1. Giao th c ICMPGi 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 clayer 3 - Network trong mô hình OSICho phép ki m tra và xác ñ nh l i c a Layer 3 Internetwork trong mô hình TCP/IPb 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 nt 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à Code3.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 cICMPT 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 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 ICMPRaw Socket không t ñ ng ñ nh d ng gói tin ICMP cho chúng ta. Chúng ta ph i t làmData Variable Size TypeType 1 byte ByteCode 1 byte ByteChecksum 2 bytes Unsigned 16-bit integerMessage multibyte Byte arrayð nh nghĩa l p và phương th c kh i t o m c ñ nhclass 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 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 57class 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}, res ...

Tài liệu được xem nhiều: