WinSockAPI在易语言中的应用

更新时间:2023-12-01 00:38:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

WinSockAPI在易语言中的应用

WinSockAPI的使用

1.WSAStartup 函数

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

Declare Function WSAStartup Lib \

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

--代码开始--易语言格式--只需要复制红色字符部分--

.版本 2

.DLL命令 WSAStartup, 整数型, \公开, 初始化winsock,成功返回0,失败返回错误代码。

.参数 wVersionRequired, 整数型, , 指定了你想载入的Winsock版本,其高字节指定了次版本号,而低字节指定了主版本号。

.参数 lpWSAData, WSAData, 传址, 指向WSAData结构的指针,WSAStartup会向该结构中填充其载入的Winsock动态链库的信息。

--代码结束--易语言格式--只需要复制红色字符部分--

这个函数有两个参数: wVersionRequired 和 lpWSAData。wVersionRequired 参数定义Windows Sockets 提供能使用的最高版本,它的高位字节定义的是次版本号,低位字节定义的是主版本号。下面的2个Winsock版本在VB中使用的例子:

初始化1.1版本

lngRetVal = WSAStartup(&H101, udtWinsockData)

初始化2.2版本

lngRetVal = WSAStartup(&H202, udtWinsockData)

--代码开始--易语言格式--只需要复制红色字符部分--

.版本 2

.子程序 载入WinSock, 整数型, 公开, 成功返回0,失败返回错误号 .参数 版本, 整数型

.参数 WinSock信息, WSAData, 参考 可空

返回 (WSAStartup (版本, WinSock信息))

--代码结束--易语言格式--只需要复制红色字符部分--

第二个参数是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

--代码开始--易语言格式--只需要复制红色字符部分-- .版本 2

.数据类型 WSAData, 公开

.成员 wVersion, 整数型

.成员 wHighVersion, 整数型

.成员 szDescription, 字节型, , \ .成员 szSystemStatus, 字节型, , \ .成员 iMaxSockets, 整数型 .成员 iMaxUdpDg, 整数型

.成员 lpVendorInfo, 整数型

--代码结束--易语言格式--只需要复制红色字符部分--

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

Field 描述

wVersion Windows Sockets 版本信息。

wHighVersion 通过加载库文件得到的最高的支持Winsock 的版本, 它通常和wVersion值相同。

szDescription Windows Sockets 执行时的详细描述 szSystemStatus 包含了相关的状态和配置的信息

iMaxSockets 表示同时打开的socket最大数,为0表示没有限制。 iMaxUdpDg 表示同时打开的数据报最大数,为0表示没有限制。 lpVendorInfo 厂商指定信息预留

在Winsock的1.1和2.2版本中没有lpVendorInfo的返回值。因为winsock 2支持多个传输协

议,所以iMaxSockets 和iMaxUdpDg只能在仅支持TCP/TP的winsock1.1中使用。为了在Winsock 2中获得这些值,你可以使用WSAEnumProtocols 函数。

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

错误代码 含义

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

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

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

WSAEPROCLIM 请求的协议没有在系统中配置或没有支持它的实现存在。 WSAEFAULT lpWSAData 不是有效的指针

2.WSACleanup 函数

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

Declare Function WSACleanup Lib \

--代码开始--易语言格式--只需要复制红色字符部分-- .版本 2

.DLL命令 WSACleanup, 整数型, \公开 --代码结束--易语言格式--只需要复制红色字符部分--

3.建立Socket函数

Declare Function socket Lib \al af As Long, _ ByVal s_type As Long, ByVal Protocol As Long) As Long

--代码开始--易语言格式--只需要复制红色字符部分-- .版本 2

.DLL命令 socket, 整数型, \ws2_32.dll\公开 .参数 af, 整数型 .参数 s_type, 整数型 .参数 Protocol, 整数型

--代码结束--易语言格式--只需要复制红色字符部分--

函数有3个参数定义建立何种socket,三个参数分别是: 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:

AF_UNSPEC = 0 '/* unspecified */

AF_UNIX = 1 '/* local to host (pipes, portals) */ AF_INET = 2 '/* internetwork: UDP, TCP, etc. */ AF_IMPLINK = 3 '/* arpanet imp addresses */ AF_PUP = 4 '/* pup protocols: e.g. BSP */ AF_CHAOS = 5 '/* mit CHAOS protocols */ AF_NS = 6 '/* XEROX NS protocols */

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

AF_OSI = AF_ISO '/* OSI is ISO */

AF_ECMA = 8 '/* european computer manufacturers */ AF_DATAKIT = 9 '/* datakit protocols */

AF_CCITT = 10 '/* CCITT protocols, X.25 etc */ AF_SNA = 11 '/* IBM SNA */ AF_DECnet = 12 '/* DECnet */

AF_DLI = 13 '/* Direct data link interface */ AF_LAT = 14 '/* LAT */

AF_HYLINK = 15 '/* NSC Hyperchannel */ AF_APPLETALK = 16 '/* AppleTalk */

AF_NETBIOS = 17 '/* NetBios-style addresses */ AF_VOICEVIEW = 18 '/* VoiceView */

AF_FIREFOX = 19 '/* Protocols from Firefox */ AF_UNKNOWN1 = 20 '/* Somebody is using this! */ AF_BAN = 21 '/* Banyan */

AF_ATM = 22 '/* Native ATM Services */ AF_INET6 = 23 '/* Internetwork Version 6 */ AF_CLUSTER = 24 '/* Microsoft Wolfpack */ AF_12844 = 25 '/* IEEE 1284.4 WG AF */ AF_MAX = 26

Socket types:

SOCK_STREAM = 1 ' /* stream socket */

SOCK_DGRAM = 2 ' /* datagram socket */

SOCK_RAW = 3 ' /* raw-protocol interface */ SOCK_RDM = 4 ' /* reliably-delivered message */ SOCK_SEQPACKET = 5 ' /* sequenced packet stream */

Protocols:

IPPROTO_IP = 0 '/* dummy for IP */

IPPROTO_ICMP = 1 '/* control message protocol */

IPPROTO_IGMP = 2 '/* internet group management protocol */ IPPROTO_GGP = 3 '/* gateway^2 (deprecated) */ IPPROTO_TCP = 6 '/* tcp */ IPPROTO_PUP = 12 '/* pup */

IPPROTO_UDP = 17 '/* user datagram protocol */ IPPROTO_IDP = 22 '/* xns idp */

IPPROTO_ND = 77 '/* UNOFFICIAL net disk proto */ IPPROTO_RAW = 255 '/* raw IP packet */ IPPROTO_MAX = 256

该函数可以建立使用特定协议的网络套接字

例如

对于UDP协议可以这样写:

s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

对于TCP协议可以这样写:

s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

--代码开始--易语言格式--只需要复制红色字符部分-- .版本 2

.子程序 创建Socket, 逻辑型, 公开, 该函数如果调用成功就返回新创建的套接字的描述符 .参数 协议族, 整数型, , AF_系列常量。

.参数 套接字类型, 整数型, , SOCK_系列常量。 .参数 通信协议, 整数型, , IPPROTO_系列常量

Socket套接字 = socket (协议族, 套接字类型, 通信协议) 返回 (Socket套接字 ≠ 0)

--代码结束--易语言格式--只需要复制红色字符部分--

4.关闭Socket函数

本文来源:https://www.bwwdw.com/article/kyft.html

Top