VisualC网络编程案例实战之Socket套接字编程
- 格式:pptx
- 大小:3.84 MB
- 文档页数:105


引言从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sniffer)感到陌生,网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。
通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。
此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。
可见,嗅探器实际是一把双刃剑。
虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。
而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。
权衡利弊,有必要对网络嗅探器的实现原理进行介绍。
嗅探器设计原理嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。
但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。
而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。
显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。
具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。
在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。
为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。
C#上位机之—WinForm实现Socket异步通讯⽰例⼯作中常⽤到的⼀些知识点,总是⽤完就忘,第⼀次尝试⽤博客记录下来,以备后⽤;Socket通讯,Socket(套接字)是基于TCP/IP通讯⽅式的封装好的类,调⽤时需要添加下⾯的服务引⽤:.......10using ;11using .Sockets;窗体页⾯搭建,上⾯为服务器区,下⾯为客户端区:建⽴两个类,⼀个表⽰服务器,⼀个表⽰客户端,⾸先建⽴服务器类:1.声明变量:IP地址,端⼝号,EndPoint,Socket类,数据Buffer等1string ip;//IP地址2string port;//端⼝号3 IPEndPoint endPoint;//⽹络端点4 Socket socServer;//侦听连接套接字5 Socket socClient;//通讯套接字6byte[] dataReceived = new byte[50000];78public delegate void delegateDisplayMsg(string type,string msg);9public delegateDisplayMsg OnDisplay;1011public SocketServer()12 {13 socServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);14 }View Code2.侦听连接函数:public void StartListen(string ip,string port){this.ip = ip;this.port = port;endPoint = new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(port));socServer.Bind(endPoint);socServer.Listen(0);socServer.BeginAccept(new AsyncCallback(OnClientConnect), null);ShowMsg("Wait Connect");}View Code3.接受数据函数:public void OnClientConnect(IAsyncResult asyn){socClient = socServer.EndAccept(asyn);WaitForData();ShowMsg("Client Connected " + socClient.RemoteEndPoint.ToString());}public void WaitForData(){if (socClient != null)socClient.BeginReceive(dataReceived, 0, dataReceived.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); }public void OnDataReceived(IAsyncResult asyn){int dataLength = socClient.EndReceive(asyn);byte[] chars = new byte[dataLength];Buffer.BlockCopy(dataReceived, 0, chars, 0, dataLength);string msg = Encoding.ASCII.GetString(chars);ShowMsg("<=" + msg);WaitForData();}View Code4.发送数据函数:public void SendMsg(string msg){byte[] data = Encoding.Default.GetBytes(msg);socClient.Send(data);ShowMsg("=>" + msg);}View Code然后建⽴客户端类:1.声明变量string ip;//IP地址string port;//端⼝号IPEndPoint endPoint;//⽹络端点Socket socClient;//通讯套接字byte[] dataReceived = new byte[50000];//数据Bufferpublic delegate void delegateDisplayMsg(string type,string msg);public delegateDisplayMsg OnDisplay;public SocketClient(){socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);}View Code2.连接服务器函数:public void Connect(string ip, string port){this.ip = ip;this.port = port;endPoint = new IPEndPoint(IPAddress.Parse(this.ip), int.Parse(port));socClient.BeginConnect(endPoint, new AsyncCallback(OnToConnected), null);}View Code3.接受数据函数:public void OnToConnected(IAsyncResult asyn){socClient.EndConnect(asyn);WaitForData();ShowMsg("Connect Success");}public void WaitForData(){if (socClient != null)socClient.BeginReceive(dataReceived, 0, dataReceived.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null); }public void OnDataReceived(IAsyncResult asyn){int dataLenth = socClient.EndReceive(asyn);byte[] chars = new byte[dataLenth];Buffer.BlockCopy(dataReceived, 0, chars, 0, dataLenth);string msg = Encoding.ASCII.GetString(chars);ShowMsg("<=" + msg);WaitForData();}View Code4.发送数据函数:public void SendMsg(string msg){byte[] data = Encoding.Default.GetBytes(msg);socClient.Send(data);ShowMsg("=>" + msg);}View Code服务器类与客户端类,已经建⽴完成,下⾯对两个类进⾏实例化,并Link窗体控件的事件函数,如下:1.实例化:public void Init(){Server = new SocketServer();Client = new SocketClient();Server.OnDisplay += ShowMsg;Client.OnDisplay += ShowMsg;}2.按钮点击事件:private void btn_StartListen_Click(object sender, EventArgs e){Server.StartListen(txt_serverIP.Text.ToString(), txt_serverPort.Text.ToString());btn_StartListen.BackColor = Color.LimeGreen;}private void btn_Connect_Click(object sender, EventArgs e){Client.Connect(txt_clientIP.Text.ToString(), txt_clientPort.Text.ToString());}private void btn_serverSend_Click(object sender, EventArgs e){Button b = (Button)sender;bool isServer = .Contains("server");if (isServer)Server.SendMsg(txt_serverMsg.Text.ToString());elseClient.SendMsg(txt_clientMsg.Text.ToString());}View Code现在启动程序,测试发送接收功能是否正常⾄此,⼀个简单的Socket通讯模型已经完成,实际应⽤中还需考虑通讯异常,通讯协议,多个客户端通讯等事项,第⼀次写博,欢迎⼤家多多指正;。