Winsock(精选6篇)
Winsock 篇1
摘要:详细介绍了在Windows下, 利用C#语言实现SMTP协议进行邮件发送、联系人管理功能的设计步骤及编程。
关键词:C#,WinSock,SMTP
1 引言
Windows Sockets规范是一套开放的、支持多种协议的Windows下的网络编程接口。目前Windows操作系统下的绝大多数网络应用都是使用的Windows Socket接口。文中在简单介绍网络编程方面的基础知识和SMTP (简单邮件传输协议) 的原理和机制的基础上, 详细地阐述了如何使用C#语言来实现一个使用SMTP协议进行电子邮件发送的实例程序。该实例系统的主要功能包括:利用SMTP协议进行电子邮件的撰写、单人和群发邮件及联系人管理更新与保存功能。
2 相关知识
套接字 (Socket) 是一种网络编程接口, 其本质是对通信端点的一种抽象, 提供了一种发送和接收数据的机制。WindowsSocket简称WinSock, 是运行在Windows平台之上的基于Socket模型的API。应用程序调用Windows Socket的API实现通信, 而WinSock则利用下层的网络通信协议功能和操作系统调用来实现真正的通信。
WinSock有两流式套接字 (StreamSockets) 和数据报套接字 (DatagramSockets) 两种形式。流式套接字提供了双向的、有序的、无重复并且记录边界的面向连接的数据流服务, 而数据报套接字尽管也支持双向的数据流, 却是无连接的, 并不保证可靠、有序和无重复。
简单邮件传输协议 (SMTP) 的目标是可靠高效地传输电子邮件, 它独立于传送子系统且仅要求一条可以保证传送数据单元的通道。SMTP的一个重要特点是它能够在传送中接力传送邮件。传送服务提供了进程间通信环境 (IPCE) , 此环境可以包括一个网络, 几个网络, 或者一个网络的子网。进程可能直接和其他进程通过已知的IPCE通信。邮件实际上就是一个进程间通信, 它可以连接在不同IPCE上的进程跨网络进行邮件传送而且邮件可以通过不同网络上的主机以接力方式传送。针对用户的邮件请求, 发送SMTP与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP请求命令由发送SMTP发出, 由接收SMTP接收, 而应答命令则反向发送。一旦传送通道建立, SMTP发送者发送MAIL命令指明邮件发送者。如果接收SMTP可以接收邮件则返回OK应答, 代号为220。发送SMTP使用RCPT TO命令向接收SMTP指明邮件接收人。如果接收SMTP接收, 则返回OK应答, 如果不能接收到, 则发出拒绝接收应答, 但不终止整个邮件操作。双方将如此多次。
3 功能分析及系统设计
3.1 系统功能及流程
由于SMTP基于面向连接的TCP协议, 因此, 需要使用流式套接字来实现本系统。
使用面向连接的流式套接字编程的时序和机理如图1所示。
如果接收方与发送方连接在同一个传送服务器下时, 邮件可以直接由发送方主机发送到接收方主机;当两者不在同一个传送服务下时, 通过中继SMTP服务器进行传送。
根据SMTP协议规范, 本系统需要实现SMTP的如下命令和操作 (如表1所示) 。
基于上述命令和操作, 利用SMTP协议进行邮件发送有如下3个步骤:
(1) MAIL
此请求命令告诉SMTP接收者新的邮件发送操作已经开始, 复位所有状态和缓冲区。若请求被接收, 接收方返回250OK应答。
(2) RCTP
此请求命令告诉接收SMTP, 邮件的接收者。此过程可能会重复若干次。
(3) DATA
此请求命令被接收后, 接收方返回354 Intermediate, 接收者将以下的各行内容视为信件内容。
3.2 编码实现
Winsock在常见的Windows平台上Winsock1和WinSock2两种版本。编写与WinSock1兼容的程序你需要引用头文件WINSOCK.H, 而编写使用WinSock2的程序则需要引用WINSOCK2.H。此外还有一个MSWSOCK.H头文件, 它是专门用来支持在Windows平台上高性能网络程序扩展功能的。使用WINSOCK.H头文件时, 同时需要库文件WSOCK32.LIB, 使用WINSOCK2.H时, 则需要WS2_32.LIB, 如果使用MSWSOCK.H中的扩展API, 则需要MSWSOCK.LIB。本系统是利用微软的.NET系统, 使用C#语言来实现的, 所使用的版本是Winsock2。在.NET系统中, System.Net.Sockets这个命名空间包含的类通常与较低级的网络操作有关。其中的Socket类是一个非常基础且功能强大的WinSock实现, 可以利用它实现几乎所有的TCP/IP操作, 也可以使用在Socket类基础上构造的TcpClient、TcpListenter等TCP、UDP实现。下面详细地解析整个系统的编码实现过程。
(1) 界面设计
新建“Windows窗体应用程序”类型的项目, 命名为“SMTPMail”, 在“解决方案”下拉列表中选择“创建新解决方案”, 然后单击“确定”按钮。
利用Windows窗体界面设计, 实现本系统的操作界面如图2所示。
程序界面主要控件名称和类型、属性、值如表2所示。
(2) 构建编程环境
为了编程中的方便, 首先引入如下的命名空间:
(3) “导入联系人”功能
在SMTPMail窗体打开时从文件中读入用户当前的所有联系人, 并将联系人在ListBox中进行显示。初始读入联系人功能代码如下:
(4) 联系人管理功能
为方便用户对联系人的管理, 提供用户对联系人进行删除和保存功能, 每当用户发送有件时, 若在“收件人”中的的电子邮件地址在联系人列表中不存在时, 程序将自动将其保存到“联系人列表”中。功能代码如下:
(5) 联系人选择功能
用户在发送邮件时, 若接收邮件的联系人在右面的“联系人列表”中, 用户只需点击该联系人, 就会自动添加到“收件人”TextBox中。在用户向“收件人”中添加联系人邮件地址时, 若“收件人”TextBox中存在该联系人, 程序弹出联系人已存在对话框, 对该联系人邮件地址不予添加。操作界面如图3所示。
功能代码如下:
(6) 验证用户的输入信息
用户点击“发送邮件”按钮后, 程序将开始对发送邮件所需要的用户信息进行验证。若信息不完整将不进行邮件发送, 弹出提示对话框要求用户填写缺漏的信息。验证输入信息的操作界面及其测试用例之一如图4所示。
功能代码如下:
(7) 邮件发送功能
用户在SMTPMail程序界面按提示填写完所需要信息时, 就可以点击“发送邮件”按钮进行邮件发送。发送邮件时, 首先使用TcpClient对象建立一个与SMTP的服务器连接Socket:
将建立好的TcpClient建立NetWorkStream Socket流机制, 使用Read、ReadByte, Write等方法十分方便地操作Socket进行数据发送和接收。
为简化对NetworkStream的读操作, 再创建一个StreamReader对象来进行NetWorkStream的读操作。
用户点击“发送邮件”按钮后, 程序就开始和SMTP服务器创建连接, 并使用SMTP的常用命令进行电子邮件的发送。功能代码为:
至此, SMTPMail实例程序已经设计和编码完毕, 编译并运行程序将弹出如图5所示界面。
按照界面的提示填写完所需要的信息, 点击“发送邮件”按钮, 就可完成邮件的单独发送或群发。邮件发送成功后的运行记录如图6所示。
4 结语
简单邮件传输协议SMTP是现在网络中传输电子邮件的标准。文中在介绍Socket、WinSock以及SMTP的基础上, 详细地解析了利用C#语言实现的SMTP邮件发送的实例程序, 适合初级编程人员学习和参考。
参考文献
[1]黄承安, 谢文东, 许聪.网络应用案例导航[M].北京:中国铁道出版社, 2003.
[2]黄嘉辉.网络程序设计[M].北京:科学出版社, 2004.
[3]http://www.yesky.com/80/195580.shtml.
[4]http://www.itwen.com/07prog/03vcvb/vcvb20060527/44978.html.
Winsock 篇2
摘要:该文简要介绍Winsock控件的基础知识,使用VB编写实现远程计算机通信的程序。通过程序的运行,帮助学生学习计算机网络中本机IP地址、回环地址、广播地址以及端口号的概念。
关键词:Winsock;IP地址 ;端口号
中图分类号:G712文献标识码:A文章编号:1005-1422(2014)06-0146-02在计算机网络学习中, OSI参考模型的抽象七层结构晦涩难懂。本校网络班学生学习《计算机网络基础》之前,已有VB编程基础设计做基础,具有一定的编程能力和理解能力。因此本文通过在Visual Basic中利用Winsock控件进行网络通讯程序的编程,使学生能够更好地理解IP地址和端口号的概念。
一、Winsock控件基础
Winsock控件在程序设计时,是可见的。在程序执行过程中,虽然隐藏在执行的窗体之中,但是它可以为有关网络通讯方面的程序设计提供依据。该控件的使用,使得调用TCP或UDP网络服务极为便利。因此,在编写有关应用程序时,只需简单了解TCP通讯协议和低级的Winsock API调用方式,学生学习时简单易懂。
1.TCP协议
TCP协议的全名为“传输控制协议(transfer control protocol)”,这是目前在互联网上使用的主要协议,例如http,ftp,SMTP等,都是基于这个面向连接的协议。因此,当使用TCP协议连接两个网络上的设备时,将可以在它们之间交换希望交换的数据。如果正在建立主机端应用程序时,必须指定本机和本机(执行应用程序所在的计算机)所用的连接端口号,接着将Winsock控件设置为“监听(listen)”,即可等候远程客户端进行调用与连接。因此,当主机端接收到客户端调用并且要求连接的信息时,将会触发“要求连接()”的事件,接着进行标准“允许”或是“拒绝”的程序。
一旦主机端与客户端连接完成之后,将可以开始使用“传送数据(senddata)”方法,将数据传送给对方同时,在数据传达对方的计算机时,将会触发对方计算的“接收数(dataarrival)”事件。此时,可以使用“取得数据(getdata)”方法,来去出这些接收到的数据。
2.Winsock控件
(1)该次编程中涉及的Winsock的属性,如下:LocalHostName属性(本地主机名称);LocalIP属性(本地主机IP);LocalPort属性(本地主机端口);RemoteHost属性(远程主机名称);RemotePort属性(远程主机端口);Protocol属性(Winsock控件)(协议【TCP、UDP】);Name属性(控件的名称);State属性,返回WinSock控件当前的状态。
(2)该次编程需用到的三个方法:Bind,SendData和GetData。
Bind 方法 ,指定用于 TCP 连接的 LocalPort 和 LocalIP。
SendData方法,当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。
GetData方法,当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。
(3)DataArrival事件当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。
二、程序的主要设计和代码
程序的主界面是一个窗体,包含四个文本框控件、两个命令按钮和一个LIST控件。四个文本框控件分别用来做监听的端口号、远端的IP地址和端口号、发送的内容。两个命令按钮,分别做监听、发送命令。LIST控件用来显示发送和接受的内容。
1.在窗体中添加一个Winsock控件,将其Protocol属性改为1-sckUDPprotocol。
2.将“发送”按钮命名为command1, “监听”按钮命名为command2,监听端口下的text文本框命名为text1,两部电脑图标的Winsock控件命名为wc1,双击“监听”按钮输入如下程序,
If wc1.State = 1 Or wc1.State = 2 Then
wc1.Close
Command1.Enabled = False
End If
wc1.Bind CInt(Text1.Text)
Command1.Enabled = true
将“IP”右边的文本框命名为Text3, text属性改为你的电脑的IP, “端口”右边的文本框命名为Text4,双击“发送”按钮,“要发送的数据”下面的文本框命名为Text5,输入如下代码:
Dim ff As String
ff = Text4.Text
wc1.RemoteHost = Text2.Text
wc1.RemotePort = Text3.Text
wc1.SendData ff
3.双击两部电脑图标,从代码窗口上部选择DataArrival事件,并输入如下代码:
Dim kk As String
wc1.GetData kk
List1.AddItem kk + “发送者IP:” + wc1.RemoteHostIP,0
开始运行程序。
三、Winsock程序测试
1.使用回环地址
回环地址127.0.0.1,被称为本地回环地址(Loop back address)。它代表设备的本地虚拟接口,在windows操作系统中也有相似的定义,不安装网卡前可以ping通本地回环地址。该程序可以用回环地址自己给自己发信息。
2.对方IP地址通信
相互之间发信息,需用端口号和IP。通过与对方通信,来帮助学生理解传输层中端口号的概念。案例:同学A监听端口号9090,同学B监听8080,已知A的IP地址是192.168.1.103,B的IP地址是192.168.1.102,那么A给B发信息,就需要B监听8080端口,A使用IP地址192.168.1.102发送信息。如果B给A发信息,就需要A监听9090端口,B使用IP地址192.168.1.103.
3.广播地址通信
广播地址是专门用于同时向网络中所有工作站发送信息的地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播分组传送给host ID段所涉及的所有计算机。
在实际教学中,机房IP地址段192.168.1.0/24的广播地址为192.168.1.255,发送端口为8080,所有同学监听8080端口,发送的信息全部同学可以同时接收。
四、总结
通过此次实验,不仅锻炼了学生的VB编程能力,同时用自己编写的程序来互相发送信息,让学生体验网络编程带来的成就感.帮助学生理解计算机网络中传输层的端口号和网络层IP地址的相关概念,同时了解了计算机网络中回环地址,本机地址和广播地址的相关概念,提高了学生学习计算机网络的兴趣.
参考文献:
[1]Andrew S.Tanenbau计算机网络第四版[M].北京:清华大学出版社,2005.
[2]范剑波.Visual Basic网络程序设计[M].北京:科学出版社,2003.
[3]鲁斌,李莉. 网络程序设计与开发 [M].北京:清华大学出版社,2010.
Winsock 篇3
关键词:Winsock,控件,属性,应用
随着互联网在各个领域中的应用, 计算机应用系统的开发也由传统方式转向网络环境。 由此Visual Basic提供了基于Windows Sockets网络编程接口的Winsock控件, 使得开发TCP/IP变得简单、轻松。 本文简要说明Winsock控件的属性及应用方法。
Winsock控件是一个在运行中不可见的控件, 可以很容易的访问TCP和UDP网络服务, 使用它不需要了解TCP/IP的具体细节。 只要设置Winsock控件的属性和调用该控件的方法, 就可以轻松编写网络应用程序、连接到远程计算机并进行双向的数据交换。
1 Winsock控件的属性
(1) Bytes Received ( 接受数据的字节数) 反映接收到的数据量, 它以字节为单位, 是只读属性, 在设计时不可用。
(2 ) Local Host Name ( 本地机器名) , Local IP ( 本地机器IP地址) , Local Port ( 本地机器通信程序端口) , 此属性构成本地机器的网络地址。
Local Host Name, Local IP为只读属性, 返回本地机器名和IP地址。
(3) Remote Host (远程机器名称) , Remote Host IP (远程机器的IP地址) , Remote Port (远程机器通信程序端口) , 此属性构成远程机器的网络地址。
Remote Host和Remote Port用于设置远程主机和端口号, Remote Host应用是一字符串, 它可以是域名, 也可以是IP地址。 例如:要同IP地址为202.99.6.100, 端口号为1024 的程序通信, 可设置为:
Winsockl.Remote Host=’’202.99.6.100
Winsockl.Remote Port=1024
(4) Socket Handle ( 提供给调用Winsock API的句柄参数) 用于调用低层Winsock API函数。 在要求较高的情况下, 可调用API来成更复杂的操作。
(5) State (连接的当前状态) 属性为返回当前状态, 在应用中常读取其值已得到当前状态, 从而决定下一步的处理。
2 Winsock控件的应用方法
(1) Accept方法
用于接受TCP连接请求。在TCP建立连接时, 当有连接请求时, 用此方法接受请求建立连接。调用格式如下:Winsock对象.Accept Request ID
(2) Bind方法
用于存在多协议接口卡的情况下, 用此方法把接口卡和IP地址捆绑在一起。 调用格式为:Winsock对象.Bind端口号, IP地址
(3) Close方法
用于关闭一个TCP连接。调用格式为:Winsock对象.Close
(4) Connect方法
用于向远程主机发出连接请求。 调用格式为:Winsock对象.Connect﹝远程主机IP, 远程端口﹞
(5) Listen方法
用于服务器程序, 等待客户访问。 调用格式为:Winsock对象.Listen
(6) Get Data和Peer Data方法
这两种方法都用来获取接受数据。 Get Data方法取回数据后清除接收缓冲区, Peer Data方法只是获取当前接收数据拷贝, 不清除缓冲区。 调用格式为:Winsock对象. Get Data (Peer Data) 变量﹝, 数据类型﹝, 最大长度﹞﹞
(7) Send Data方法
用于发送数据, 可用在TCP和UDP两种方式下。调用格式为:
Winsock对象.Send Data数据
3 Winsock控件的主要事件
(1) Connect Request事件
当远程计算机请求连接时出现, 仅适用于TCP服务器应用程序。当本地计算机接收到远程计算机发送的连接请求时, 控件的Connect Request事件将会被触发。
(2) Send Progress事件
在发送数据期间出现。 当一端的计算机正在向另一端的计算机发送数据时, Send Progress事件将被触发。 Send Progress事件记录了当前状态下已发送的字节数和剩余字节数。
参数:bytes Sent是从上一次激活事件以来已发送的字节数:bytes Remaining是在发送缓冲区等待发送时的字节数。
(3) Send Complete事件
在完成一个发送操作时出现。 当所有数据发送完成时, 被触发。
(4) Data Arrival事件
当数据到达时出现。 Data Arrival事件连接后, 接受到了新数据就会触发这个事件。 注意:如果在接受到新数据前, 缓冲区中非空, 就不会触发这个事件。
(5) Error事件
发生错误时出现。 当在工作中发生任何错误都会触发这个事件。
4 Winsock控件应用实例
TCP是一种面向连接的服务, 连接两台计算机就可彼此进行数据传输。 UDP是一种双向无连接协议。 跟TCP的操作不同, 计算机并不建立连接。 另外UDP应用程序可以是客户机, 也可以是服务器;所以程序编写上比TCP方式简单。 我们使用UDP建立一个“聊天”程序, “聊天”是指两个程序能够发送数据给对方, 在此两者之间是平等的、处于同一地位, 没有服务和客户的区别。
建立【聊天A】程序的步骤:
(1) 打开VB6.0 中文版, 建立标准程序, 设置窗体标题为 “ 聊天A”。
(2) 把Winsock控件拖到窗体中, 设置Protocol属性为I -sck UDPProtocol, 其他属性为缺省值。
(3) 在窗体放置两个标签和文本框, 设置两个标签的Caption属性分别为“接收窗”和“发送窗”。
编写代码:
(1) 在Form Load过程中设置网络地址, 设置Local Port, Remote Host和Remote Port属性。
【聊天A】的Remote Host设置为运行 【聊天B】程序的主机地址。
【聊天A】的Remote Port设置要与【聊天B】的Local Port属性一致。
(2) 在文本框的Change事件中, 发送用户输入数据。
(3) 有数据到达时, 显示对方数据内容。
到此【聊天A】程序设计完成, 保存将其编译为执行文件。 因为A、B是平等的, 所以 【聊天B】程序设计, 只需要按上述原则在Form Load中设置好网络地址其他部分则完全与A相同。
参考文献
[1]张树兵, 戴红, 陈哲.Visual Basic6.0中文版入门与提高[M].北京:清华大学出版社, 1999.
Winsock 篇4
因特网刚刚起步时,国外就已经出现安全扫描技术。最近的十几年,信息技术、网络技术飞速发展,安全扫描技术随之不断的发展完善。安全扫描器也从最初只在LINUX上编写的一些小程序发展为可以在多个平台上运行的、功能复杂的系统程序[1]。我国的安全描技术是在国外的基础上发展起来的。这里面有一些专门做信息安全的公司例如盈高科技、联软科技等等的安全扫描器大多以硬件为主,它们特点是执行速度快、功能强大、准确性高[2]。不像软件一样受到安装主机系统性能的限制,但是它们的硬件价格不菲,扫描一次的费用往往就要上万。网络上还有许多专业的网络扫描器功能强大,但是其参数设置、操作流程比较复杂。普通电脑用户都没有相关方面的知识,专业的网络扫描器很难上手。
本文针对普通用户的信息安全监测,用户通过简单的操作的即可获得网络中的主机或者本地主机的端口状态,尽早的发现网络中存在的安全漏洞,防患于未然。程序中的端口监测功能使用户很方便地发现本地主机是否遭到了端口扫描,及早做出响应将对方的攻击扼杀。对于对端口扫描感兴趣的初学者,程序提供了多种端口扫描方式、快速扫描和多线程扫描,通过使用不同扫描方式加深他们对端口扫描技术的理解。
二、需求分析
1、用户需求分析
互联网络的发展,网络入侵事件更加频繁。网络系统入侵者进入目标系统的第一步就是对目标系统进行端口扫描。普通的电脑用户主要通过杀毒软件,杀毒软件都是病毒入侵本地主机后,扫描本地文件对比病毒特征库来查杀病毒[3]。杀毒软件是能杀死入侵的病毒,但对计算机内的重要资料的泄露等损失无法挽回。在病毒入侵之前,端口扫描及检测程序能够及时发现本地主机受到的潜在的端口扫描,及时关闭端口将后续的入侵关在门外,如果处理得当能使用户免受损失。
2、功能需求分析
作为一款基于端口扫描技术的安全软件,首先要能够对自己的主机进行端口扫描,得到它们的状态。其次能对远程的主机进行端口扫描,得到远程主机的端口状态。最后还能对局域网中某个网段的主机进行端口扫描,得到这个网段内所有开机状态下的主机的端口开放状态。
用户除扫描自己的计算机了解计算机的端口开放状况,出于安全的考虑,还需能够检测出别人的计算机对自己计算机的扫描,对别人的攻击做出提前的预防。因此,端口检测的功能也是必需的。端口扫描涉及到数据在网络上的传输,即使采用多线程,端口扫描的速度也不会很快。扫描所有的网络端口往往需要大量的时间,为了提高扫描的效率,节约时间。程序还应该能端口设置,只对必要的端口进行扫描。
三、系统设计
1、功能模块设计简介
本软件主要实现数据输入处理、端口扫描模块、端口监控模块和数据显示输出四个功能模块。各模块的主要功能性能描述如下:
数据输入处理:对应界面上的扫描设置部分,主要负责接受用户输入的IP地址、端口范围和选择的扫描方式。能够对用户输入的数据的格式、大小进行判断和处理,将错误信息返回给用户。
执行端口扫描:这部分主要为Connect、Connect2、SYN三个端口扫描程序。将处理后的数据输入程序完成扫描,得到用户需要的数据。
执行端口监控:这部分主要为端口监听程序。它能够打开计算机的端口,并记录端口的状态,分析后得出的检测结果。
界面显示输出:将端口扫描程序输出的数据显示在扫描结果栏,端口监听程序输出的结果显示在当前状态栏。
2、扫描程序的设计原理
TCP方式的端口扫描主要利用三次握手原理,扫描程序开始后,使用socket()函数创建客户端接口,调用connect()函数连接被扫描主机(服务器)的地址和指定端口号,客户端接收到反馈回来的数据包,通过分析数据包来判断目标主机的服务端口是打开还是关闭[4,5]。
用户在界面输入要扫描的主机地址和端口号,程序会对输入的参数进行验证其是否合法,然后再根据用户选择的相应的扫描方法(如Connect扫描)。Connect扫描程序开始后,系统会使用socket()函数创建流式套接字,然后再调用bind()函数将创建好的套接字与本机IP地址绑定[6]。创建好客户端程序后,程序会向被扫描的主机的某个端口发送一个UDP数据包,然后等待接受该端口返回的数据。如果程序接受到了错误数据,表明该端口是关闭的。如果一定时间内程序没有接收到数据,则表明该端口是打开的。扫描程序设计原理如图1所示。
四、软件实现
1、端口扫描界面
端口扫描功能主界面分为扫描范围、扫描结果、扫描状态三个部分。在扫描范围中可以设置扫描参数,包括IP范围的设置、端口范围的设置和扫描方法的选择。扫描开始后,在扫描状态中会实时显示当前扫描到的主机的IP地址和端口号。当提示“扫描结束”后,在扫描结果栏中选中要查看的IP地址,可以查看此IP下所开放的端口。端口监控按钮会将程序指向端口监听模块,完成端口监听的一些功能。
端口监听功能主界面如图2所示:
端口扫描功能主界面分为端口状态和当前状态两个部分。当点击图2界面的“端口监听”按钮后切换到次界面,即开始端口监听的功能。在端口状态中会实时显示当前程序打开的端口(本地端口)、端口被连接的次数(端口计数)、与端口连接的IP(远端IP)。系统分析一段时间内端口被扫描的记录后,会在当前状态中显示主机是否被扫描、扫描次主机的远端IP。
2、端口扫描模块
扫描结果显示界面主要依靠CTreeCtrl控件实现,CTreeCtrl控件专门用于显示一些基于“树”状的数据结构。在这种结构中,根节点显示为IP地址。在根节点上有若干分支点,显示为端口号。要实现这样一个展现效果,首先需要在对话框中,放置一个CTreeCtrl树状控件,调整到合适的位置和大小,同时要声明一个CTreeCtrl的变量与此控件绑定。右击控件后,在弹出的菜单中选择“属性”中的“Tree控件属性”来改变他的风格。
程序实现了Connect、SYN、Connect2三种扫描方式,只举Connect的列子进行说明。Connect扫描是最基本的扫描方式,在该扫描方式下,每一个线程负责着一个IP地址的某一个端口的连接,并最终将扫描结果显示到界面。每一个线程的连接要完成完整的三次握手。但是由于CSocket类已经对TCP连接做了很好地封装,所以,本线程相对简单,且代码量很少。扫描多个IP地址和多个端口号时需要使用多线程来提高扫描的效率,多线程一般使用AfxBeginThread()创建。线程穿件完毕后,调用一下Sleep函数,使线程有时间读参数。
3、端口监听模块
端口状态显示有协议、本地端口号、端口计数、远端IP四项,端口状态显示界面主要依靠CListCtrl控件实现,CListCtrl控件专门用于显示一些基于“关系”的数据结构。在这种结构中,每一行代表一个记录,每一列分别代表协议、本地端口号、端口计数、远端IP四个字段。要创建这样的一个结构,需要在对话框中创建一个CListCtrl控件对象,先设置控件的表头部分,再增、修、删其数据。
程序中创建了一个5秒间隔的计时器。计时器记录了开启的端口中被连接的端口的个数和远端的IP地址,并判断其大小,最后得到的结果会输出到当前状态窗口。计时器刷新后,程序重新开始记录监测。
五、测试与结语
1、测试环境
两台安装有端口扫描与检测程序的Windows XP系统的计算机,两台计算机处于同一个局域网内,且处于联机状态。查询后得到a主机的IP为192.168.1.101,b主机的IP为192.168.1.102。
2、功能测试
参数设置:开始IP和结束IP的文本框中输入a主机的IP地址或者127.0.0.1。在“开始Port”后文本框中输入1,“结束Port”后的文本框中输入1024。分别点击“Connect扫描”、“SYN扫描”、“ICMP扫描”按钮选择相应的扫描方式进行扫描。扫描状态提示扫描结束后,点击相应的IP地址查看扫描结果。
a主机分别使用Connect扫描、SYN扫描b主机进行扫描,扫描的结果相同。扫描结果中看到扫描器扫到了本机1~1024的范围内有四个端口打开,分别为80、135、445、843。
3、测试结论
本程序提供TCP connect、TCP SYN、ICMP三种端口扫描方法对目标主机进行扫描,并实现了端口列表自定义和扫描结果存储等几大模块功能。此外,程序还提供了一个端口检测功能,方便用户及时发现自己的主机是否被扫描。
参考文献
[1]沈军飞.基于网络的端口扫描及检测程序[J].软件导刊,2012.
[2]马琳.基于端口扫描检测技术的实现[J].信息系统工程,2013.
[3]唐洪英,龚箭,曹泽翰.检测端看扫描的方法研究[J].计算机应用,2003.
[4]Rong-sheng Shan,Xiao-yong D.Li,Jian-hua Li.An adaptive algorithm to detect port scans[J].Journal of Shanghai University(English Edition),2004.
[5]Yu Zhang,Bharat Bhargava.Allocation Schemes,Architectures,and Policies for Collaborative Port Scanning Attacks[J].Journal of Emerging Technologies in Web Intelligence,201 1.
Winsock 篇5
随着网络的飞速发展和应用, 网络管理已成为保障网络正常运行必不可少的工作。利用计算机对网络中的路由器、交换机、服务器等设备进行监控, 已经成为对网络设备的监控提供自动化保障的重要组成部分。网络设备自动监控能及时发现设备故障并通知网络管理人员及时处理, 减轻了网络管理人员的工作负担, 提高了工作效率, 从而提高网络的使用效果。本文介绍使用icmp协议实现类似TCP/IP中的tcp协议拥塞控制检测程序, 通过服务器端定期向客户端发送数据包, 对比回应时间长短以及是否回应, 来确定受监控客户端的活跃情况并判断是否发生拥塞。
1 TCP协议
TCP协议在两台计算机之间建立了全双工、点对点的连接, 连接的每一端的程序都使用自己的端口, IP地址和端口组合起来被称为套接字 (SOCKET) 。TCP协议在进行数据传输前, 首先会在源点和目的点之间尝试建立一条连接, 如果连接失败, 源和目的点间就不会进行数据传送。当数据接收方接收到数据后会给发送方返回确认信息, 如果发送方在规定的时间内未收到此确认信息, 则认为传输数据丢失。TCP协议能保证传输数据的正确性, 它兼有差错控制与流量控制, 能保证传输的报文有序到达, 由于TCP协议传输的可靠性和安全性都是由底层来保证的, 因此使用者不必担心TCP协议的安全问题。正因为其具有良好的可靠性, 在实际应用中的网络传输有90%的报文是采用TCP协议方式传输的。
ICMP协议 (Internet控制消息协议) 是TCP/IP协议族的一个子协议, 用于在IP主机、路由器之间传递控制消息。控制消息描述是网络的连通情况、主机能否到达、路由是否可用等网络自身的信息。
2 Winsock主要函数
Winsock是针对TCP/IP协议的底层Windows API, 其代码存在于wsock32.dll文件和Windows的内核中。Winsock API是基于UNIX系统下的Berkely Sockets API。Socket在计算机中提供了一个通信端口, 可通过此端口与任何一个具有Socket接口的计算机通信。应用程序在网络上所接收的信息都通过此Socket端口实现。
使用Winsock套接字函数进行网络编程, 非常有利于程序员编写高效、可靠和面向具体应用的网络程序。Winsock主要函数有: (1) socket () 函数:用于创建一个套接字, 并绑定套接字到特定的服务, 如面向连接的数据流服务或无连接的用户数据报服务; (2) bind () 函数:用于将一个本地地址与一个套接字捆绑。此函数适用于未连接的数据报或流类套接字, 在connect或listen调用前使用; (3) listen () 函数:用于设置套接字处于连接进入状态, 监听来自客户端申请的连接, 一般用于TCP模式; (4) accept () 函数:用于接受对指定套接字的连接请求; (5) connect () 函数:用于为一个指定的套接字建立连接, 发出连接请求; (6) send () 函数:用于通过一个已连接的套接字发送数据; (7) recv () 函数:用于从一个已连接的套接字接受数据; (8) closesocket () 函数:用于关闭一个套接字。
3 系统结构设计
局域网监控系统是应用于局域网中C/S模式的软件监测系统。本系统由服务器端和客户端两部分组成。服务器端定期向客户端发送数据包, 并接收客户端返回的响应信息。根据客户端回应时间长短以及是否回应确定受监控客户端的活跃情况并判断是否发生拥塞。
服务器端实现步骤为: (1) 获得客户端主机IP地址与使用端口号; (2) 初始化套接字 (socket调用) ; (3) 连接客户端 (connec调用) ; (4) 与客户端进行数据交互; (5) 关闭连接, 释放套接字。
客户端实现步骤为: (1) 创建套接字并绑定客户端口; (2) 将套接字设置为监听状态, 等待来自于服务器端的请求; (3) 当请求到达时, 接受该请求并取得连接套接字; (4) 接受服务器端的数据; (5) 与服务器端交互完成后, 关闭连接套接字, 返回步骤 (3) 继续执行。
在本系统中, 服务器端起着非常重要的作用。服务器端既要向客户端发出连接请求、发送数据包并接收客户端返回的确认信息, 还要对数据包的往返时间进行判断, 并在界面上输出客户端的运行状态, 以便网络管理员及时了解客户端运行状况, 并及时对客户端进行维护和处理。服务器端流程图如图1所示, 客户端流程图如图2所示。
4 系统程序实现
4.1 服务器端程序实现
由于在向客户端发送数据包之前服务端必须与客户端建立连接, 连接成功后才能发送数据包, 因此, 应先调用connec函数建立连接, 可使用如下代码:if (connect (dlg->m_clientSock, (sockaddr*) & (dlg->m_clientAddr_in) , sizeof (dlg->m_clientAddr_in) ) ) , 然后调用send函数发送数据包, 并调用recv函数接收客户端返回的响应信息, 统计此过程所耗费的时间, 并以此来判断客户端是处于存活状态还是处于拥塞状态, 代码如下:
服务器端的查询分为单个查询和多个查询。单个查询时调用m_ipAdd.GetWindowText () 函数获取输入的IP地址以建立连接;多个查询时, 首先调用m_ipAdd.GetWindowText () 函数获取两个IP地址, 这两个IP地址划定了一个操作域的上下限, 根据IP地址差值得到需监控的客户端数量, 然后循环获取IP地址, 并依次建立连接对客户端进行监控。
4.2 客户端程序实现
客户端程序首先创建套接字并绑定本机IP地址, 然后调用listen () 函数设置套接字处于连接状态, 监听来自服务器端的连接申请, 若收到连接申请则调用accept () 函数接受服务器端套接字的连接请求, 接收来自服务器端的数据包, 并返回确认信息, 代码如下:
5 结束语
本局域网监控系统充分利用了Visual C++网络编程的知识、网络通信Socket技术及面向对象等软件技术, 实现了对局域网内计算机的监控、检测及计算机信息提取等功能, 其优点是充分利用了现有的局域网资源, 以信息的实时获取和实时监测为中心, 实现信息、资源及任务的全局一体化管理。
摘要:介绍了利用Visual C++的网络组件及TCP/IP协议等技术的局域网监控系统, 该系统由客户端和服务器端两部分组成, 可实现对网络的运行状态进行实时监控, 获取计算机运行状态信息等功能。
关键词:局域网监控,Winsock,TCP/IP,ICMP
参考文献
[1][美]W.RICHARD STEVENS.TCP/IP详解卷1[M].范建华, 胥光辉, 译.谢希仁, 校.北京:机械工业出版社, 2000.
[2]丁展, 刘海英.VISUAL C++网络通信编程实用案例精选[M].北京:人民邮电出版社, 2004.
[3]贾斌.网络编程技巧与实例[M].北京:人民邮电出版社, 2001.
[4]宾厚.网络通信与监控系统新模式的研究及开发[J].冶金职业技术学院学报, 2004 (3) .
Winsock 篇6
1 WinSock控件实现网络数据通信原理
1.1 Winsock控件原理
Winsock控件是为早期的MA、VB、VC和VFP程序开发人员提供的网络数据传输控件,它可以使用两种协议:TCP协议和UDP协议[1]。在基于C/S模式的网络数据交换程序开发中,设计人员通过Winsock控件使用数据传输控制协议(TCP)访问网络服务,该控件对用户不可见,设计时需要编写客户端和服务器端应用程序,而不需要了解TCP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和方法的调用,利用网络数据传输协议(TCP)创建和维护与远程计算机的连接,实现连接到远程计算机并进行双向的数据交换[2]。
1.2 银校通实现原理
利用Visual FoxPro 9.0开发工具设计银校通学费代收缴系统应用程序时,必须使用VFP9下专用的MyWinSock.OCX控件,需要时可从网上下载,此控件是专为VFP程序设计而改进的WinSock控件。首先要建立银行与学校间的点对点网络连接;其次设计校方银校通系统用户界面。在银校通系统的数据收发界面中,用WinSock控件分别建立客户端对象(MyClient)和服务器对象(MyServer),即本台机器既是一个客户机又是一台服务器[3]。服务器对象的作用是把本机作为服务器,绑定一个IP地址和端口,通过它的State属性判断是否与银行建立连接,用Listen方法监听银行的连接请求,利用ConnectionRequest事件的Accept方法接受对方连接请求;客户端对象的作用是把本机作为一个客户机,使用该对象的Object.connect方法向银行服务器发出连接请求,通过它的State属性判断是否与银行服务器建立连接;当连接就绪,使用客户端对象的SendData方法发送数据到银行端;使用服务器对象的DataArrival事件内的GetData方法获取数据,完成本次交易[4]。具体工作示意图如图1所示。
1.3 银校通实现流程图
银校通系统设计实现流程如图2所示。
2 用WinSock控件实现通信架构
2.1添加MyWinSock控件
下载MyWinSock.OCX控件(http://www.meizvfp.com/bbs/dispbbs.asp?boardid=11&id=55334),并注册该控件,注册语句:regsvr32 e:changetoolmywinsock.ocx。用VFP9.0设计“发送数据”窗体时添加该控件到类库中,从类中拖放两个MyWinSock,并分别命名为MyServer和My Client对象[5]。2.2设置MyServer对象的属性和方法
1)MyServer属性设置
Name属性:MyServer;LocalIP:211.70.255.10;LocalPort:4133,这三个属性根据实际情况和需要进行设置。Visible属性:Fasle。
2)MyServer方法程序设计
(1)Bind方法程序:
(2)Closed方法程序:
(3)Connected方法程序:
(4)ConnectionRequest事件程序:
(5)DataArrival事件程序:
2.3设置MyClient对象的属性和方法
1)MyClient属性设置
Name属性:My Client;LocalIP:211.70.255.10;LocalPort:4133,这三个属性根据实际情况和需要进行设置。Visible属性:Fasle。
2)MyClient方法设置
(1)Clos方法程序:
thisform.label1.caption="已断开与银行的连接!"
(2)Closed方法程序:
(3)Connected方法程序:
(4)DataArrival事件程序:
3银校通系统客户端用户界面程序设计
银校通系统客户端用户界面如图3所示。
银校通系统系统主程序Main.prg设计如下:
3.1启动服务器
启动服务器功能的程序代码如下:
3.2连接银行
连接银行功能的程序代码如下:
3.3发送数据
4结束语
银校通学费代收缴系统程序是用Winsock控件通过设置它的属性、设计方法程序、数据的转换、存储、启动服务器、连接银行和接收发送数据等功能实现点对点网络数据传输。该系统软件已经通过验收,自2008年已在我院账务处投入使用至今,系统用户界面操作简单,功能齐全,全部满足预期研究目标的需要,深受财务工作人员的欢迎,具有一定的理论和实用价值,在江北地区部分院校推广使用。
摘要:为提高高校财务人员工作效率,节省时间及收费成本,充分利用网络技术手段,使用Visual FoxPro 9.0开发工具,利用WinSock控件,开发学校与银行之间的数据交互程序,创建面向用户的客户端及服务器端(C/S)的网络应用程序平台,实现银校通学生收缴费系统的设计。
关键词:Winsock控件,Visual Foxpro,网络数据通信,客户端/服务器端,数据交换
参考文献
[1]张小莉,敬西.Visual FoxPro程序设计实例教程[M].重庆:重庆大学出版社,2009.
[2]徐向东,周国祥,石雷.基于TCP/IP和Winsock文件上传的应用研究[J].合肥工业大学学报,2008,31(11).
[3]李林静,叶冬芬.运用Winsock构建基于C/S模式的网络通信[J].计算机工程与科学,2009,31(2).
[4]李迎斌,林和平,李雪,等.基于Winsock的视频点对点传输实现[J].微计算机信息,2009(12).
【Winsock】推荐阅读:
Winsock技术08-08