文档库 最新最全的文档下载
当前位置:文档库 › WinSock的使用

WinSock的使用

WinSock的使用
WinSock的使用

WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器并进行数据交换。这两种协议都能用来创建客户端和服务端应用程序。就像定时器控件一样,WinSock控件运行时没有一个可视的界面。

可能的用途

创建客户端应用程序,它能在信息到达中央服务器之前把用户的信息收集起来。

创建服务端应用程序,它能作为来自多个用户的数据一个集中处理点。

创建“聊天”程序。

协议的选择

当我们使用WinSock控件时,首先要确定的是使用TCP还是UDP协议。它们之间主要的区别在于连接状态:

TCP协议控件是一个基于连接的协议,就像电话机一样,用户必须在通话之前建立连接;

UDP是一个无连接的协议,两台计算机之间的事务处理就像传纸条一样:一台计算机向另一台计算机发送消息,但是它们之间并没有一个明确的连接路径。另外,发送的单个信息量的大小取决于网络。

通常,你要创建的应用程序的类别就决定了你要选择的协议。以下是几个能够帮助你选择合适的协议的问题:

当发送或接收数据时,该应用程序需要从服务端或客户端获得认证吗?如果要的话,那么TCP协议就正好需要在发送或接受数据前建立明确的连接。

要发送的数据量大吗?(就像图片、声音文件之类)一旦建立了连接,TCP 协议就会保持连接并保证数据的完整性。但是,这种连接会占用的更多的处理器资源,成本也会更高一些。

数据是陆续传输的,还是一次全部传完呢?比如,如果你要创建的应用程序在某些任务完成时会告知具体的计算机,那么选择UDP协议会更合适一些。UDP 协议也更适合于发送小量数据。

协议的配置

配置你的应用程序所用到的协议:在设计阶段,单击工具窗口里的协议,选择sckTCPProtocol或sckUDPProtocol。你也可以在代码里配置协议,就像下面这样:

Winsock1.Protocol=sckTCPProtocol

确定你的计算机名

要连接到远程的计算机,你必须知道它的IP地址或别名。IP地址是一串用句点分隔的3位数字。通常,计算机的别名更容易让人记住。

按下面的步骤可以找到你的计算机名:

在“任务栏”里单击“开始”

在“设置”选项里单击“控制面板”;

双击“网络”图标;

单击“网络标识”

在“计算机名”中显示的就是你的计算机名。

一旦你找到你的计算名,它就可以作为远程主机的属性来用了。

TCP连接入门

当用TCP控件创建应用程序的时候,必须首先明确你的程序是作为服务端还是客户端。创建服务端程序就意味着你的程序能够在指定的端口进行“监听”,而客户端则能够提出请求,服务端能够接受请求并实现连接。一旦连接建立起来,客户端和服务端就能够自由地进行通信。

创建服务端程序

下面是创建一个简单服务端程序的步骤:

创建一个标准EXE工程;

把默认窗体(Default form)的名字改为frmServer;

把form的标题(caption)改为TCP Server;

把Winsock控件拉到窗体中,并命名为tcpServer;

在窗体中添加2个文本框,分别命名为txtSendData和txtOutput‘

在窗体中加入下列代码;

Private Sub Form_Load()

' Set the LocalPort property to an integer.

' Then invoke the Listen method.

tcpServer.LocalPort = 1001

tcpServer.Listen

frmClient.Show ' Show the client form.

End Sub

Private Sub tcpServer_ConnectionRequest _

(ByVal requestID As Long)

' Check if the control's State is closed. If not,

' close the connection before accepting the new

' connection.

If tcpServer.State <> sckClosed Then _

tcpServer.Close

' Accept the request with the requestID

' parameter.

tcpServer.Accept requestID

End Sub

Private Sub txtSendData_Change()

' The TextBox control named txtSendData

' contains the data to be sent. Whenever the user

' types into the textbox, the string is sent

' using the SendData method.

tcpServer.SendData txtSendData.Text

End Sub

Private Sub tcpServer_DataArrival _

(ByVal bytesTotal As Long)

' Declare a variable for the incoming data.

' Invoke the GetData method and set the Text

' property of a TextBox named txtOutput to

' the data.

Dim strData As String

tcpServer.GetData strData

txtOutput.Text = strData

End Sub

上面就是创建一个简单的服务端应用程序的过程。然而,要完成整个过程,你还得创建一个客户端程序。

创建TCP客户端程序

在工程中添加一个新的窗体(form),并命名为frmClient;

将窗体的标题(caption)改为TCP Client;

添加一个Windsock控件到窗体中,命名为tcpCllient;

添加2个文本框控件到frmClient窗体,分别命名为txtSend和txtOutput;

添加一个按钮控件(CommandButton)到窗体,命名为cmdConnecti;

将按钮控件标题(caption)改为Connect;

在窗体中添加下面代码:

注:确保将远程主机属性(RemoteHost property)改为你的计算机别名。

Private Sub Form_Load()

' The name of the Winsock control is tcpClient.

' Note: to specify a remote host, you can use

' either the IP address (ex: "121.111.1.1") or

' the computer's "friendly" name, as shown here.

tcpClient.RemoteHost = "RemoteComputerName"

tcpClient.RemotePort = 1001

End Sub

Private Sub cmdConnect_Click()

' Invoke the Connect method to initiate a

' connection.

tcpClient.Connect

End Sub

Private Sub txtSendData_Change()

tcpClient.SendData txtSend.Text

End Sub

Private Sub tcpClient_DataArrival _

(ByVal bytesTotal As Long)

Dim strData As String

tcpClient.GetData strData

txtOutput.Text = strData

End Sub

以上代码就能创建一个简单的客/服应用程序。要试着让两者建立连接,可

以运行工程,单击Connect。在任意一个txtSendData文本框中输入文本,同样的文本信息就会出现在另一个窗体的txtOutput文本框中出现。

接受多个连接请求

上面介绍的服务端程序智能接受一个连接请求。但是,通过创建一组控件,并使用同样的控件来接受多个连接请求也是可能的。在这种情况下,你不需要关闭连接,只要创建新的控件实例(通过配置它的索引属性),调用新的实例中的接受方法。

下面的代码中,假定在一个叫sckServer的窗体中有一个Winsock控件,它的索引属性设置为0。这样这个控件就是控件数组的一部分。在声明段中,生命一个模块级变量intMax。在窗体的载入事件中,intMax被设置为0,数组中第一个控件的本地端口属性被设置为1001。

监听方法在控件中被调用,它被作为“监听控件”。每个连接请求到来时,代码会测试看它的索引(Index)是否为0(监听控件的值),如果是0,监听控件中intMax值增1,并用这个值创建新的控件实例。新的控件实例被用来接受连接请求。

Private intMax As Long

Private Sub Form_Load()

intMax = 0

sckServer(0).LocalPort = 1001

sckServer(0).Listen

End Sub

Private Sub sckServer_ConnectionRequest _

(Index As Integer, ByVal requestID As Long)

If Index = 0 Then

intMax = intMax + 1

Load sckServer(intMax)

sckServer(intMax).LocalPort = 0

sckServer(intMax).Accept requestID

Load txtData(intMax)

End If

End Sub

UDP连接入门

创建一个UDP应用程序比创建TCP程序更简单,因为UDP协议不需要一个确定的连接。在上面的TCP应用程序中,其中一个Winsock控件必须明确的被设置为“监听”,而另一个必须用连接方法发起连接。

相反,UDP协议不需要明确的连接。要在2个控件之间传送数据,(连接的双方)必须完成三个步骤:

确定远程主机属性为对方的计算机名;

确定远程主机属性为第二个控件的本地端口属性;

调用约定方法指定要被使用的本地端口。(下面将详细讨论该方法)

创建一个的UDP连接端

创建一个标准EXE工程;

将默认窗体命名为frmPeerA;

在窗体中添加一个Winsock控件,命名为udpPeerA;

在属性(Properties)页,单击协议(Protocol),改为UDPProtocol;

添加2个文本框控件窗体中,分别命名为txtSend和txtOutput;

在窗体中添加下面代码:

Private Sub Form_Load()

' The control's name is udpPeerA

With udpPeerA

' IMPORTANT: be sure to change the RemoteHost

' value to the name of your computer.

.RemoteHost= "PeerB"

.RemotePort = 1001 ' Port to connect to.

.Bind 1002 ' Bind to the local port.

End With

frmPeerB.Show ' Show the second form.

End Sub

Private Sub txtSend_Change()

' Send text as soon as it's typed.

udpPeerA.SendData txtSend.Text

End Sub

Private Sub udpPeerA_DataArrival _

(ByVal bytesTotal As Long)

Dim strData As String

udpPeerA.GetData strData

txtOutput.Text = strData

End Sub

创建第二个UDP连接端

添加标准窗体到工程中;

将窗体名改为frmPeerB;

将窗体标题改为Peer B;

在窗体中添加一个Windsock控件并命名为udpPeerB;

在属性页中单击Protocol,改为UDPProtocol;

添加2个文本框到窗体中,分别命名为txtSend和txtOutput;

在窗体中添加下面代码:

Private Sub Form_Load()

' The control's name is udpPeerB.

With udpPeerB

' IMPORTANT: be sure to change the RemoteHost

' value to the name of your computer.

.RemoteHost= "PeerA"

.RemotePort = 1002 ' Port to connect to.

.Bind 1001 ' Bind to the local port.

End With

End Sub

Private Sub txtSend_Change()

' Send text as soon as it's typed.

udpPeerB.SendData txtSend.Text

End Sub

Private Sub udpPeerB_DataArrival _

(ByVal bytesTotal As Long)

Dim strData As String

udpPeerB.GetData strData

txtOutput.Text = strData

End Sub

关于约定方法

上面代码中所涉及的,在创建UDP应用程序时必须调用约定方法。这个约定的方法保留了控件用到的本地端口。例如,当你绑定控件到端口1001时,其他的应用程序都不能用该端口监听。当你希望阻止其他的应用程序使用某端口的时候,这个就很有用。

这个约定方法也引起了争议。如果机器里有多个网络适配器,本地IP允许你指定用哪个适配器。如果你忽略了这个争议性问题,控件就会使用计算机控制面板设置中,在网络控制面板对话框里列出的第一个网络适配器。

在使用UDP协议时,你可以自由的切换远程主机和远程端口属性,同时保留本地端口范围。但是在使用UDP协议时,你必须在改变远程主机和远程端口属性时关闭连接。

共4页。

--------------------------------------------------------------------------------

VB6.0开发网络应用的5个技巧

Visual Basic 6.0(以下简称VB 6)以其强大的功能为广大软件开发人员所喜爱,被用来开发各种应用程序。随着Internet的迅猛发展,VB 6在网络方面的应用开发也越来越多。本文介绍笔者在实际编程开发中总结的5个技巧,希望能为进行网络开发的朋友们提供一点参考。

连通检测

许多应用程序常常需要在程序中直接进行联网操作,以便进行一些必要的处理(如在线注册和在线帮助等),这就要求我们在程序中建立某些连接。很多软件在不知用户是否联网的情况下就启动浏览器查找网址,结果只能查出一错误网页,既浪费用户时间又没有任何效果。如果应用程序在查找网页之前能自动判断用户是否已经联网,就会节约许多时间,提高程序运行效率。

下面是实现网络连通检测的VB 6代码:

Private Sub Form_Load()

If IsConnected = TRUE Then

MsgBox (“您已经连通了Internet!”)

End If

If IsConnected = FALSE Then

MsgBox (“您还没有连通Internet!”)

End If

End Sub

Option Explicit

/*有关的API声明和定义*/

Public Declare Function RasEnumConnections Lib “RasApi32.dll” Alias “RasEnumConnectionsA” (lpRasCon As Any, lpcb As Long, lpcConnections As Long) As Long

Public Declare Function RasGetConnectStatus Lib “RasApi32.dll” Alias “RasGetConnectStatusA” (ByVal hRasCon As Long, lpStatus As Any) As Long

/*常数和变量的设定*/

Public Const RAS95_MaxEntryName = 256

Public Const RAS95_MaxDeviceType = 16

Public Const RAS95_MaxDeviceName = 32

Public Type RASCONN95

dwSize As Long

hRasCon As Long

szEntryName(RAS95_MaxEntryName) As Byte

szDeviceType(RAS95_MaxDeviceType) As Byte

szDeviceName(RAS95_MaxDeviceName) As Byte

End Type

Public Type RASCONNSTATUS95

dwSize As Long

RasConnState As Long

dwError As Long

szDeviceType(RAS95_MaxDeviceType) As Byte

szDeviceName(RAS95_MaxDeviceName) As Byte

End Type

/*函数IsConnected返回连通的状态,如果为True则表示已连通*/

Public Function IsConnected() As Boolean

Dim TRasCon(255) As RASCONN95

Dim lg As Long

Dim lpcon As Long

Dim RetVal As Long

Dim Tstatus As RASCONNSTATUS95

TRasCon(0).dwSize = 412

lg = 256 * TRasCon(0).dwSize

RetVal = RasEnumConnections(TRasCon(0), lg, lpcon)

If RetVal <> 0 Then

MsgBox “错误”

Exit Function

End If

Tstatus.dwSize = 160

RetVal = RasGetConnectStatus(TRasCon(0)

.hRasCon,Tstatus)

If Tstatus.RasConnState = &H2000 Then

IsConnected = TRUE

Else

IsConnected = FALSE

End If

End Function

启动拨号网络中的连接

由于拨号网络不是一个可执行文件,所以要启动拨号网络,需要借助explorer.exe 。但若是要启动拨号网络中的某一个连接,则要借助rundll.exe 和 rnaui.dll两个文件。启动方法如下(假定此连接名称为163):

Shell “rundll rnaui.dll,RnaDial 163”,vbNormalFocus

上面假定了连接名称,但在实际编程中我们是不知道连接名称的。在窗体上放置一个命令按钮(cmdCallConnect),在其单击事件中进行连接处理。下面的代码介绍如何取得默认的连接名称并启动它:

Option Explicit

/*有关的API声明*/

Private Declare Function RegOpenKeyEx Lib “advapi32” Alias

“RegOpenKeyExA” (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

Private Declare Function RegQueryvalueEx Lib “advapi32” Alias “RegQueryvalueExA” (ByVal hKey As Long, ByVal lpvalueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal szData As String, ByRef lpcbData As Long) As Long

Private Declare Function RegCloseKey Lib “advapi32”(ByVal hKey As Long) As Long

/*常数的设定*/

Const HKEY_CURRENT_USER = &H80000001

Const ERROR_SUCCESS = 0

在命令按钮(cmdCallConnect)中加入如下代码:

Private Sub cmdCallConnect_Click()

/*启动默认拨号连接*/

Shell “rundll rnaui.dll,RnaDial” +GetConnect, vbNormalFocus End Sub

/*取得连接的函数(GetConnect)*/

Public Function GetConnect() As String

Dim hKey As Long

Dim SubKey As String

/*主键*/

hKey = HKEY_CURRENT_USER

/*子键*/

SubKey = “RemoteAccess”

/*取得默认连接名*/

GetConnect=GetRegvalue(hKey,SubKey, “Default”)

End Function

/*取得注册的函数(GetRegvalue)*/

Public Function GetRegvalue(hKey As Long,lpszSubKey As String,szKey As String) As Variant

On Error GoTo ErrorRoutineErr:

Dim phkResult As Long

Dim lResult As Long

Dim szBuffer As String

Dim lBuffSize As Long

/*创建缓冲区*/

szBuffer = Space(255)

lBuffSize = Len(szBuffer)

/*打开注册键*/

RegOpenKeyEx hKey, lpszSubKey, 0, 1,phkResult

/*取得查询结果*/

lResult = RegQueryvalueEx(phkResult, szKey, 0, 0, szBuffer, lBuffSize) /*关闭注册键*/

RegCloseKey phkResult

/*返回结果*/

If lResult = ERROR_SUCCESS Then

GetRegvalue = Left(szBuffer, lBuffSize - 1)

Else

GetRegvalue =“”

End If

Exit Function

/*意外处理*/

ErrorRoutineErr:

GetR egvalue =“”

End Function

设计E-mail的接收部分

在VB 6菜单上点击“工程/部件...”,弹出“部件”对话框,在对话框的控件卡中选中Microsoft MAPI Controls 6.0控件,点击“确定”按钮后,工具箱上增加了MAPIMessage和MAPISession两个图标。

在Form上加入一个MAPIMessage控件,取名为MAPIMessage1;再加入一个MAPISession控件,取名为MAPISession1;再加入三个TextBox控件,分别取名为Subject、Content和Indexno,将它们的Caption分别改为邮件标题、邮件内容和邮件索引号;在TextBox前各加入一个Label控件,将Caption分别改为标题、内容和索引号。

将MAPIMessage1的各项属性设置如下:

·DownLoadMail=TRUE;

·LogonUI=TRUE;

·NewSession=FALSE;

·UserName=“接收E mail”。

在Form上加入一个按钮(Getmail),将其Caption改为取邮件。

在 Getmail_Click()事件中加入以下程序代码,程序的功能是使我们接收E mail。

MAPIMessage1.Fetch

Form1.Caption=MAPIMessage1.MsgCount

MAPIMessage1.MsgIndex=CINT(Indexno.text)

Subject.Text = MAPIMessage1.MsgNoteText

Content.Text = MAPIMessage1.MsgSubject

其中Fetch命令用来将信件抓到系统存储器的inbuffer中。我们将信件抓回来后,可以通过MsgCount属性知道信件数量,接着可以用MsgIndex设置要看哪一封信件的内容、标题等。

设计E-mail的发送部分

1.参数设置

进入Exchange系统,选择新增设置文件后屏幕上会显示所需要的信息服务,选择Internet Mail。

把设置文件的名称设为test。屏幕会显示两个选项,您可以选择以Modem 方式或以Network 方式连接。笔者所用的是Modem方式;假若您是使Internet 专线,就要选择Network 方式。

选择Modem方式后,Exchange会要求我们输入邮件服务器的IP地址。接着将Transform Message的模式设置为Automatic,这样当我们连接到邮件服务器时,新的信息会自动下载到本地端。接下来,将您所使用的E mail地址、全名、口令和下载路径等一一设置好。

2.程序设计

在Form上加入一个MAPIMessage控件,取名为MAPIMessage1;加入一个MAPISession控件,取名为MAPISession1;并加入三个TextBox控件,取名为Subject、Content和Addr。并在三个TextBox前各加入一个Label,将Caption 分别改为标题、内容和地址。

将MAPIMessage1的各项属性设置如下:

·DownLoadMail=TRUE;

·LogonUI=TRUE;

·NewSession=FALSE;

·UserName=“发送E mail”。

这里将DownLoadMail设置为TRUE,当程序和邮件服务器第一次连接时,会将新的邮件下载到本地端。将LogonUI设置为TRUE,则当您程序中Logon名称输入错误时,系统会显示一个Message Box来让您输入正确的名称。

由于这个程序仅使用一个Session,所以可将NewSession设置成FALSE。如果您有许多Session要建立的话,则将它设置成TRUE。UserName中所填的,是我们在Exchange中所新增的设置文件名称,如果没有填内容的话,系统将会显示一些Message Box请您输入文件。

在Form上加入三个按钮,Logon、Logoff和Send,并分别将它们的Caption 改为登录、离网和发送。

在 Logon_Click()事件中加入以下程序代码,程序的功能是使我们登录到邮件服务器:

MAPISession1.SignOn

MAPIMessage1.SessionID=MAPISession1.SessionID

sgBox “Your ID is” + Str

(MAPISession1.SessionID)

其中MAPISession1.SignOn是作登录的动作。在登录时,因为已经将MAPIMessage1控件的DownLoadMail属性设置为TRUE,所以可以在屏幕上看到Message Box,显示系统正在下载邮件。登录成功后,系统会传回一个SessionID,将该ID填入MAPIMessage1的SessionID中,这样就可以利用该Session来传送E mail,同时用Message Box通知用户发送成功。

在Logoff_Click()事件中加入以下程序代码,程序的功能是使我们离开邮件服务器:

MAPIS1.SignOff

在Send_Click()事件中加入以下程序代码,程序的功能是使我们发送E mail:

https://www.wendangku.net/doc/cb11639425.html,pose

MAPIMessage1.RecipDisplayName = Addr.text

MAPIMessage1.AddressResolveUI = TRUE

MAPIMessage1.MsgSubject = Subject.text

MAPIMessage1.MsgNoteText = Content.text

MAPIMessage1.Send

MsgBox “您发送成功啦!”

其中Compose命令的主要目的是使您可以改变RecipDisplayName的内容,将所需传送的E mail地址、主题和文章内容分别填入RecipDisplayName、MsgSubject和MsgNoteText,接着用Send命令发送出去

[b]访问Internet并调用Explorer

1.实现方法和控件介绍

首先在VB 6菜单上点击“工程/部件...”,弹出“部件”对话框,在对话框的控件卡中选中Microsoft Internet Controls控件,点击“确定”按钮后工具箱上增加一个WebBrowser图标,将它加到Form中。

该控件有以下几个重要的方法和事件:

·GoHome:装入IE设定的起始页;

·Navigate:装入页面,如Object.Navigate url,其中url为URL地址,如https://www.wendangku.net/doc/cb11639425.html,;

·GoBack:返回上一个页面;

·GoForward:进入下一个页面;

·Stop:停止载入页面;

·BeforeNavigate Event:在每次装入页面前调用该事件;

·StatusTextChange Event:每次浏览器的操作状态改变时调用该事件。

2.具体的访问方法

将WebBrowser图标添加到Form中。并在Form上添加4个命令按钮,Name 属性分别为:GoButton、BackButton、ForwardButton和StopButton,通过这4个命令按钮可以实现对浏览器的操作。在Form上添加一个TextBox控件,用来输入和显示当前的页面地址。在Form上添加一个Label控件,用来显示当前浏览器操作状态。

/*载入Form*/

Private Sub Form_Load()

/*程序装入后进入IE设定的起始页*/

WebBrowser1.GoHome

End Sub

/*改变Form尺寸*/

Private Sub Form_Resize()

/*改变窗口大小后同时改变控件的大小*/

WebBrowser1.Width = Form1.ScaleWidth

WebBrowser1.Height = Form1.ScaleHeight - 900

Label1.Width = Form1.ScaleWidth

Label1.Top = Form1.ScaleHeight - 300

End Sub

Private Sub BackButton_Click()

/*返回上一个页面*/

WebBrowser1.GoBack

End Sub

Private Sub ForwardButton_Click()

/*进入下一个页面*/

WebBrowser1.GoForward

End Sub

Private Sub GoButton_Click()

/*浏览输入的页面*/

WebBrowser1.Navigate (Text1.Text)

End Sub

Private Sub StopButton_Click()

/*停止浏览*/

WebBrowser1.Stop

End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)

/*输入地址后进行浏览*/

If KeyAscii = 13 Then

WebBrowser1.Navigate (Text1.Text)

End If

End Sub

Private Sub WebBrowser1_BeforeNavigate(ByVal URL As String, ByVal Flags As Long, ByVal TargetFrameName As String, PostData As Variant, ByVal Headers As String, Cancel As Boolean)

/*将当前显示的页面的URL地址显示在Text1上*/

Text1.Text = URL

End Sub

Private Sub WebBrowser1_StatusTextChange(ByVal Text As String)

/*Label1显示当前页面装入情况*/

Label1.Caption = Text

End Sub

--------------------------------------------------------------------------------

VB6实现局域网多站点互连完全手册

随着时代的发展,我们已经步入了信息化时代,网络的普及和应用,使得越来越多的编程人员加入网络软件开发的行列。不过现在对于比较完整的介绍在局域网中多个站点互连的文章,笔者还未见到,这篇文章较完整的介绍了如何利用Visual Basic 6的Winsock控件实现局域网中多个站点在客户机/服务器模式下的互连,并给出了几种连接方案进行比较,对于Winsock编程过程中遇到的一些问题做了解答。

这里对Winsock控件的属性、方法和事件的介绍限于篇幅就不介绍了,下面以最简单的C/S模式下一台服务器和一台客户机的连接来说明其整个连接过程。

用框图表示如图1所示。首先运行服务器端的程序,使TcpServer处于监听状态,然后运行客户机端的程序,单击【连接服务器】按钮后,客户机端调用Connect方法呼叫服务器(根据RemoteHostIP远程计算机IP地址和RemotePort 远程计算机端口号两个参数),然后客户机便处于正在连接服务器状态,等待服务器的响应。客户机调用Connect方法触发了服务器ConnectRequest事件,这时服务器端可以在此事件中判断是否要接受客户机的请求,如要就调用Accept 方法,并置标志位说明已成功连接客户机。服务器端调用Accept方法后又触发了客户机端Connect事件,说明服务器端接受客户端的请求,双方已经建立连接了,这时再置客户机端的标志位,这就是一个完整的连接过程。当服务器或客户机调用Close方法关闭连接时,都会触发对方的Close事件,使其关闭连接。另外建立连接后发送数据的情况是客户机通过调用SendData方法发送数据给服务

器,会触发服务器端的DataArrival事件,在这个事件中,服务器端可以调用GetData或PeekData方法把客户机发来的数据保存起来。服务器给客户机发信息同理。要注意一点的是,在服务器的Close事件中应该加上继续监听的代码,这样客户机才可以继续呼叫服务器。

Winsock控件实现多机互连方案

下面是实现多机互连的三种方案。这里以三台机(分别命名为1号机、2号机和3号机)为例介绍。

方案一:一台机作为服务器,其余两台机作为客户机

1号机作为服务器,用一个Winsock控件数组负责监听客户机的呼叫请求并用来与客户机建立连接。用TcpServer(2)和TcpServer(3)两个Winsock控件数组分别与2号机和3号机建立连接。

这里采用的是动态加载和卸载Winsock控件数组来实现连接的,也就是服务器一定要开着,下面的客户机才能与其通过Winsock控件实现通讯,当服务器已经与其中的一台建立连接后,其它客户机还要呼叫服务器时,服务器就会加载新的Winsock控件来与其建立连接,当客户机退出连接时,服务器再卸载该Winsock 控件。服务器建立连接时是根据客户机的IP地址来接受响应的,所以可以方便的区分不同客户机的呼叫请求。

不过这种方案会遇到一些问题:比如只要服务器关闭,其它客户机之间就无法进行数据交换了,而在服务器开的情况下,可以通过服务器的转发来完成客户机之间的数据交换。

方案二:三台机同时作为服务器和客户机

1号机、2号机和3号机没有层次等级之分,采用C/S模式。比如1号机既可以作为服务器接受其它两台机的呼叫请求,又可以作为客户机对其它两台机进行呼叫。用1号机做个比方:在1号机程序窗口中用两个Winsock控件数组,分别命名为TcpServer和TcpClient,TcpServer(0)用来对客户机进行监听,TcpServer(2)和TcpServer(3)是动态加载用来接受相应的客户机的请求来建立连接的。而TcpClient(2)和TcpClient(3)不是动态加载的,而是在Form_Load初始化过程中加载,用来呼叫相应的服务器。

这样也是可以实现多机互连的,不过也有些问题。如果1号机作为客户机呼叫2号机并已经收到2号机的响应建立了一条通讯链路,这时1号机又作为服务器接收到2号机的呼叫请求,并且也建立了一条通讯链路。这样二台机之间建立了两条链路,理论上两台机只要有一条链路就可以正常通讯,现在建立了两条链路,收发数据是否正常呢?通过测试,收发数据不会出错:当1号机给2号机发

数据时,是通过1号机的TcpServer(2)或TcpClient(2)发送数据给2号机,而2号机是通过其TcpClient(1)或TcpServer(1)接收1号机的数据,双方两条链路互不干扰。不过这种方案还是不太可取,因为加载控件需要占用内存资源,每两台机之间其实只需一条链路就能正常通讯,现在又多了条链路,这对系统有限的资源是极大的浪费。

方案三:三台机有差互连

先解释一下什么叫有差互连。具体做法是:1号机只作为服务器监听2号和3号机的呼叫请求而不呼叫它们;2号机既是客户机又是服务器:作为客户机只呼叫1号机,而作为服务器监听3号机的呼叫请求;3号机只作为客户机对1号机和2号机进行呼叫,而不具备服务器监听的功能。所以说这几台机的连接是有差的,这种连接方式不会在两台机之间建立两条链路,因为网络中任意两台机只有一台可以呼叫对方或监听对方的呼叫请求,这样无论如何都不会产生两条通讯链路,节省了系统资源,又满足了局域网中任意两台机互连的要求,由此看来这个方案是最优方案。

下面介绍方案三的实现过程。

1号机

1号机的窗体(Form)上放置两个Winsock控件,一个名为TcpLsn,负责监听2号机和3号机的呼叫请求,另外一个为TcpConn,这是个控件数组,Index 为2,即已经加载了TcpConn(2),这个控件是为了和2号机建立连接。在初始化过程中(Form_Load)设置服务器的监听端口号(TcpLsn.LocalPort)并使其处于监听状态(TcpLsn.Listen),并置与客户机连接成功的标志(TcpConnected 数组,布尔型常量)为False。当TcpLsn监听到某个客户机的呼叫请求后(具体是哪个客户机是根据客户机IP地址判断),在TcpLsn的ConnectionRequest 事件中动态加载TcpConn控件并调用Accept方法接受客户机的请求,与其建立连接(如果客户机是2号机,则无需再加载控件,因为在Form_Load中已经加载过了)。要注意的是,TcpLsn只是用来监听客户机的呼叫请求,而不是用来与客户机建立连接的,TcpConn控件数组才是与客户机建立连接的。当某一客户机断开连接时,会触发Tcpconn控件数组的Close事件,在这里可以根据客户机的IP地址来调用Close方法关闭与其相连的Tcpconn控件,并动态卸载之。同样TcpConn(2)不能卸载,因为其不是动态加载的。

2号机

2号机窗体(Form)上也放置两个Winsock控件,一个名为TcpLsn,负责监听3号机的呼叫请求,另外一个为TcpConn,这是个控件数组,Index为1,即已经加载了TcpConn(1),这个控件是为了与1号机建立连接。在初始化过程中(Form_Load)同样要设置2号机作为服务器的监听端口号,然后使其处于监听状态,还要设置与其他几个站点连接成功的标志:TcpConnected(数组)。2号机作为服务器监听的过程同上,而呼叫1号机是通过VB6的定时器(Timer)实现的,定时器的作用是每隔一段时间(可自行设定间隔事件)触发Timer事件,

即执行Timer事件中的代码,利用这个原理就可以实现一运行此程序就自动进行呼叫工作,首先将定时器间隔时间定为1000毫秒(定时器命名为TimConn,TimConn.Interval = 1000),然后在定时时间到事件中(TimConn_Timer)调用TcpConn的Connect方法呼叫1号机,当然要加一个判断:当TcpConnected(1)=False且TcpConn(1).State=sckClosed时才进行呼叫。

在客户机调用了TcpConn方法后,其连接状态是sckConnecting(正在连接服务器,值为6)。如果此时1号机在一段时间内(连接服务器超时时间)没有接受请求或者根本没有开启,那么就会触发连接错误事件(TcpConn_Error),这时连接状态是sckError(连接错误,值为9),就无法再进行连接服务器的工作了,如果1号机此时打开,客户机也不会再呼叫服务器了。要解决这个问题,可以在TcpConn的错误事件中(TcpConn_Error)加上一条语句:TcpConn (Index).Close即在错误事件中关闭当前的连接,使当前TcpConn控件状态处于sckClosed,这样在下一次的定时时间到事件中客户机又能呼叫1号机了。呼叫1号机成功后,不要忘记在TcpConn的Connect事件中置连接1号机成功的标志位。同样要注意关闭事件中不能卸载TcpConn(1)。

3号机

3号机在所有站点中只呼叫1号机和2号机。所以只要一个Winsock控件数组即可,命名为TcpClient,Index=1。在程序初始化过程中,加载呼叫服务器的所有Winsock控件:Load TcpClient(2)

TcpClient(1)已经放在窗体中了,故不必重复加载。还要设置连接成功的标志位(TcpConnected数组为False),并设置定时器间隔时间。然后在定时时间到事件中调用TcpClient的Connect方法连接服务器,这与2号机作为客户机呼叫服务器的过程类似,同样要在TcpClient的连接错误事件中添加以下语句:TcpClient(Index).Close。要注意的是在服务器的断开连接触发的客户机关闭事件中(TcpClient_Close)只需要置标志位,而不能卸载TcpClient控件数组,因为其不是动态加载的。

到此为止,基本上实现了运行此程序即进行多机互连的功能。

典型问题解析

1.各个站点建立连接后关闭3号机的程序,在其它的站点就会弹出对象已加载的错误提示。出现这个错误的可能原因是Winsock控件已经加载,而后又执行了一次加载动作。不过实验证明不是此Winsock控件被重复加载。在微软公司的官方网站,VB6最新的Service Pack 5补丁(SP5)的说明文档中有这样一条很重要的修正说明:重复加载或卸载Winsock控件会引起内存泄露。这一修正是不是可以针对用Winsock控件实现网络连接及通讯的程序呢?理论实践证明了这一猜测的真实性。下载完SP5并成功安装后,将程序原封不动运行一遍,“对象已加载”的错误窗口就再没出现过,这个问题也就成功的解决了。

2.由于设置了客户机的本地端口号(LocalPort),导致必须先关闭服务器再关闭客户机才能在下一次正常连接以及客户机异常退出时(比如客户机突然停

Excel常用函数及使用方法

excel常用函数及使用方法 一、数字处理 (一)取绝对值:=ABS(数字) (二)数字取整:=INT(数字) (三)数字四舍五入:=ROUND(数字,小数位数) 二、判断公式 (一)把公式返回的错误值显示为空: 1、公式:C2=IFERROR(A2/B2,"") 2、说明:如果是错误值则显示为空,否则正常显示。 (二)IF的多条件判断 1、公式:C2=IF(AND(A2<500,B2="未到期"),"补款","") 2、说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 (一)统计两表重复 1、公式:B2=COUNTIF(Sheet15!A:A,A2) 2、说明:如果返回值大于0说明在另一个表中存在,0则不存在。 (二)统计年龄在30~40之间的员工个数 公式=FREQUENCY(D2:D8,{40,29} (三)统计不重复的总人数 1、公式:C2=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 2、说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

(四)按多条件统计平均值 =AVERAGEIFS(D:D,B:B,"财务",C:C,"大专") (五)中国式排名公式 =SUMPRODUCT(($D$4:$D$9>=D4)*(1/COUNTIF(D$4:D$9,D$4:D$9))) 四、求和公式 (一)隔列求和 1、公式:H3=SUMIF($A$2:$G$2,H$2,A3:G3) 或=SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 2、说明:如果标题行没有规则用第2个公式 (二)单条件求和 1、公式:F2=SUMIF(A:A,E2,C:C) 2、说明:SUMIF函数的基本用法 (三)单条件模糊求和 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 (四)多条求模糊求和 1、公式:=SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 2、说明:在sumifs中可以使用通配符* (五)多表相同位置求和 1、公式:=SUM(Sheet1:Sheet19!B2) 2、说明:在表中间删除或添加表后,公式结果会自动更新。

excel 函数的公式语法和用法

SUMIF 函数的公式语法和用法。 说明 使用SUMIF函数可以对区域中符合指定条件的值求和。例如,假设在含有数字的某一列中,需要让大于5 的数值相加,请使用以下公式: =SUMIF(B2:B25,">5") 在本例中,应用条件的值即要求和的值。如果需要,可以将条件应用于某个单元格区域,但却对另一个单元格区域中的对应值求和。例如,使用公式=SUMIF(B2:B5, "John", C2:C5)时,该函数仅对单元格区域C2:C5 中与单元格区域B2:B5 中等于“John”的单元格对应的单元格中的值求和。注释若要根据多个条件对若干单元格求和,请参阅SUMIFS 函数。 语法 SUMIF(range, criteria, [sum_range]) SUMIF函数语法具有以下参数: range必需。用于条件计算的单元格区域。每个区域中的单元格都必须是数字或名称、数组或包含数字的引用。空值和文本值将被忽略。 criteria必需。用于确定对哪些单元格求和的条件,其形式可以为数字、表达式、单元格 引用、文本或函数。例如,条件可以表示为32、">32"、B5、32、"32"、"苹果" 或TODAY()。 要点任何文本条件或任何含有逻辑或数学符号的条件都必须使用双引号(") 括起来。如果条件为数字,则无需使用双引号。

sum_range可选。要求和的实际单元格(如果要对未在range 参数中指定的单元格求和)。 如果sum_range参数被省略,Excel 会对在range参数中指定的单元格(即应用条件的单元格)求和。 注释 sum_range 参数与range参数的大小和形状可以不同。求和的实际单元格通过以下方法确定:使用sum_range参数中左上角的单元格作为起始单元格,然后包括与range参数大小和形状相对应的单元格。例如: 如果区域是并且sum_range 是则需要求和的实际单元格是 A1:A5 B1:B5 B1:B5 A1:A5 B1:B3 B1:B5 A1:B4 C1:D4 C1:D4 A1:B4 C1:C2 C1:D4 可以在criteria参数中使用通配符(包括问号(?) 和星号(*))。问号匹配任意单个字符; 星号匹配任意一串字符。如果要查找实际的问号或星号,请在该字符前键入波形符(~)。示例 示例1 如果将示例复制到一个空白工作表中,可能会更容易理解该示例。 如何复制示例? 1.选择本文中的示例。

Winsock控件基础(VB6.0)

Winsock控件基础(VB6.0) 1.Winsock控件基础 Winsock控件在程序设计时,看不到这个控件显现在执行的窗体之中,但是它可以提供有关网络通讯方面的程序设计依据。此外,在这个控件的使用上,您可以非常容易地要求控件为您调用TCP或是UDP网络服务的功能。因此,当您在编写有关住从式架构的应用程序时,您可以不需要了解TCP 通讯协议或是低级的Winsock api调用方式。 通常,以笔者的经验,除了必须与标准通讯协议进行互动外,仅仅是进行一般性相互通讯、交换数据时,Winsock控件可以满足您的要求。因此您可以非常容易地通过属性的设置以及控制方法的调用,与远程的设备进行连接并且相互交换信息。关于这些应用方面以及调用方式,笔者将在接下的探索中,慢慢地研究Winsock的应用方式。 1-1TCP基础 不论是在Internet或是Internet网络之中,以目前流行的趋势,多半都会使用TCP协议来进行远程设备的连接。TCP 协议的全名为“传输控制协议(transfer control protocol)”,这是一种在Internet上使用的主要协议,例如http,ftp,smtp 等,都是属于这个中面向连接的协议。因此,当您使用TCP 协议连接两个网络上的设备时,将可以在它们之间交换希望

交换的数据。 同时,如果您开发的应用程序属于主从式应用架构(或是 n-tear(多层次))应用系统时,将必须要知道应用系统主机的ip地址(利用RemoteHost属于取得)以及连接端口号(利用remoteport属于取得)。在这些数据完全备齐之后,您才可以进行进一步的调用、连接。 因此,如果正在建立主机端应用程序时,必须指定本机,必须指定本机(执行应用程序所在的计算机)所用的连接端口号(localport属于),接着将Winsock控件设置为“监听(listen)”,即可等候远程客户端进行调用与连接。因此,当主机端接收到客户端调用并且要求连接的信息时,将会触发“要求连接()”的事件,接着进行标准“允许”或是“拒绝”的程序。 一旦主机端与客户端连接完成之后,您将可以开始使用“传送数据(senddata)”方法,将数据传送给对方,并且利用“传送完成(sendcomplete)”事件,来检测数据是否传送完毕。同时,在数据传达对方的计算机时,将会触发对方计算的“接收数据(dataarrival)”事件。此时,您可以使用“取得数据(getdata)”方法,来去出这些接收到的数据。 上述的程序将周而复始地发生,直到发生“中断连接(closed)”事件或是不正常断线为止。这种连接与数据传输的方式,则是属于Winsock控件TCP协议的运行特色。图1-1所示为

Winsock控件使用手册

Winsock控件使用手册 TCP基本知识 TCP(Transfer Control Protocol)允许你创建并维护一个与远程计算机的连接,使用该连接,两台计算机之间就可以交换数据了。 如果你在创建一个客户应用程序,你必须知道服务器计算机的名字 用RemoteHost属性,监听的端口号RemotePort属性,调用Connect方法。 创建服务器应用程序,设置要监听的端口号,调用Listen方法。 当客户建立连接请求时,产生ConnectionRequest事件。要完成该连接,在ConnectionRequest 事件中调用Accept方法。 一旦建立了连接,两台计算机之间就可以发送和接受数据了。 发送数据,调用SendData方法。 接受数据,产生DataArrival事件。在DataArrival事件中调用GetData方法来检取数据。 UDP基本知识 UDP(User Datagram Protocol)是无连接的协议。 与TCP操作不同,计算机并不建立一个连接。并且,UDP应用程序可以是客户也可以是服务器。 传输数据,设置客户计算机的LocalPort属性,指发送方只需要将RemoteHost属性设置为客户计算机及指接收方的IP地址,将RemotePort属性设置为客户计算机上的LocalPort,调用SendData发送数据。客户计算机在DataArrival中使用GetData检取数据。 Winsock控件的属性 BytesReceived属性, LocalHostName属性, LocalIP属性, LocalPort属性, RemoteHost属性(ActiveX控件), SocketHandle属性, State属性(Winsock控件), Protocol属性(Winsock控件), Name属性, Parent属性, RemoteHost属性(ActiveX控件), RemotePort属性(ActiveX控件), Index属性(ActiveX控件), Tag属性(ActiveX控件), Object属性(ActiveX控件)。 Winsock控件的方法 Accept方法, Bind方法, Close方法(Winsock控件), Listen方法,PeerData方法,

sumifs函数多条件求和实例

s u m i f s函数多条件求和实 例 Prepared on 22 November 2020

sumifs函数多条件求和实例 内容提要:文章首先介绍sumifs函数基本用法,然后以一个综合的实例来剖析sumifs函数的详细深入使用。 第一部分,sumifs函数用法介绍 excel中sumifs函数是2007以后版本新增的多条件求和函数。 sumifs函数的语法是:SUMIFS(求和区域,条件区域1,条件1,[条件区域2,条件2],...) 说明:[]以内的条件区域2、条件2为可选参数。最多允许127个区域/条件对。 第二部分,sumifs函数实例介绍 项目一:客户A的销售额 =SUMIFS(C2:C10,A2:A10,A2) 项目二:客户A的1月份销售额 =SUMIFS(C2:C10,A2:A10,A2,B2:B10,B2) 项目三:客户A的1月份和3月份销售额 =SUM(SUMIFS(C2:C10,A2:A10,A2,B2:B10,{1,3})) 项目四:客户A和C的销售额 =SUM(SUMIFS(C2:C10,A2:A10,{"A","C"})) 项目五:客户A和C的1月份销售额合计 =SUM(SUMIFS(C2:C10,A2:A10,{"A","C"},B2:B10,B2)) 项目六:客户A的1月份和客户C的3月份销售额合计 =SUM(SUMIFS(C2:C10,A2:A10,{"A","C"},B2:B10,{1,3})) 项目七:客户A和客户C的1月份\3月份\4月份销售额合计 =SUM(SUMIFS(C2:C10,A2:A10,{"A","C"},B2:B10,{1;3;4}))

基于VB6.0的winsock控件的远程数据传输的方法

【摘要】在Visual Basic 6.0 环境下,利用Winsock控件实现与远程数据采集端连接和数据传输。与传统数据传输方法进行比较,该方法简单且易于实现,并充分利用了网络资源。介绍了Winsock控件,结合示例程序,说明了该方法实现流程。最后通过实验,证实该方法进行远程数据传输的可靠性。 【关键词】数据传输;协议;VB6.0;Winsock控件 在远程数据采集和传输系统中,传统的方法有 2 种:一是采用RS-485进行远程控制;二是通过调制解调器进入电话线来实现远程控制,然而这2 种方法都有自己的缺点。这样一来就限制了它们的应用范围。 本文介绍了在VB6.0中利用Winsock控件来实现服务器端与远程客户端建立连接并进行数据传输的方法。 一、基于Winsock控件的远程数据传输 (一) Winsock控件简介 Microsoft提供的Winsock控件,是ActiveX控件的一种。在VB 中可以将其添加到工具箱中以便使用。在程序运行时,Winsock控件是不可见的,但通过对其属性、方法、事件的设置及应用可轻松地实现计算机间的远程连接,该控件为用户提供了访问TCP和UDP网络及其方便的途径,不需要了解低级Winsock API调用实现的细节。VB 的Winsock控件内部几乎封装了所有的Internet协议,以类的形式提

供了属性、方法、事件,使得程序得到了极大的简化。 Winsock控件的常用属性如表1。 (二)传输协议 在使用Winsock控件时,首先要考虑使用什么通信协议。可供选择的协议有传输控制协议(TCP)和用户数据报协议(UDP),都是位于传输层的协议、使用端口号来识别应用程序,区别在于连接的状态。TCP协议是一个基于连接的协议,在收发数据前必须建立连接,并且该连接可靠性强,使数据无差错地传输,适合有确认信息的、重要的、数据量大(如声音和图像)的文件。UDP协议是不与对方建立连接而是直接就把数据报发送过去。传输速度较快也较便宜,适用于少量数据传送、可靠性要求不高的文件传输。本文中均选用TCP协议。 (三)远程数据传输系统软件设计 1、远程传输系统软件流程 软件在Visual Basic环境下开发,利用Winsock控件完成客户端与服务器端的相互通讯。 创建客户端程序时,必须知道服务器端的IP地址(RemoteHost 属性)和服务器“侦听”的端口(RemotePort 属性)然后调用Connect 方法请求与服务器连接。 创建服务器端程序时,必须设置一个收听端口(LocalPort属性)并调用Listen方法侦听端口,本论文中使用的IP地址为202.205.84.222,使用的端口号为2020。当客户端请求连接时就会发生ConnectionRequest事件。为了完成连接,可调用ConnectionRequest

【优质文档】sumif函数的使用方法word版本 (2页)

【优质文档】sumif函数的使用方法word版本 本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除! == 本文为word格式,下载后可方便编辑和修改! == sumif函数的使用方法 sumif函数的使用方法 使用SUMIF函数可以对区域(区域:工作表上的两个或多个单元格。区域中的单元格可以相邻或不相邻。)中符合指定条件的值求和。例如,假设在含有数字 的某一列中,需要让大于5的数值相加,请使用以下公式: =SUMIF(B2:B25,">5") 在本例中,应用条件的值即要求和的值。如果需要,可以将条件应用于某个单 元格区域,但却对另一个单元格区域中的对应值求和。例如,使用公式 =SUMIF(B2:B5,"俊元",C2:C5)时,该函数仅对单元格区域C2:C5中与单元格区 域B2:B5中等于“俊元”的单元格对应的单元格中的值求和。 注释若要根据多个条件对若干单元格求和,请参阅SUMIFS函数。语法 SUMIF(range,criteria,[sum_range]) SUMIF函数语法具有以下参数(参数:为操作、事件、方法、属性、函数或过程 提供信息的值。):range必需。用于条件计算的单元格区域。每个区域中的 单元格都必须是数字或名称、数组或包含数字的引用。空值和文本值将被忽略。criteria必需。用于确定对哪些单元格求和的条件,其形式可以为数字、表达式、单元格引用、文本或函数。例如,条件可以表示为32、">32"、B5、32、"32"、"苹果"或TODAY()。 要点任何文本条件或任何含有逻辑或数学符号的条件都必须使用双引号(")括起来。如果条件为数字,则无需使用双引号。sum_range可眩要求和的实际单元 格(如果要对未在range参数中指定的单元格求和)。如果sum_range参数被 省略,Excel会对在range参数中指定的单元格(即应用条件的单元格)求和。 注释sum_range参数与range参数的大小和形状可以不同。求和的实际单元格 通过以下方法确定:使用sum_range参数中左上角的单元格作为起始单元格, 然后包括与range参数大小和形状相对应的单元格。例如:如果区域是并且 sum_range是则需要求和的实际单元格是 A1:A5B1:B5B1:B5A1:A5B1:B3B1:B5A1:B4C1:D4C1:D4A1:B4C1:C2C1:D4可以在criteria参数中使用通配符(包括问号(?)和星号(*))。问号匹配任意单个字符;星号匹配任意一串字符。如果要查找实际的问号或星号,请在该字符前键 入波形符(~)。注解使用SUMIF函数匹配超过255个字符的字符串时,将返回不正确的结果#VALUE!。示例示例1

VB中Winsock控件的使用

VB中Winsock控件的使用 -------------------------------------------------------------------------------- 前一段时间,一个名叫Y AI的‘病毒’在我国闹的沸沸扬扬,许多不明真相的人对他感到神秘莫测,可是究其实质无非也就是一个远程控制软件罢了,只不过他的服务器端程序隐藏的十分好而已。其实在VB5中有一个基于TCP\IP协议的Winsock控件,利用他改改属性,写几段代码,我们同样可以来一回Y AI.由于篇幅所限,在这里我们只来看看对远程计算机的重启,关闭功能室如何实现的。打开VB5后,在工具箱中并不能看到Winsock控件,通过鼠标右键单击工具箱点“部件”,再将“Microsoft Winsock Control 5.0”选中确定后,就可以将Winsock控件添加到工具箱中了。 远程控制功能是基于客户机/服务器这一模型来实现的,所以程序的编制也应分两部分进行:一部分是服务器端--也就是被控制的一方,另一部分是客户端--控制方。服务器程序要守侯在一个固定或不固定的网址(IP)上等待客户程序的请求;客户程序则向服务器程序所在的网址请求连接,连接成功后通过交换信息即可得到相应的服务。因此设置Winsock属性时,服务器端应设置LocalPort和应用Listen方法进行监听,客户程序则要设置RemoteHost 和RemotePort及应用Connect方法请求连接,并用Senddata方法互换信息。下面是Winsock 控件的相关属性,方法和事件。(略去一些暂用不到的) *属性 ------------------------------------------------------------------------- LocalHostName | 本地机器名 LocalIP | 本地机器IP地址 LocalPort | 本地机器通信程序的端口(0<端口<65536) RemoteHost | 远程机器名 RemotePort | 远程机器的通信程序端口 state | 连接的当前状态(文后有详细说明) Protocal | 使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’) -------------------------------------------------------------------------- *方法 -------------------------------------------------------------------------- Listen Listen方法用于服务器程序,等待客户访问。 格式:Winsock对象.listen Connect Connect方法用于向远程主机发出连接请求 格式:Winsock对象.connect [远程主机IP,远程端口] Accept Accept方法用于接受一个连接请求 格式:Winsock对象.accept Request ID Senddata 此方法用于发送数据

Excel中sumif和sumifs函数进行条件求和的用法

Excel中sumif和sumifs函数进行条件求和的用法 sumif和sumifs函数是Excel2007版本以后新增的函数,功能十分强大,实用性很强,本文介绍下Excel中通过用sumif和sumifs函数的条件求和应用,并对函数进行解释,希望大家能够掌握使用技巧。 工具/原料 Excel 2007 sumif函数单条件求和 1. 1 以下表为例,求数学成绩大于(包含等于)80分的同学的总分之和 2. 2 在J2单元格输入=SUMIF(C2:C22,">=80",I2:I22)

3. 3 回车后得到结果为2114,我们验证一下看到表中标注的总分之和与结果一致 4. 4 那么该函数什么意思呢?SUMIF(C2:C22,">=80",I2:I22)中的C2:C22表示条件数据列,">=80"表示筛选的条件是大于等于80,那么最后面的I2:I22就是我们要求的总分之和

END sumifs函数多条件求和 1. 1 还是以此表为例,求数学与英语同时大于等于80分的同学的总分之和 2. 2 在J5单元格中输入函数=SUMIFS(I2:I22,C2:C22,">=80",D2:D22,">=80")

3. 3 回车后得到结果1299,经过验证我们看到其余标注的总分之和一致 4. 4 该函数SUMIFS(I2:I22,C2:C22,">=80",D2:D22,">=80")表示的意思是,I2:I22是求和列,C2:C22表示数学列,D2:D22表示英语列,两者后面的">=80"都表示是大于等于80

END 注意 1. 1 sumif和sumifs函数中的数据列和条件列是相反的,这点非常重要,千万不要记错咯

VB中使用WINSOCK控件编写网络程序

VB中使用WinSock控件编写网络程序 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器并进行数据交换。这两种协议都能用来创建客户端和服务端应用程序。就像定时器控件一样,WinSock控件运行时没有一个可视的界面。 可能的用途 创建客户端应用程序,它能在信息到达中央服务器之前把用户的信息收集起来。 创建服务端应用程序,它能作为来自多个用户的数据一个集中处理点。 创建“聊天”程序。 协议的选择 当我们使用WinSock控件时,首先要确定的是使用TCP还是UDP协议。它们之间主要的区别在于连接状态: TCP协议控件是一个基于连接的协议,就像电话机一样,用户必须在通话之前建立连接; UDP是一个无连接的协议,两台计算机之间的事务处理就像传纸条一样:一台计算机向另一台计算机发送消息,但是它们之间并没有一个明确的连接路径。另外,发送的单个信息量的大小取决于网络。 通常,你要创建的应用程序的类别就决定了你要选择的协议。以下是几个能够帮助你选择合适的协议的问题: 当发送或接收数据时,该应用程序需要从服务端或客户端获得认证吗?如果要的话,那么TCP协议就正好需要在发送或接受数据前建立明确的连接。 要发送的数据量大吗?(就像图片、声音文件之类)一旦建立了连接,TCP协议就会保持连接并保证数据的完整性。但是,这种连接会占用的更多的处理器资源,成本也会更高一些。 数据是陆续传输的,还是一次全部传完呢?比如,如果你要创建的应用程序在某些任务完成时会告知具体的计算机,那么选择UDP协议会更合适一些。UDP协议也更适合于发送小量数据。 协议的配置 配置你的应用程序所用到的协议:在设计阶段,单击工具窗口里的协议,选择sckTCPProtocol或sckUDPProtocol。你也可以在代码里配置协议,就像下面这样: Winsock1.Protocol=sckTCPProtocol 确定你的计算机名

sumif函数与sumifs函数

1.Sumif函数的基础用法和注意事项 Excel中,单条件求和使用比较广泛,但大部分人习惯用透视表。如果只是求有限的条件,且原始数据比较庞大,这时用透视表,透视过程占用内存,速度缓慢,最后还要筛选,显得繁杂。所以,掌握sumif函数显得很有必要。很多人对这个函数还是比较陌生的,毕竟有三个参数。今天简要介绍下,相信大家看完后,一定会惊呼:原来这么简单啊,是的,就这么简单。

需要注意的是,函数虽然简单,但实际上,容易出现这个现象:用这个公式计算,公式确实没错,但结果和原数据中手工筛选出来的数据核对,结果不一样。主要原因有:一是没搞清楚绝对引用和相对引用,导致下拉公式时,需要固定的数据区域发生了变化;二是原始表格的条件区域表格不规范,如上述城市中,部分城市后面或者前面有空格,这样公式得出的结果肯定不一样,因此可以用trim函数去掉空格,这个在vlookup函数中也会存在类似现象,需要引起大家的注意 2.Sumifs函数的基础用法和注意事项 sumifs函数功能十分强大,可以通过不同范围的条件求规定范围的和,且可以用来进行多条件求和,本文在解释语法以后再展示两个实例,以便大家更好理解sumifs函数。 sumifs函数语法 sumifs(sum_range,criteria_range1,criteria1,[riteria_range2,criteria2]...) sum_range是我们要求和的范围 criteria_range1是条件的范围 criteria1是条件 后面的条件范围和条件可以增加。 详细用法请看实例 下面这张成绩单为例,演示sumifs函数用法, 先求男生的语文成绩之和 在G2单元格输入公式=SUMIFS(C2:C8,B2:B8,"男") 得到结果是228,我们看图中男生成绩得分之和与公式得到的结果一致。 再求语文和数学得分都大于等于90分的学生总分之和 在G4单元格输入公式=SUMIFS(F2:F8,C2:C8,">=90",D2:D8,">=90") 7 看到图中语文和数学都大于等于90分的学生只有一个同学,他的总分就是247分,与公式求得的结果完全一致。 补充知识点:offset函数问题。这个函数相对有点难度。完整的说一共有五个参数。函数速成宝典第88课:Offset函数实现动态查询功能。OFFSET(reference,rows,cols,height,width). OFFSET(起始单元格或区域,向下偏移几行,向右偏移几列,返回几行,返回几列)。在这里,大家要特别注意的是:第2和第3个参数如果都是0,起始点包含本行或本列;如果第2和第3个参数为1,起始点不包含本行或本列,就往下偏移一行;第4和第5个参数如果是1,起始点是包含本行和本列。大家改动下第88课素材文件中的SUM(OFFSET(K11,1,1,4,2))公式中的参数看看,就什么都明白了。 二、column函数和columns函数的问题,两者是有区别的。大家看下第27课:Average与

在POWERBUILDER中使用WINSOCK控件的方法

---- 随着资源共享和实时通讯的需要,很多计算机应用程序早已甩开单兵作战的模式,转入联合行动。 ---- 网络在计算机世界里,越来越发挥着举足轻重的作用。在WINDOWS应用程序中,处理实时通讯最常用到的还是MICROSOFT公司提供的WINSOCK控件。许多资料都细述了WINSOCK在VB中的使用方法,就连WINDOWS本身提供的hlp文件也是针对VB而写的。笔者因为实际应用的需要,琢磨出了WINSOCK控件在PB中的应用方法。好东西不敢独自享用,拿出来与大家共享。 ---- 下面以一个简单程序为例,说明WINSOCK控件在PB中的使用: ---- 一、在窗口中添加WINSOCK控件: ---- 在应用中新开一个窗口,在窗口画板中点击controls-->OLE菜单项,弹出Insert object窗口,单击Insert control标签,从列表框中双击选定Microsoft Winsock control,将winsock的图标贴在窗口上。 ---- 在程序中该控件名称定为winsock_a(甲方)和winsock_b(乙方)。 ---- 二、设置信息输入输出文本框: ---- 在窗口中增加一个按钮cb_1,两个单行文本框sle_1,sle_2,分别用于输入要发送的字符串和接受对方发送的字符串。 ---- 三、设置通讯协议: ---- WINSOCK控件允许用户以UDP和TCP两种协议中任选一种进行通讯。 ---- 1.UDP协议设置:UDP协议是一种无连接的通讯协议,在通讯之前,需要绑定remotehost 和remoteport属性,如果需要双向通讯,还要设置localport属性。 ---- 在甲方(本机地址为:134.1.1.1)窗口的Open事件中加入如下语句: winsock_a.object.protocol=1 //winsock通讯协议设为UDP协议 winsock_a.object.remotehost="134.1.1.2" //对方的ip地址 winsock_a.object.remoteport=6000 //对方的winsock通讯端口号 winsock_a.object.localport=6001 //本机的winsock通讯端口号 winsock_a.object.bind

使用WINSOCK控件的方法

在POWERBUILDER中使用WINSOCK控件的方法 随着资源共享和实时通讯的需要,很多计算机应用程序早已甩开单兵作战的模式,转入联合行动。 网络在计算机世界里,越来越发挥着举足轻重的作用。在WINDOWS应用程序中,处理实时通讯最常用到的还是MICROSOFT公司提供的WINSOCK控件。许多资料都细述了WINSOCK在VB中的使用方法,就连WINDOWS本身提供的hlp文件也是针对VB而写的。笔者因为实际应用的需要,琢磨出了WINSOCK 控件在PB中的应用方法。好东西不敢独自享用,拿出来与大家共享。 下面以一个简单程序为例,说明WINSOCK控件在PB中的使用: 一、在窗口中添加WINSOCK控件: 在应用中新开一个窗口,在窗口画板中点击controls-->OLE菜单项,弹出Insert object窗口,单击Insert control标签,从列表框中双击选定Microsoft Winsock control,将winsock的图标贴在窗口上。 在程序中该控件名称定为winsock_a(甲方)和winsock_b(乙方)。 二、设置信息输入输出文本框: 在窗口中增加一个按钮cb_1,两个单行文本框sle_1,sle_2,分别用于输入要发送的字符串和接受对方发送的字符串。 三、设置通讯协议: WINSOCK控件允许用户以UDP和TCP两种协议中任选一种进行通讯。 1.UDP协议设置:UDP协议是一种无连接的通讯协议,在通讯之前,需要绑定remotehost和remoteport 属性,如果需要双向通讯,还要设置localport属性。

在甲方(本机地址为:134.1.1.1)窗口的Open事件中加入如下语句: winsock_a.object.protocol=1 //winsock通讯协议设为UDP协议 winsock_a.object.remotehost="134.1.1.2" //对方的ip地址 winsock_a.object.remoteport=6000 //对方的winsock通讯端口号 winsock_a.object.localport=6001 //本机的winsock通讯端口号 winsock_a.object.bind //绑定通讯协议 在乙方(本机地址为:134.1.1.2)窗口的Open事件中加入如下语句: winsock_b.object.protocol=1 //winsock通讯协议设为UDP协议 winsock_b.object.remotehost="134.1.1.1" //对方的ip地址 winsock_b.object.remoteport=6001 //对方的winsock通讯端口号 winsock_b.object.localport=6000 //本机的winsock通讯端口号 winsock_b.object.bin //绑定通讯协议 2.TCP协议设置:TCP协议在通讯前需要进行连接。 在甲方(作为服务器端)窗口的Open事件中加入如下语句:

VC++ 6.0下使用Winsock控件的局域网通讯程序

VC++ 6.0下使用Winsock控件的局域网通讯程序 摘要介绍在VISCAL C++ 6.0 环境下,使用Winsock控件进行网络通讯的一种方法。Winsock控件的使用简单,可以方便地应用在使用VC++进行编程 的网络通讯程序中。 关键词Winsock控件局域网 VC6.0 中图分类号:文献标识码:文章编号: 引言 随着计算机技术的发展和网络的不断普及,网络通讯程序的应用越来越普遍,各种软件开发平台也为网络通讯程序的开发提供了不同形式的类和控件。在利用Visual C++ 进行开发时,可以使用Csocket类;在利用Visucal Basic 进行开发时,可以使用Winsock 控件。有关Csocket类在VC中的使用和Winsock 控件在VB中使用,已经有许多文章、资料进行的介绍,这里不再赘述。同时也应注意到,利用VC的CSocket类需要对网络通讯的机制和参数有较深的了解,需要较深的计算机知识。虽然CSocket对Winsock进行了封装,但是它的函数调用仍然比较复杂,使用起来不容易。与此相反,在利用VB编程时,各种控件的使用比较简单,不需要许多的参数。利用VB中的Winsock 控件进行开发比较容易,但VB本身的功能不如VC强大,在进行开发时有时会受到一定程度的限制。在VC中利用Winsock控件的使用难度则介于上述二者之间,只需对少许一些参数做简单设置即可。如果在用VC编制程序时需要进行网络通讯而又不想花费过多的时间,在VC程序中插入Winsock控件是一种合适的方法。利用Winsock控件 可以编制一个简单的通讯程序,用于局域网之间的微机通讯。 一、Winsock控件的使用方法 1.1通讯协议的选择 Winsock控件提供了访问 TCP 和 UDP 网络服务的方便途径。采用TCP协议可以提供双向的、可靠的、有序的和无重复投递的数据流。TCP允许创建和维护与远程计算机的连接,连接两台计算机就可彼此进行数据传输。用户数据文报协议 (UDP) 是一个无连接协议。采用UDP协议,支持双向的数据流,但不保证有序、可靠或无重复的投递。但计算机并不建立连接。 在使用中,采用TCP协议的编程模型应用最为广泛,因为面向连接协议提供了一系列的数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方,Internet上的多数服务(WWW、FTP、Telnet、SMTP)就是靠此协议运转的。采用UDP协议由于不用建立连接,传输比连接协议快,无数据纠错功能,不保证数据的可靠传递。在这里本文只介绍使用TCP/IP协议进行编程的方法。 1.2使用方法和主要函数

Excel常用函数及用法(附图示)

公式和函数 (基于MS Office 2010版本附图示) 目录 公式和函数 (1) 公式 (4) 函数 (6) 1. sum函数 (6) 2. sumif函数 (7) 3. sumifs函数 (8) 4. Vlookup函数。 (9) 5. If函数 (10) 6. Mid函数 (11) 7. AND函数 (12) 8. OR函数 (13) 9. Mod函数 (14) 10. Rank函数 (15) 11. Count函数 (17)

13. Countif函数 (18) 14. Countifs函数 (18) 15. Today函数 (19) 16. Now函数 (19) 17. Year函数 (20) 18. Month函数 (20) 19. Hour函数 (21) 20. Minute函数 (21) 21. Weekday函数 (21) 22. Max函数 (22) 23. Min函数 (23) 24. Average函数 (23) 25. Averageif函数 (24) 26. Averageifs函数 (24) 27. CONCATENATE函数 (25) 28. Left函数 (26) 29. Right函数 (26) 30. Abs函数 (27) 31. Int函数 (27) 32. Roundup函数 (28) 33. Round函数 (28)

35. Trim函数 (30) 36. Len函数 (30) 37. Datedif函数 (31) 定义名称 (31)

公式 公式,即在使用单元格数据进行计算的时候,可以仿照数学公式进行计算,那么单元格作为运算的对象,实际上是使用单元格内部的数据。 注意事项: 1.必须以“=”作为开头。 2.可以做加减乘除等算术运算和罗辑运算、关系运算。 3.运算符必须在英文输入法下输入 单元格选取 1、单元格的选取可以是点选或输入。但是一般情况下,建议使用 点选。因为输入很容易出错。 2、单元格的选取还可以是框选,可以拖鼠标,将要选中的部分选 中。 单元格的引用 相对引用 相对于某一个单元格,使用的单元格的值。 绝对引用 不管单元格如何变化,所引用的单元格不变。 分为完全绝对引用,和列绝对引用,行绝对引用。 一般情况下,区域使用绝对引用,单元格使用相对引用。 例:=SUMIF(授课信息表!$D$3:$D$72,课时费统计表!E22,

VB Winsock控件的使用与介绍

VB Winsock控件的使用与介绍 第一节:Winsock控件的介绍 Winsock控件的作用简单说就是可以用于两台或多台机器间通信,这里不多说这个控件的作用了,因为在以后的介绍中我们会了解到这个控件的强大功能的,如可以用来做聊天软件等…… 废话不多说,来看看他有些什么重要的属性、方法和事件吧!在VB6.0中的工具箱里默认情况下是没有这个控件的,添加方法如下:在工具箱上右击,选择[部件],然后在部件对话框中选择"Microsoft Winsock Control 6.0",后确定即可。如果没有这个复选框的话,请点击[浏览]按钮后在打开的[添加ActiveX控件]对话框选择MSWINSCK.ocx后选择打 开,再点确定即可。Winsock控件在工具箱中图标为。Winsck的主要属性:属性名 说明BytesReceived 返回接收的数据,可以用GetData方法来获取它

LocalHostName 返回本机名LocalIP 返回本机IPLocalPort 返回或设置本机所用的端口,如果为0则为随机产生Protocol 返回通信所用的协议RemoteHostName 返回通信对方的计算机名RemoteHostIP 返回通信对方的IPState 返回Winscok的当前状态,取值如下 sckClosed(常量为0):关闭状态 sckOpen(常量为1):打开状态 sckListening(常量为2):侦听状态sckConnectionPending(常量为3):连接状态sckResolvingHost(常量为4):解析主机中

sckHostResolved(常量为5):已解析主机sckConnecting(常量为6):正在连接sckConnected(常量为7):已经连接sckClosing(常量为8):客户端正在关闭sckError(常量为9):连接发生错误

VB Winsock控件创建多个连接

VB Winsock控件创建多个连接。 VB学习2010-12-11 16:28:12 阅读105 评论0 字号:大中小订阅 用VB写的一个简单的服务端程序, 服务器端程序: Private Sub Form_Load() tcpserver.LocalPort = 1001 '将LocalPort 属性设置为一个整数。 tcpserver.Listen '然后调用Listen 方法。 End Sub Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long) If tcpserver.State <> sckClosed Then tcpserver.Close '检查控件的State 属性是否为关闭的。'如果不是,'在接受新的连接之前先关闭此连接。 tcpserver.Accept requestID '接受具有requestID 参数的'连接。 msgbox("有人连接服务端") End Sub 客服端程序 Private Sub Form_Load() tcpClient.RemoteHost = "192.168.1.2" tcpClient.RemotePort = 1001 End Sub Private Sub cmdConnect_Click() '连接按钮 tcpClient.Connect MsgBox ("连接服务器成功") End Sub 运行后,启动服务端,然后启动客户端,点“连接”按钮,客服端端跳出窗口“连接服务器成功”,服务端跳出窗口“有人连接服务端”。表示双方建立了连接。这个时候关闭客户端,然后再启动,点“连接”按钮,就只是跳出连接服务器成功(程序设置不完美)。然后在输入框中输入向服务端发送数据,出现“错误“40006” 所需事物请求的错误协议连接或连接状态”。这个时候发现第二次连接就不行,看来服务端只是支持单个连接,第二次连接相当于,第二个连接,就找不到服务器,这个错误跟没有启动服务端程序的错误是一样, 说明客户端找不到服务端。 解决办法:创建控件数组 上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新 的实例上调用Accept 方法。 下面的代码假定名为sckServer 的窗体上有一个Winsock 控件,它的Index 属性被设置为0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量intMax。在窗体的Load 事件中,intMax 被设置为0,数组中第一个控件的LocalPort 属性被设置为1001。然后调用控件的Listen 方法,使之

Excel财务处理中用到的函数的使用方法及实例

Excel财务处理中用到的函数的使用方法及实例 1替换掉单元格内空格 1)保留两个符号中间的一个,去掉前后的所有空格。 因为在trim公式中,两个字符之间有一个单元格的ASCII码值为160,而其他普通空格是32。 =trim()。 2)替换掉单元格内所有空格 需使用substitute函数,先替换出里面的保留空格。 char(32)普通空格 char(160)特殊空格 CLEAN 函数被设计为删除文本中7位ASCII码的前32个非打印字符(值为 0 到 31)。在Unicode字符集(Unicode:Unicode Consortium 开发的一种字符编码标准。该标准采用多(于一)个字节代表每一字符,实现了使用单个字符集代表世界上几乎所有书面语言。)中,有附加的非打印字符(值为 127、129、141、143、144 和 157)。CLEAN函数自身不删除这些附加的非打印字符。 clean可以清除0到31的非打印符号,所以可用以下公式替换单元格中所有的空格变成非打印符号以清除空格。其中的7可以换成0到31中的任意数。 =clean(substitute(a1,char(32),char(7)))。 注:MID函数可以替换具体字符。调出函数,按步骤走,很容易设置。 2将“001”“001-107”数字前后都加上2,变成“003-109” =IF(ISNUMBER(A1),A1+2,TEXT(LEFT(A1,3)+2,"000")&"-"&TEXT(RIGHT(A1,3 )+2,"000")) 如果有8位数字,则需要进行为数判断,使用find()函数 3excel 转置自动填充的问题 1)A列为a、b、c,b列为1、2、3,c列为11、22、33,d列为111、222、333,e列为 aa、bb、cc

相关文档
相关文档 最新文档