Winsocket模块源码

资源介绍:

本模块使用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

资源下载:

相关文件下载地址
©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!

Winsocket模块源码》有0个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注