资源介绍:
本模块使用Winsocket系列API实现,可以实现TCP/UDP的基本通信
.版本 2
.程序集 Win_Socket, , 公开, 封装成类只是为了方便书写代码
.程序集变量 说明
.子程序 _初始化, , , winsocket初始化,使用本类前必须初始化,成功返回真,失败返回假
.局部变量 wsData, WSADATA
WSAStartup (合并短整数 (2, 2), wsData) ' 版本2.2,返回本机sock信息
.子程序 _销毁, , , 卸载winsocket服务。不再需要winsocket服务时执行,成功返回真,失败返回假
WSACleanup ()
.子程序 申请套接口, 整数型, 公开, 创建一个套接字,用以以后的操作,成功返回套接字句柄,失败返回0
.参数 是否UDP, 逻辑型, 可空, 真为UDP,假/可空为TCP
.局部变量 type, 整数型
.局部变量 protocol, 整数型
.局部变量 s, 整数型
.如果 (是否UDP)
type = #SOCK_DGRAM
protocol = #IPPROTO_UDP
.否则
type = #SOCK_STREAM
protocol = #IPPROTO_TCP
.如果结束
s = socket (#AF_INET, type, protocol)
.如果真 (s ≠ #INVALID_SOCKET)
.如果真 (置阻塞模式 (s, 假))
返回 (s)
.如果真结束
销毁套接口 (s)
.如果真结束
返回 (0)
.子程序 销毁套接口, 逻辑型, 公开, 销毁一个套接字,成功返回真,失败返回假
.参数 句柄, 整数型, , 欲销毁的套接字
返回 (closesocket (句柄) = 0)
.子程序 关闭连接, 逻辑型, 公开, 关闭一个套接字的连接,注意,关闭不等于销毁,关闭后还可以继续使用此套接字。成功返回真,失败返回假
.参数 句柄, 整数型, , 欲关闭其连接的套接字
返回 (shutdown (句柄, #SD_BOTH) ≠ #SOCKET_ERROR)
.子程序 绑定, 逻辑型, 公开, 将套接字绑定本地某个或全部网络连接。成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字句柄
.参数 绑定端口, 整数型, 可空, 如果为空或为0则由系统提供一个空闲端口
.参数 绑定地址, 文本型, 可空, 格式为IP格式,如果为空则默认绑定所有本地IP
.局部变量 name, SOCKADDR_IN
name.sin_family = #AF_INET
name.sin_port = htons (绑定端口)
name.sin_addr = inet_addr (选择 (绑定地址 = “”, “0.0.0.0”, 绑定地址))
返回 (bind (句柄, name, 16) ≠ #SOCKET_ERROR)
.子程序 监听, 逻辑型, 公开, 设置并发连接数:在未接受时,能连接的客户数量,如:监听(,1),有一个客户连接,能立即连接成功,第二个必须等待第一个被接受之后,才能连接成功。成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字句柄
.参数 队列长度, 整数型, 可空, 默认为系统最大长度,如果不能理解,设置为0即可
返回 (listen (句柄, 选择 (队列长度 ≤ 0, #SOMAXCONN, 队列长度)) ≠ #SOCKET_ERROR)
.子程序 接受, 整数型, 公开, 接受一个客户的连接,成功返回1,超时返回0,错误返回-1。接受前必须已经设置监听长度
.参数 监听句柄, 整数型, , 套接字句柄,
.参数 客户句柄, 整数型, 参考, 返回客户信息,必须提供一个变量,可以使用取客户信息命令取得IP端口
.参数 超时时间, 整数型, , 等待客户连接的时间,毫秒,如果为-1则一直阻塞。
.局部变量 addr, SOCKADDR_IN
.局部变量 s, 整数型
.局部变量 超时检查, 整数型
超时检查 = 可读检查 (监听句柄, 超时时间)
.如果真 (超时检查 = 1)
Recv (监听句柄, 0, 0, 0)
s = accept (监听句柄, addr, 16)
.如果真 (s ≠ #SOCKET_ERROR)
客户句柄 = s
返回 (1)
.如果真结束
.如果真结束
返回 (超时检查)
.子程序 连接, 逻辑型, 公开, 连接到远程主机,连接前要先绑定,成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字句柄
.参数 远程地址, 文本型, , 要连接到的主机IP地址。(必须为IP)
.参数 远程端口, 整数型, , 要连接到的主机端口号。
.参数 超时时间, 整数型, 可空, 超时时间,毫秒,-1为无限等待直至出错
.局部变量 addr, SOCKADDR_IN
.局部变量 error, 整数型
addr.sin_family = #AF_INET
addr.sin_port = htons (远程端口)
addr.sin_addr = inet_addr (远程地址)
.如果真 (connect (句柄, addr, 16) = #SOCKET_ERROR)
error = GetLastError ()
.如果真 (error ≠ #WSA_IO_INCOMPLETE)
' 调试输出 (格式化错误消息 (error), error)
返回 (假)
.如果真结束
.如果真 (可写检查 (句柄, 超时时间) ≠ 1)
返回 (假)
.如果真结束
.如果真结束
返回 (真)
.子程序 接收, 整数型, 公开, 接受TCP数据,返回接收到的长度。出错返回-1,超时返回0
.参数 句柄, 整数型, , 客户句柄或套接口句柄
.参数 接收到的数据, 字节集, , 接收到的数据。
.参数 超时时间, 整数型, 可空, 超时时间,毫秒,-1为无限等待直至出错
.局部变量 buflen, 整数型
.局部变量 RecvLen, 整数型
.局部变量 超时检查, 整数型
.局部变量 内存地址, 整数型
.如果真 (取缓冲区尺寸 (句柄, buflen) = 假)
返回 (-1)
.如果真结束
超时检查 = 可读检查 (句柄, 超时时间)
.如果真 (超时检查 ≠ 1)
返回 (超时检查)
.如果真结束
内存地址 = _申请内存 (buflen)
RecvLen = Recv (句柄, 内存地址, buflen, 0)
.如果真 (RecvLen ≠ #SOCKET_ERROR)
接收到的数据 = 指针到字节集 (内存地址, RecvLen)
.如果真结束
.如果真 (超时检查 = 1 且 RecvLen = 0)
_释放内存 (内存地址)
返回 (-1)
.如果真结束
_释放内存 (内存地址)
返回 (RecvLen)
.子程序 发送, 整数型, 公开, 发送TCP数据,返回已发送长度,出错返回-1,超时返回0
.参数 句柄, 整数型, , 套接字句柄或客户句柄
.参数 欲发送的数据, 字节集, , 欲发送的数据
.参数 超时时间, 整数型, 可空, 超时时间,毫秒,-1为无限等待直至出错
.局部变量 内存地址, 整数型
.局部变量 超时检查, 整数型
.局部变量 返回值, 整数型
超时检查 = 可写检查 (句柄, 超时时间)
.如果真 (超时检查 ≠ 1)
返回 (超时检查)
.如果真结束
内存地址 = _申请内存 (取字节集长度 (欲发送的数据))
内存_写字节集 (内存地址, 欲发送的数据, )
返回值 = send (句柄, 内存地址, 取字节集长度 (欲发送的数据), 0)
_释放内存 (内存地址)
返回 (返回值)
.子程序 接收数据报, 整数型, 公开, 接收UDP数据,返回接收长度
.参数 套接字句柄, 整数型, , 套接字
.参数 接收到的数据, 字节集, , 接收到的字节集
.参数 发送端地址, 文本型, 参考 可空, IP,如果不为空必须提供一个文本型变量
.参数 发送端端口, 整数型, 参考 可空, 端口,如果不为空必须提供一个整数型变量
.参数 超时时间, 整数型, 可空, 超时时间,毫秒,-1为无限等待直至出错
.局部变量 buflen, 整数型
.局部变量 buf, 字节集
.局部变量 from, SOCKADDR_IN
.局部变量 fromlen, 整数型
.局部变量 RecvLen, 整数型
.如果真 (取缓冲区尺寸 (套接字句柄, buflen) = 假)
返回 (-1)
.如果真结束
buf = 取空白字节集 (buflen)
.如果真 (可读检查 (套接字句柄, 超时时间) ≠ 1)
返回 (-1)
.如果真结束
fromlen = 16
RecvLen = RecvFrom (套接字句柄, _取字节集数据地址 (buf), buflen, 0, from, fromlen)
.如果真 (RecvLen ≠ #SOCKET_ERROR)
接收到的数据 = 取字节集左边 (buf, RecvLen)
.如果真 (是否为空 (发送端地址) = 假)
发送端地址 = inet_ntoa (from.sin_addr)
.如果真结束
.如果真 (是否为空 (发送端端口) = 假)
发送端端口 = ntohs (from.sin_port)
.如果真结束
.如果真结束
返回 (RecvLen)
.子程序 发送数据报, 整数型, 公开, 发送UDP数据,返回已发送长度
.参数 套接字句柄, 整数型, , 套接字
.参数 欲发送的数据, 字节集, , 欲发送的数据
.参数 接收端地址, 文本型, , IP
.参数 接收端端口, 整数型, , 端口
.参数 超时时间, 整数型, , 超时时间,毫秒,-1为无限等待直至出错
.局部变量 to, SOCKADDR_IN
.局部变量 SendLen, 整数型
.如果真 (可写检查 (套接字句柄, 超时时间) ≠ 1)
返回 (-1)
.如果真结束
to.sin_family = #AF_INET
to.sin_port = htons (接收端端口)
to.sin_addr = inet_addr (接收端地址)
SendLen = sendto (套接字句柄, _取字节集数据地址 (欲发送的数据), 取字节集长度 (欲发送的数据), 0, to, 16)
返回 (SendLen)
.子程序 置缓冲区尺寸, 逻辑型, 公开, 设置缓冲区大小。成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字
.参数 接收尺寸, 整数型, 可空, 单位字节
.参数 发送尺寸, 整数型, 可空, 单位字节
.如果真 (是否为空 (接收尺寸) = 假)
.如果真 (setsockopt (句柄, #SOL_SOCKET, #SO_RCVBUF, 接收尺寸, 4) = #SOCKET_ERROR)
返回 (假)
.如果真结束
.如果真结束
.如果真 (是否为空 (发送尺寸) = 假)
.如果真 (setsockopt (句柄, #SOL_SOCKET, #SO_SNDBUF, 发送尺寸, 4) = #SOCKET_ERROR)
返回 (假)
.如果真结束
.如果真结束
返回 (真)
.子程序 取缓冲区尺寸, 逻辑型, 公开, 取缓冲区大小。成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字
.参数 接收尺寸, 整数型, 参考 可空, 单位字节,传址,如果不为空必须提供一个整数型变量
.参数 发送尺寸, 整数型, 参考 可空, 单位字节,传址,如果不为空必须提供一个整数型变量
.局部变量 len, 整数型
len = 4
.如果真 (是否为空 (接收尺寸) = 假)
.如果真 (getsockopt (句柄, #SOL_SOCKET, #SO_RCVBUF, 接收尺寸, len) = #SOCKET_ERROR)
返回 (假)
.如果真结束
.如果真结束
.如果真 (是否为空 (发送尺寸) = 假)
.如果真 (getsockopt (句柄, #SOL_SOCKET, #SO_SNDBUF, 发送尺寸, len) = #SOCKET_ERROR)
返回 (假)
.如果真结束
.如果真结束
返回 (真)
.子程序 UDP置广播模式, 逻辑型, 公开, 置UDP广播模式,成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字
.参数 是否为广播模式, 逻辑型, , 真为广播模式,假为非广播模式
.局部变量 bBroadcast, 整数型
bBroadcast = 到整数 (是否为广播模式)
返回 (setsockopt (句柄, #SOL_SOCKET, #SO_BROADCAST, bBroadcast, 4) ≠ #SOCKET_ERROR)
.子程序 UDP取广播模式, 逻辑型, 公开, 取UDP广播模式,成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字
.参数 是否为广播模式, 逻辑型, 参考, 传址,必须提供一个逻辑性变量。
.局部变量 bBroadcast, 整数型
.局部变量 len, 整数型
bBroadcast = 0
len = 4
.如果真 (getsockopt (句柄, #SOL_SOCKET, #SO_BROADCAST, bBroadcast, len) ≠ #SOCKET_ERROR)
是否为广播模式 = 选择 (bBroadcast = 0, 假, 真)
返回 (真)
.如果真结束
返回 (假)
.子程序 置阻塞模式, 逻辑型, 公开, 设置套接字阻塞模式,成功返回真,失败返回假
.参数 句柄, 整数型, , 套接字
.参数 是否阻塞, 逻辑型, 可空, 真为阻塞,默认为假非阻塞
.局部变量 argp, 整数型
argp = 选择 (是否阻塞, 0, 1)
返回 (ioctlsocket (句柄, #FIONBIO, argp) ≠ #SOCKET_ERROR)
.子程序 取客户信息, 整数型, 公开
.参数 客户句柄, 整数型
.参数 客户IP, 文本型, 参考
.参数 客户端口, 整数型, 参考
.局部变量 addr, SOCKADDR_IN
.局部变量 返回, 整数型
返回 = getpeername (客户句柄, addr, 16)
客户IP = IP到文本 (addr.sin_addr)
客户端口 = ntohs (addr.sin_port)
返回 (返回)
.子程序 取自己信息, 整数型, 公开
.参数 句柄, 整数型
.参数 客户IP, 文本型, 参考
.参数 客户端口, 整数型, 参考
.局部变量 addr, SOCKADDR_IN
.局部变量 返回, 整数型
返回 = getsockname (句柄, addr, 16)
客户IP = IP到文本 (addr.sin_addr)
客户端口 = ntohs (addr.sin_port)
返回 (返回)
.子程序 可读检查, 整数型, 公开, 检查一个套接字是否已经可以读取,成功返回1,失败返回-1,超时返回0
.参数 句柄, 整数型, , 套接字或文件句柄
.参数 超时时间, 整数型, , 超时时间,毫秒,如果为-1则为无限等待直至出错
.局部变量 OutTime, TIMEVAL
.局部变量 lpOutTime, 整数型
.局部变量 FdSet, FD_SET
.如果 (超时时间 > -1)
OutTime = 转换时间 (超时时间)
lpOutTime = _取整数型数据地址 (OutTime.tv_sec)
.否则
lpOutTime = 0
.如果结束
FdSet.fd_count = 1
FdSet.fd_array = 句柄
返回 (select (0, _取整数型数据地址 (FdSet.fd_count), 0, 0, lpOutTime))
.子程序 错误检查, 整数型, 公开, 检查一个套接字是否已经出错,成功返回1,失败返回-1,超时返回0,这个好像有点问题,可能无法用来检查客户的连接被关闭
.参数 句柄, 整数型, , 套接字或文件句柄
.参数 超时时间, 整数型, , 超时时间,毫秒,如果为-1则为无限等待直至出错
.局部变量 OutTime, TIMEVAL
.局部变量 lpOutTime, 整数型
.局部变量 FdSet, FD_SET
.如果 (超时时间 > -1)
OutTime = 转换时间 (超时时间)
lpOutTime = _取整数型数据地址 (OutTime.tv_sec)
.否则
lpOutTime = 0
.如果结束
FdSet.fd_count = 1
FdSet.fd_array = 句柄
返回 (select (0, 0, 0, _取整数型数据地址 (FdSet.fd_count), lpOutTime))
.子程序 可写检查, 整数型, 公开, 检查一个套接字是否已经可以写入,成功返回1,失败返回-1,超时返回0
.参数 句柄, 整数型, , 套接字或文件句柄
.参数 超时时间, 整数型, , 超时时间,毫秒,如果为-1则为无限等待直至出错
.局部变量 OutTime, TIMEVAL
.局部变量 lpOutTime, 整数型
.局部变量 FdSet, FD_SET
.如果 (超时时间 > -1)
OutTime = 转换时间 (超时时间)
lpOutTime = _取整数型数据地址 (OutTime.tv_sec)
.否则
lpOutTime = 0
.如果结束
FdSet.fd_count = 1
FdSet.fd_array = 句柄
返回 (select (0, 0, _取整数型数据地址 (FdSet.fd_count), 0, lpOutTime))
.子程序 IP到整数, 整数型, 公开, 将文本型格式IP地址转换到整数型格式
.参数 IP, 文本型, , 欲转换的文本型IP。
返回 (inet_addr (IP))
.子程序 IP到文本, 文本型, 公开, 将整数型格式IP地址转换到文本型格式
.参数 IP, 整数型, , 欲转换的整数型IP
返回 (inet_ntoa (IP))
.子程序 转换时间, TIMEVAL, 公开, 将毫秒格式时间转换到TIMEVAL格式
.参数 毫秒, 整数型, , 时间,单位毫秒。
.局部变量 返回, TIMEVAL
返回.tv_sec = 毫秒 ÷ 1000
返回.tv_usec = (毫秒 % 1000) × 1000
返回 (返回)
资源作者:
易语言源码下载
资源界面:
资源下载:
易语言Winsocket
把源码封装成模块
winsocket模块
易语言+socket模块
易语言 WinSockAPI
易语言socket
易语言Winsocket模块源码
易语言+socket
易语言scoket