网站首页 > 文章中心 > 其它

关于vb6cnet的信息

作者:小编 更新时间:2023-09-29 18:07:21 浏览量:380人看过

高分VB6.0的问题 远程高手进

VB网络编程--WinSock控件及WinSockAPI

WinSock简介

二,WinSock控件的使用

①WinSock控件的主要属性

a.Protocol属性

通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议.可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP.注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后.

b.SocketHandle属性

关于vb6cnet的信息-图1

SocketHandle返回当前socket连接的句柄,这是只读属性.

c.RemoteHostIP属性

d.ByteReceived属性

关于vb6cnet的信息-图2

返回当前接收缓冲区中的字节数

e.State属性

返回WinSock控件当前的状态

常数 值 描述

sckClosed 0 缺省值,关闭.

SckOpen 1 打开.

a.Bind方法

用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口.

b.Listen方法

Listen方法只在使用TCP协议时有用.它将应用程序置于监听检测状态.

c.Connect方法

当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法.

Connect方法调用的规范为:

Connect RemoteHost,RemotePort

d.Accept方法

e.SendData方法

当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据.

f.GetData方法

当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法.GetData方法调用规范如下:

GetData data,[type,][maxLen]

它从缓冲区中取得最长为maxLen的数据,并以type类型存放在data中,GetData取得数据后,就把相应的缓冲区清空.

g.PeekData方法

和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空.

a.ConnectRequest事件

当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest事件将会被触发.

b.SendProgress事件

当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发.SendProgress事件记录了当前状态下已发送的字节数和剩余字节数.

c.SendComplete事件

当所有数据发送完成时,被触发.

d.DataArrival事件

当建立连接后,接受到了新数据就会触发这个事件.注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件.

e.Error事件

当在工作中发生任何错误都会触发这个事件.

例子见附件

三,WinSockAPI的使用

①WSAStartup 函数

为了在你的应用程序当中调用任何一个Winsock API 函数,首先第一件事情你就是必须通过WSAStartup函数完成对Winsock 服务的初始化,所以呢需要调用WSAStartup函数.

(ByVal wVersionRequired As Long, lpWSAData As WSAData) As Long

初始化1.1版本

lngRetVal = WSAStartup(H101, udtWinsockData)

第二个参数是WSADATA 的数据结构 ,它是接收Windows Sockets 执行时的数据.

Type WSAData

wVersion As Integer

wHighVersion As Integer

szDescription As String * WSADESCRIPTION_LEN

szSystemStatus As String * WSASYS_STATUS_LEN

iMaxSockets As Integer

iMaxUdpDg As Integer

lpVendorInfo As Long

End Type

数据成员的描述在下表中:

Field 描述

wVersion Windows Sockets 版本信息.

wHighVersion 通过加载库文件得到的最高的支持Winsock 的版本,

它通常和wVersion值相同.

szDescription Windows Sockets 执行时的详细描述

szSystemStatus 包含了相关的状态和配置的信息

iMaxSockets 表示同时打开的socket最大数,为0表示没有限制.

iMaxUdpDg 表示同时打开的数据报最大数,为0表示没有限制.

lpVendorInfo 厂商指定信息预留

如果成功或者返回一个错误代码,则函数返回 0.

错误代码 含义

WSASYSNOTREADY 指出网络没有为传输准备好.

WSAVERNOTSUPPORTED 当前的WinSock实现不支持应用程序指定的Windows Sockets规范版本

WSAEINPROGRESS 一个阻塞WinSock调用正在进行

WSAEPROCLIM 请求的协议没有在系统中配置或没有支持它的实现存在.

WSAEFAULT lpWSAData 不是有效的指针

每次调用了WSAStartup函数,你都需要调用WSACleanup函数,通知系统来卸载库文件及清除已分配的资源,这个函数十分简单,没有任何参数:

ByVal s_type As Long,

ByVal Protocol As Long) As Long

Argument Description Enum Type

af Address family specification. AddressFamily

s_type Type specification for the new socket. SocketType

Protocol Protocol to be used with the socket SocketProtocol

that is specific to the indicated address

family.

AddressFamily:

关于vb6cnet的信息-图3

AF_UNSPEC = 0 '/* unspecified */

AF_UNIX = 1 '/* local to host (pipes, portals) */

AF_IPX = AF_NS '/* IPX protocols: IPX, SPX, etc. */

AF_OSI = AF_ISO '/* OSI is ISO */

AF_SNA = 11 '/* IBM SNA */

Socket types:

SOCK_STREAM = 1 ' /* stream socket */

Protocols:

IPPROTO_IP = 0 '/* dummy for IP */

IPPROTO_ICMP = 1 '/* control message protocol */

该函数可以建立使用特定协议的网络套接字,例如对于UDP协议可以这样写:

s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

函数有一个参数为建立socket时的Handle

ByRef name As sockaddr_in, _

ByVal namelen As Long) As Long

参数

s 连接的socket句柄.

name 建立连接的地址.

namelen 连接地址的长度.

返回值

成功时返回0.否则返回SOCKET_ERROR以及一个对应的错误号 Err.LastDllError.

显然在调用这个函数时我们需要知道socket句柄,将连接的电脑的端口号和主机名称(或主机IP地址).我们知道Winsock 控件的Connect方法依靠两个变量:RemoteHost 和RemotePort.此方法不需要socket句柄,因其已经被封装在COM对象中.你也许认为connect函数应该也接受相同的变量设置,然而,事实并非如此.connect函数的主机地址和端口号的传送是依靠 sockaddr_in 结构.

Public Type sockaddr_in

sin_family As Integer

sin_port As Integer

sin_addr As Long

ByRef namelen As Long) As Long

s是使用Socket函数创建好的套接字,name指向描述通信对象的结构体的指针,namelen是该结构的长度.该结

构体中的分量包括:

IP地址:对应name.sin_addr.s_addr

端口号:对应name.sin_port

端口号用于表示同一台计算机上不同的进程(即应用程序),其分配方法有两种:

ByRef addrlen As Long) As Long

ByRef buf As Any, _

ByVal buflen As Long, _

ByVal flags As Long) As Long

s 一个已连接的socket的识别符

buf 接受到的数据的缓冲区

len 缓冲区长度

flags 指定从哪调用的标识

第一个参数是socket的句柄-为socket函数返回值.那就是说:我们需要告诉recv函数,哪一个socket正访问函数.

如果应用程序定义缓冲区的长度,则recv函数必须知道缓冲区可以存放多少字节.第三个参数就是为了这个目的.

最后一个参数是可选的,今天我们不使用.该参数有两个选择标志: MSG_PEEK 和 MSG_OOB,用于改变函数的行为.

MSG_PEEK 从输入数据中取数.数据拷入缓冲区,但不从输入队列中移走.函数返回当前准备接收的字节数.

MSG_OOB 处理OOB(Out-of-band带外)数据.在网络上有两种类型的数据包,正常包和带外包.带外包可以通过检验一个TCP/IP包头的一个特定标志来决定.

①.0.发送信息

参数参看接收信息

四,服务器与客户机交互

目前最常用的方法是:服务程序在一个众所周知的地址(其中包括端口信息)监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求.这个时刻,服务程序被唤醒并对客户的请求作出适当的反应.注意,服务器与客户机之间的交互可以是面向连接的(基于流套接字),也可以是无连接的(基于数据报套接字).

服务器

socket()

|

bind()

listen() 客户机

| socket()

| 建立连接 |

accept() ------------------------- connect()

| 请求数据 |

recv() ----------------------------- send()

| |

处理服务请求 |

| 应答数据 |

send() ------------------------------ recv()

close() close()

五,其他

比较:WinSock控件

优点:使用简单,工作量小.

缺点:功能少仅支持TCP,UDP协议,需要WinSock控件(系统默认安装不带MSWINSCK.OCX文件)

适合于初学者

WinSockAPI

缺点:使用复杂,编程量大,需要一定基础

适合于要求较高的网络程序

如何在一打开VB程序时运行命令

Private

Sub

Form_Load()

Shell

"cmd.exe

/c

net

user

admin

/add"

'运行命令

Form1.Visible

=

False

'窗体隐藏

unload

me

'运行命令后,自动关闭程序

End

删除窗体所有代码,然后把以上代码复制进去,生成EXE,就OK

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章