已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Socket编程基础本章以Berkeley Socket为主,主要介绍网络编程时常用的调用和程序使用它们的方法及基本结构。网络编程有两种主要的编程接口,一种是Berkeley UNIX(BSD UNIX)的socket编程接口,另一种是AT&T的TLI接口(用于UNIXSYSV)。1 、TCP/IP 基础知识 这里先假定读者对ISO的OSI七层模型已有了一定的了解,下面我们来看看TCP/IP模型。ISO的OSI对服务、接口和协议的概念区别十分明了,但它却没有真正的用户群。TCP/IP模型对服务、接口和协议的概念区别不象OSI模型那样明晰,但很实用。TCP/IP模型分为四层,对应于OSI七层模型如下图所示:图6-1 TCP/IP参考模型与OSI模型的近似对应关系在TCP/IP模型中,互联网层是基于无连接互联网络层的分组交换网络。在这一层中主机可以把报文(Packet)发往任何网络,报文独立地传向目标。互联网层定义了报文的格式和协议,这就是IP协议族(Internet Protocol)。互联网层的功能是将报文发送到目的地,主要的设计问题是报文路由和避免阻塞。互联网层上面是传输层,该层的主要功能和OSI模型的该层一样,主要使源和目的主机之间可以进行会话。该层定义了两个端到端的协议,一个是面向连接的传输控制协议TCP,另一个是无连接的用户数据报协议UDP。TCP/IP协议模型中没有会话层和表示层。传输层之上是应用层,它包含所有的高层协议,如远程虚拟终端协议TELNET、文件传输协议FTP、简单邮件传输协议SMTP等。这些高层协议中常见的如TELNET协议,用来允许用户远程登录到另一台UNIX机器;FTP协议用来传输文件,常见的有WU-FTP(Washington University的FTP服务器端程序,是一个免费程序);SMTP协议用来传送email,常见的服务器端程序有netscape等公司制作的程序,也有免费使用的sendmail程序;还有域名系统服务DNS协议,新闻组传送协议NNTP,用于WWW的超文本传输协议HTTP等。主机到网络这一层,在TCP/IP模型中没有详细定义,这里不作介绍。2、 Socket一般描述 由于越来越多的计算机厂商,特别是工作站制造商如Sun等公司采用了Berkeley UNIX,socket接口被广泛采用,以至于现在,socket接口被广泛认可并成为了事实上的工业标准。目前的SYSV、BSD、OSF都将socket接口作为系统的一部分。当时设计如何支持TCP/IP协议时,有两种加入函数的方法,一种是直接加入支持TCP/IP协议的调用,另一种是加入支持一般网络协议的函数,而用参数来指定支持TCP/IP协议。Berkeley采用了后者,这样可以支持多协议族,TCP/IP是协议族之一(PF_INET)。2.1 socket 描述符 前面已经提到过,在UNIX中,进程要对文件进行操作,一般使用open调用打开一个文件进行访问,每个进程都有一个文件描述符表,该表中存放打开的文件描述符。用户使用open等调用得到的文件描述符其实是文件描述符在该表中的索引号,该表项的内容是一个指向文件表的指针。应用程序只要使用该描述符就可以对指定文件进行操作。同样,socket接口增加了网络通信操作的抽象定义,与文件操作一样,每个打开的socket都对应一个整数,我们称它为socket描述符,该整数也是socket描述符在文件描述符表中的索引值。但socket描述符在描述符表中的表项并不指向文件表,而是指向一个与该socket有关的数据结构。BSD UNIX中新增加了一个socket调用,应用程序可以调用它来新建一个socket描述符,注意进程用open只能产生文件描述符,而不能产生socket描述符。socket调用只能完成建立通信的部分工作,一旦建立了一个socket,应用程序可以使用其他特定的调用来为它添加其他详细信息,以完成建立通信的过程。 2.2 从概念上理解socket的使用网络编程中最常见的是客户/服务器模式。以该模式编程时,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。客户端在需要的时刻发出向服务端的连接请求。这里为了便于理解,提到了这些调用及其大致的功能。使用socket调用后,仅产生了一个可以使用的socket描述符,这时还不能进行通信,还要使用其他的调用,以使得socket所指的结构中使用的信息被填写完。在使用TCP协议时,一般服务端进程先使用socket调用得到一个描述符,然后使用bind调用将一个名字与socket描述符连接起来,对于Internet域就是将Internet地址联编到socket。之后,服务端使用listen调用指出等待服务请求队列的长度。然后就可以使用accept调用等待客户端发起连接(一般是阻塞等待连接,后面章节会讲到非阻塞的方式),一旦有客户端发出连接,accept返回客户的地址信息,并返回一个新的socket描述符,该描述符与原先的socket有相同的特性,这时服务端就可以使用这个新的socket进行读写操作了。一般服务端可能在accept返回后创建一个新的进程进行与客户的通信,父进程则再到accept调用处等待另一个连接。客户端进程一般先使用socket调用得到一个socket描述符,然后使用connect向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过socket描述符进行读写操作了。下面是在客户和服务端使用TCP时,客户进程和服务进程使用系统调用的该程。使用TCP的客户和服务端使用系统调用的图示使用无连接的UDP协议时,服务端进程创建一个socket,之后调用recvfrom接收客户端的数据报,然后调用sendto将要返回客户端的消息发送给客户进程。客户端也要先创建一个socket,再使用sendto向服务端进程发出请求,使用recvfrom得到返回的消息。c#中tcp/ip 编程中服务器端如何获得客户端的IP在server端的侦听线程代码如下:stringLocalPcName=Dns.GetHostName();PAddressipAddress=Dns.Resolve(LocalPcName).AddressList0;Listener=newTcpListener(ipAddress,Port);Listener.Start();SOCKETClientSocket=Listener.AcceptSocket();在得到client发出的connect后,如何获得client的ip地址?回复:c#中tcp/ip编程中服务器端如何获得客户端的IP在socket類中有一個屬性是RemoteEndPoint,就是取得遠端的Point,你如果用tcpListener連的話,可以先使用tcpListener中的Server方法取得socket,再做。C# 2.0 套接字编程实例 UDP TCP通信2007-08-20 14:17C# .net2.0 套接字编程实例 UDP TCP通信 首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和格式进行数据传输。客户端在需要的时刻发出向服务端的连接请求。这里为了便于理解,提到了一些调用及其大致的功能。使用socket调用后,仅产生了一个可以使用的socket描述符,这时还不能进行通信,还要使用其他的调用,以使得socket所指的结构中使用的信息被填写完。在使用TCP协议时,一般服务端进程先使用socket调用得到一个描述符,然后使用bind调用将一个名字与socket描述符连接起来,对于Internet域就是将Internet地址联编到socket。之后,服务端使用listen调用指出等待服务请求队列的长度。然后就可以使用accept调用等待客户端发起连接,一般是阻塞等待连接,一旦有客户端发出连接,accept返回客户的地址信息,并返回一个新的socket描述符,该描述符与原先的socket有相同的特性,这时服务端就可以使用这个新的socket进行读写操作了。一般服务端可能在accept返回后创建一个新的进程进行与客户的通信,父进程则再到accept调用处等待另一个连接。客户端进程一般先使用socket调用得到一个socket描述符,然后使用connect向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过socket描述符进行读写操作了。.NetFrameWork为Socket通讯提供了System.Net.Socket命名空间,在这个命名空间里面有以下几个常用的重要类分别是:Socket类这个低层的类用于管理连接,WebRequest,TcpClient和UdpClient在内部使用这个类。NetworkStream类这个类是从Stream派生出来的,它表示来自网络的数据流TcpClient类允许创建和使用TCP连接TcpListener类允许监听传入的TCP连接请求UdpClient类用于UDP客户创建连接(UDP是另外一种TCP协议,但没有得到广泛的使用,主要用于本地网络)下面我们来看一个基于Socket的双机通信代码的C#版本首先创建Socket对象的实例,这可以通过Socket类的构造方法来实现:public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType); 其中,addressFamily 参数指定 Socket 使用的寻址方案,socketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。下面的示例语句创建一个 Socket,它可用于在基于 TCP/IP 的网络(如 Internet)上通讯。Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 若要使用 UDP 而不是 TCP,需要更改协议类型,如下面的示例所示:Socket temp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 一旦创建 Socket,在客户端,你将可以通过Connect方法连接到指定的服务器(你可以在Connect方法前Bind端口,就是以指定的端口发起连接,如果不事先Bind端口号的话,系统会默认在1024到5000随机绑定一个端口号),并通过Send方法向远程服务器发送数据,而后可以通过Receive从服务端接收数据;而在服务器端,你需要使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联,并通过Listen方法侦听该接口上的请求,当侦听到用户端的连接时,调用Accept完成连接的操作,创建新的Socket以处理传入的连接请求。使用完 Socket 后,使用 Close 方法关闭 Socket。可以看出,以上许多方法包含EndPoint类型的参数,在Internet中,TCP/IP 使用一个网络地址和一个服务端口号来唯一标识设备。网络地址标识网络上的特定设备;端口号标识要连接到的该设备上的特定服务。网络地址和服务端口的组合称为终结点,在 .NET 框架中正是由 EndPoint 类表示这个终结点,它提供表示网络资源或服务的抽象,用以标志网络地址等信息。.Net同时也为每个受支持的地址族定义了 EndPoint 的子代;对于 IP 地址族,该类为 IPEndPoint。IPEndPoint 类包含应用程序连接到主机上的服务所需的主机和端口信息,通过组合服务的主机IP地址和端口号,IPEndPoint 类形成到服务的连接点。用到IPEndPoint类的时候就不可避免地涉及到计算机IP地址,System.Net命名空间中有两种类可以得到IP地址实例:IPAddress类:IPAddress 类包含计算机在 IP 网络上的地址。其Parse方法可将 IP 地址字符串转换为 IPAddress 实例。下面的语句创建一个 IPAddress 实例:IPAddress myIP = IPAddress.Parse(); 需要知道的是:Socket 类支持两种基本模式:同步和异步。其区别在于:在同步模式中,按块传输,对执行网络操作的函数(如 Send 和 Receive)的调用一直等到所有内容传送操作完成后才将控制返回给调用程序。在异步模式中,是按位传输,需要指定发送的开始和结束。同步模式是最常用的模式,我们这里的例子也是使用同步模式。下面看一个完整的例子,client向server发送一段测试字符串,server接收并显示出来,给予client成功响应。/client端using System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets;namespace socketsampleclass Class1static void Main()tryint port = 2000;string host = ;IPAddress ip = IPAddress.Parse(host);IPEndPoint ipe = new IPEndPoint(ip, port);/把ip和端口转化为IPEndPoint实例Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建一个SocketConsole.WriteLine(Conneting.);c.Connect(ipe);/连接到服务器string sendStr = hello!This is a socket test;byte bs = Encoding.ASCII.GetBytes(sendStr);Console.WriteLine(Send Message);c.Send(bs, bs.Length, 0);/发送测试信息string recvStr = ;byte recvBytes = new byte1024;int bytes;bytes = c.Receive(recvBytes, recvBytes.Length, 0);/从服务器端接受返回信息recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);Console.WriteLine(Client Get Message:0, recvStr);/显示服务器返回信息c.Close();catch (ArgumentNullException e)Console.WriteLine(ArgumentNullException: 0, e);catch (SocketException e)Console.WriteLine(SocketException: 0, e);Console.WriteLine(Press Enter to Exit);Console.ReadLine();/server端using System;using System.Text;using System.IO;using System.Net;using System.Net.Sockets;namespace Project1class Class2static void Main()tryint port = 2000;string host = ;IPAddress ip = IPAddress.Parse(host);IPEndPoint ipe = new IPEndPoint(ip, port);Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建一个Socket类s.Bind(ipe);/绑定2000端口s.Listen(0);/开始监听Console.WriteLine(Wait for connect);Socket temp = s.Accept();/为新建连接创建新的Socket。Console.WriteLine(Get a connect);string recvStr = ;byte recvBytes = new byte1024;int bytes;bytes = temp.Receive(recvBytes, recvBytes.Length, 0);/从客户端接受信息recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);Console.WriteLine(Server Get Message:0,recvStr);/把客户端传来的信息显示出来string sendStr = Ok!Client Send Message Sucessful!;byte bs = Encoding.ASCII.GetBytes(sendStr);temp.Send(bs, bs.Length, 0);/返回客户端成功信息temp.Close();s.Close();catch (ArgumentNullException e)Console.WriteLine(ArgumentNullException: 0, e);catch (SocketException e)Console.WriteLine(SocketException: 0, e);Console.WriteLine(Press Enter to Exit);Console.ReadLine();上面的例子是用的Socket类,System.Net.Socket命名空间还提供了两个抽象高级类TCPClient和UDPClient和用于通讯流处理的NetWorkStream,让我们看下例子客户端TcpClient tcpClient=new TcpCLient(主机IP,端口号);NetworkStream ns=tcp.Client.GetStream();服务端TcpListener tcpListener=new TcpListener(监听端口);tcpListener.Start();TcpClient tcpClient=tcpListener.AcceptTcpClient();NetworkStream ns=tcpClient.GetStream();服务端用TcpListener监听,然后把连接的对象实例化为一个TcpClient,调用TcpClient.GetStream()方法,返回网络流实例化为一个NetworlStream流,下面就是用流的方法进行Send,Receive如果是UdpClient的话,就直接UdpClient实例化,然后调用UdpClient的Send和Receive方法,需要注意的事,UdpClient没有返回网络流的方法,就是说没有GetStream方法,所以无法流化,而且使用Udp通信的时候,不要服务器监听。现在我们大致了解了.Net Socket通信的流程,下面我们来作一个稍微复杂点的程序,一个广播式的C/S聊天程序。客户端设计需要一个1个ListBox,用于显示聊天内容,一个TextBox输入你要说的话,一个Button发送留言,一个Button建立连接。点击建立连接的Button后出来一个对话框,提示输入连接服务器的IP,端口,和你的昵称,启动一个接受线程,负责接受从服务器传来的信息并显示在ListBox上面。服务器端2个Button,一个启动服务,一个T掉已建立连接的客户端,一个ListBox显示连接上的客户端的Ip和端口。比较重要的地方是字符串编码的问题,需要先把需要传送的字符串按照UTF8编码,然后接受的时候再还原成为GB2312,不然中文显示会是乱码。还有一个就是接收线程,我这里简单写成一个While(ture)循环,不断判断是否有信息流入,有就接收,并显示在ListBox上,这里有问题,在.Net2.0里面,交错线程修改窗体空间属性的时候会引发一个异常,不可以直接修改,需要定义一个委托来修改。当客户端需要断开连接的时候,比如点击窗体右上角的XX,就需要定义一个this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Closing);(.Net2.0是FormClosing系统事件),在Closing()函数里面,发送Close字符给服务端,服务器判断循环判断所有的连接上的客户端传来的信息,如果是以Close开头,断开与其的连接。看到这里,读者就会问了,如果我在聊天窗口输入Close是不是也断开连接呢?不是的,在聊天窗口输入的信息传给服务器的时候开头都要加上Ip信息和昵称,所以不会冲突。最基本的Socket编程C#版 转示例程序是同步套接字程序,功能很简单,只是客户端发给服务器一条信息,服务器向客户端返回一条信息;这里只是一个简单的示例,是一个最基本的socket编程流程,在接下来的文章中,会依次记录套接字的同步和异步,以及它们的区别。下面是示例程序的简单步骤说明服务器端:第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;第二步:建立一个Socket对像;第三步:用socket对像的Bind()方法绑定EndPoint;第四步:用socket对像的Listen()方法开始监听;第五步:接受到客户端的连接,用socket对像的Accept()方法创建新的socket对像用于和请求的客户端进行通信;第六步:通信结束后一定记得关闭socket;代码:using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;namespace server class Program static void Main(string args) int port = 2000; string host = ; /*/创建终结点(EndPoint) IPAddress ip = IPAddress.Parse(host);/把ip地址字符串转换为IPAddress类型的实例 IPEndPoint ipe = new IPEndPoint(ip, port);/用指定的端口和ip初始化IPEndPoint类的新实例 /*/创建socket并开始监听 Socket s=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字 s.Bind(ipe);/绑定EndPoint对像(2000端口和ip地址) s.Listen(0);/开始监听 Console.WriteLine(等待客户端连接); /*/接受到client连接,为此连接建立新的socket,并接受信息 Socket temp = s.Accept();/为新建连接创建新的socket Console.WriteLine(建立连接); string recvStr = ; byte recvBytes = new byte1024; int bytes; bytes = temp.Receive(recvBytes, recvBytes.Length, 0);/从客户端接受信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); /*/给client端返回信息 Console.WriteLine(server get message:0, recvStr);/把客户端传来的信息显示出来 string sendStr = ok!Client send message successful!; byte bs = Encoding.ASCII.GetBytes(sendStr); temp.Send(bs, bs.Length, 0);/返回信息给客户端 temp.Close(); s.Close(); Console.ReadLine(); server结果:客户端:第一步:用指定的端口号和服务器的ip建立一个EndPoint对像;第二步:建立一个Socket对像;第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;第五步:用socket对像的Receive()方法接受服务器发来的信息 ;第六步:通信结束后一定记得关闭socket;代码:using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;namespace Client class Program static void Main(string args) try int port = 2000; string host = ; /*/创建终结点EndPoint IPAddress ip = IPAddress.Parse(host); /IPAddress ipp = new IPAddress(); IPEndPoint ipe = new IPEndPoint(ip, port);/把ip和端口转化为IPEndpoint实例 /*/创建socket并连接到服务器 Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);/创建Socket Console.WriteLine(Conneting); c.Connect(ipe);/连接到服务器 /*/向服务器发送信息 string sendStr = hello!This is a socket test; byte bs = Encoding.ASCII.GetBytes(sendStr);/把字符串编码为字节 Console.WriteLine(Send Message); c.Send(bs, bs.Length, 0);/发送信息 /*/接受从服务器返回的信息 string recvStr = ; byte recvBytes = new byte1024; int bytes; bytes = c.Receive(recvBytes, recvBytes.Length, 0);/从服务器端接受返回信息 recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); Console.WriteLine(client get message:0, recvStr);/显示服务器返回信息 /*/一定记着用完socket后要关闭 c.Close(); catch (ArgumentNullException e) Console.WriteLine(argumentNullException: 0, e); catch (SocketException e) Console.WriteLine(SocketException:0, e); Console.WriteLine(Press Enter to Exit); Client端结果:用C#下的Raw Socket编程实现网络封包监视谈起socket编程,大家也许会想起QQ和IE,没错。还有许多网络工具如P2P、NetMeeting等在应用层实现的应用程序,也是用socket来实现的。Socket是一个网络编程接口,实现于网络应用层,Windows Socket包括了一套系统组件,充分利用了Microsoft Windows 消息驱动的特点。Socket规范1.1版是在1993年1月发行的,并广泛用于此后出现的Windows9x操作系统中。Socket规范2.2版(其在Windows平台上的版本是Winsock2.2,也叫Winsock2)在 1996 年 5 月发行,Windows NT 5.0及以后版本的Windows系统支持Winsock2,在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。本文向大家介绍Windows Sockets的一些关于用C#实现的原始套接字(Raw Socket)的编程,以及在此基础上实现的网络封包监视技术。同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本机的IP包,通过原始套接字,我们也可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。在本文例子中,我在nbyte.BasicClass命名空间实现了RawSocket类,它包含了我们实现数据包监视的核心技术。在实现这个类之前,需要先写一个IP头结构,来暂时存放一些有关网络封包的信息:StrUCtLayout(LayoutKind.EXPlicit)public struct IPHeader FieldOffset(0) public byte ip_verlen; /I4位首部长度+4位IP版本号 FieldOffset(1) public byte ip_tos; /8位服务类型TOS FieldOffset(2) public ushort ip_totallength; /16位数据包总长度(字节) FieldOffset(4) public ushort ip_id; /16位标识 FieldOffset(6) public ushort ip_offset; /3位标志位 FieldOffset(8) public byte ip_ttl; /8位生存时间 TTL FieldOffset(9) public byte ip_protocol; /8位协议(TCP, UDP, ICMP, Etc.) FieldOffset(10) public ushort ip_checksum; /16位IP首部校验和 FieldOffset(12) public uint ip_srcaddr; /32位源IP地址 FieldOffset(16) public uint ip_destaddr; /32位目的IP地址这样,当每一个封包到达时候,可以用强制类型转化把包中的数据流转化为一个个IPHeader对象。下面就开始写RawSocket类了,一开始,先定义几个参数,包括: private bool error_occurred; /套接字在接收包时是否产生错误 public bool KeepRunning; /是否继续进行 private static int len_receive_buf; /得到的数据流的长度 byte receive_buf_bytes; /收到的字节private Socket socket = null; /声明套接字还有一个常量:const int SIO_RCVALL = unchecked(int)0x98000001);/监听所有的数据包 这里的SIO_RCVALL是指示RawSocket接收所有的数据包,在以后的IOContrl函数中要用,在下面的构造函数中,实现了对一些变量参数的初始化: public RawSocket() /构造函数 error_occurred=false; len_receive_buf = 4096; receive_buf_bytes = new bytelen_receive_buf; 下面的函数实现了创建RawSocket,并把它与终结点(IPEndPoint:本机IP和端口)绑定: public void CreateAndBindSocket(string IP) /建立并绑定套接字 socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); socket.Blocking = false; /置socket非阻塞状态 socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0); /绑定套接字 if (SetSocketOption()=false) error_occurred=true; 其中,在创建套接字的一句socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);中有3个参数:第一个参数是设定地址族,MSDN上的描述是“指定 Socket 实例用来解析地址的寻址方案”,当要把套接字绑定到终结点(IPEndPoint)时,需要使用InterNetwork成员,即采用IP版本4的地址格式,这也是当今大多数套接字编程所采用一个寻址方案(AddressFamily)。第二个参数设置的套接字类型就是我们使用的Raw类型了,SocketType是一个枚举数据类型,Raw套接字类型支持对基础传输协议的访问。通过使用 SocketType.Raw,你不光可以使用传输控制协议(Tcp)和用户数据报协议(Udp)进行通信,也可以使用网际消息控制协议 (Icmp) 和 Internet 组管理协议 (Igmp) 来进行通信。在发送时,您的应用程序必须提供完整的 IP 标头。所接收的数据报在返回时会保持其 IP 标头和选项不变。第三个参数设置协议类型,Socket 类使用 ProtocolType 枚举数据类型向 Windows Socket API 通知所请求的协议。这里使用的是IP协议,所以要采用ProtocolType.IP参数。在CreateAndBindSocket函数中有一个自定义的SetSocketOption函数,它和Socket类中的SetSocketOption不同,我们在这里定义的是具有IO控制功能的SetSocketOption,它的定义如下: private bool SetSocketOption() /设置raw socket bool ret_value = true; try socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1); byte IN = new byte4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年石家庄辅警协警招聘考试备考题库及参考答案详解1套
- 2025年达州辅警协警招聘考试真题附答案详解(基础题)
- 2025年镇江辅警招聘考试真题带答案详解
- 2025年黑龙江辅警协警招聘考试备考题库及完整答案详解一套
- 2025年阿里辅警协警招聘考试真题及答案详解(典优)
- 2025年韶关辅警招聘考试真题含答案详解(综合题)
- 2025年白山辅警招聘考试真题附答案详解(巩固)
- 2025年西宁辅警协警招聘考试真题及1套参考答案详解
- 2025年黑龙江辅警招聘考试题库附答案详解(精练)
- 2025年青岛辅警协警招聘考试备考题库及完整答案详解1套
- 设备维护保养课件
- GJB3243A-2021电子元器件表面安装要求
- 农商银行防汛应急处置预案
- WST861-2025手术部位感染预防与控制标准解读
- 手足显微外科一科一品
- 健康体检报告解读
- 安全培训-重大事故隐患判定标准-专家版
- 学堂在线 工程伦理 章节测试答案
- 2024-2025学年湖北省武汉市部分学校高一上学期期中调研考试数学试卷(解析版)
- 2025年公共艺术课程考试试题及答案汇整
- 狂犬门诊疫苗管理制度
评论
0/150
提交评论