为编程爱好者分享易语言教程源码的资源网

网站首页 > 易语言相关 > 易语言模块源码 正文

Winsocket模块源码

三叶资源网 2018-04-06 11:28:59 易语言模块源码 5420 ℃ 12 评论

资源介绍:

本模块使用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模块源码.png

资源下载:

文件下载

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

已有12位网友发表了看法:

  • 资源网

    资源网  评论于 [2018-09-25 11:35:29]  回复

    易语言Winsocket

  • 三叶网

    三叶网  评论于 [2019-03-06 00:52:12]  回复

    易语言+socket模块

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
拖放支持库TCP服务器移动咪咕电商关键词监控动态组件远程文件管理外挂appium模块数据库客户端文字游戏防OD附加源码蚁群算法吃鸡泰服矩阵自绘桌面易包做插件EXDUI界面例程斗图神器scrcpy投屏进程隐藏
最新评论