ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7451|回复: 11

[求助] VBA socketAPI本机调试 recv后服务端、客户端出现FD_CLOSE事件,并报10053错

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-8-7 13:08 | 显示全部楼层 |阅读模式
       利用API实现通讯,可以使VBA利用有个本质的突破,不需要另拷SOCKET控件,程序发布非常简单。我能想到的功能,如抢答竞赛、网上考试、网上民主评议、网上打分等。本人2016年10月单位有一个竞赛,有抢答和必答,想通过通讯在VBA实现。07年使用易语言实现,画面、时钟、出题逻辑、分数计算VBA都能实现,VBA难点主要是通讯。     经过一个多月的网上学习,利用EXCEL和WORD的VBA,编写SOCKET套接字通讯API的模块,使用异步选择模式WSAAsyncSelect,使用SetWindowLong函数设置接收以WINDOWS消息的网络事件。

     按照网上专家大侠们的观点异步选择模式一个线程可接64个客户端,不知道VBA能接多少。网上多数大侠认为VBA不能处理多线程,但网上也有VBA处理多线程的例程,我理解都是处理相对简单的内容,不能与sheetst和cells发生关系,否则则系统崩溃。使用SetWindowLong函数处理WINDOWS消息,也不能与sheetst和cells发生关系,否则系统崩溃,注:曾看过网上说ECXEL处理超过一定时间不再响应机制,可能与此有关。线程和消息处理与窗体及窗体控件发生关系不受影响。因此可通过控件再与sheetst和cells发生关系,不知此观点是否正确。我知道能回调程序的函数有Application.OnTime,SetWindowLong,钩子函数等,在VBA里回调程序也经常崩溃,需要各位大侠总结一下。
        目前在本机测试(IP地址127.0.0.1用于本机测试的地址),WINDOWS消息处理正确(不死机),服务端与客户端连接已能相通,但服务端发送的信息,客户端也能收到FD_READ事件,但客户端使用RECV函数取回信息时,出现FD_CLOSE事件(服务端和客户端同时出现,可能是本机测试),并报10053错误。本人对BYTE数据类型处理不太懂。
       请各位大侠帮助调试:1。最主要的是解决调用RECV函数出现的FD_CLOSE事件,报10053错误。2。解决关闭套接字端口closesocket(s),又何再调用,因为除非退出EXCEL、WORD外,再调用报-1错误。3.发布一个最优的VBA的API通讯案例。
      废话不再说了,直接上程序。见附件。
     还的啰嗦几句,excel和word的VBA程序是一致的,为了在本机测试方便,服务端可以有使用excel,客户端使用WORD。

VBA通讯.rar

135.72 KB, 下载次数: 281

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-7 13:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
上面说的不清楚,RECV函数没有取回信息。recv 和 send的方法都是根据API-Guide例程写的,不知道哪里有错。
Public Sub ProcessMessage(ByVal lFromSocket As Long, ByVal lParam As Long)
    Dim X As Long, ReadBuffer(1 To 1024) As Byte, strCommand As String
    Select Case lParam
        Case FD_CONNECT 'we are connected to microsoft.com
        Case FD_WRITE 'we can write to our connection
            'this is a part of the HTTP protocol
            'for more information about this protocol, visit http://www.w3c.org/
            strCommand = "GET http://www.microsoft.com/ HTTP/1.0" + vbCrLf
            strcomand = strCommand + "Pragma: no-cache" + vbCrLf
            strCommand = strCommand + "Accept: */*" + vbCrLf
            strCommand = strCommand + "Accept: text/html" + vbCrLf + vbCrLf
            'send the data to our microsoft.com-connection
            SendData lFromSocket, strCommand
        Case FD_READ 'we have data waiting to be processed
            'start reading the data
            Do
                X = recv(lFromSocket, ReadBuffer(1), 1024, 0)
                If X > 0 Then
                    Obj.Text = Obj.Text + Left$(StrConv(ReadBuffer, vbUnicode), X)
                End If
                If X <> 1024 Then Exit Do
            Loop
        Case FD_CLOSE 'the connection with microsoft.com is closed
    End Select
End Sub
Public Function SendData(ByVal s&, vMessage As Variant) As Long
    Dim TheMsg() As Byte, sTemp$
    TheMsg = ""
    Select Case VarType(vMessage)
        Case 8209   'byte array
            sTemp = vMessage
            TheMsg = sTemp
        Case 8      'string, if we recieve a string, its assumed we are linemode
            sTemp = StrConv(vMessage, vbFromUnicode)
        Case Else
            sTemp = CStr(vMessage)
            sTemp = StrConv(vMessage, vbFromUnicode)
    End Select
    TheMsg = sTemp
    If UBound(TheMsg) > -1 Then
        SendData = Send(s, TheMsg(0), (UBound(TheMsg) - LBound(TheMsg) + 1), 0)
    End If
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-7 19:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
服务端与客户端能够相连,但发送和接收数据总出问题,发送数据不报错,接收方能正确得到窗口提示有数据到达的消息,但使用recv函数接收数据时,接收方recv函数返回-1,同时发送方报FD_CLOSE事件,报10053错误。请大侠们查找错误,或使用VB语言翻译下面的C语言。谢谢!
网上查的C语言例程http://www.cnblogs.com/goodcandle/archive/2005/12/10/socket.html
int    Receive(SOCKET fd,char *szText,int len)
{
       int cnt;
       int rc;
       cnt=len;
       while(cnt>0)
       {
              rc=recv(fd,szText,cnt,0);
              if(rc==SOCKET_ERROR)
              {
                     return -1;
             }
             if(rc==0)
                     return len-cnt;
              szText+=rc;
              cnt-=rc;
       }
       return len;
}

int Send(SOCKET fd,char *szText,int len)
{
       int cnt;
       int rc;
       cnt=len;
       while(cnt>0)
       {
              rc=send(fd,szText,cnt,0);
              if(rc==SOCKET_ERROR)
              {
                     return -1;
              }
              if(rc==0)
                     return len-cnt;
              szText+=rc;
              cnt-=rc;
       }
       return len;
}

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-8-9 08:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-17 22:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-23 01:29 | 显示全部楼层
wsc3317 发表于 2016-8-9 08:33
自力更生,丰衣足食。问题解决了。

能继续回复这个帖子吗?你的这个帖子很有价值。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-1 15:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好久的帖子,今天看到有回复。将当时修改“接收方recv函数返回-1,同时发送方报FD_CLOSE事件,报10053错误”源码补发一下。
用excel做服务端和word做客户端,可在本机测试。也可以在局域网上几台设备上都使用excel,其中一台服务端。最好有大侠能给改改,简化一下,我不是科班程序员,只是一个半路爱好者。

VBA通讯1.rar.zip

158.1 KB, 下载次数: 174

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-2 14:29 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-1-22 07:20 来自手机 | 显示全部楼层
能否和我联系一下,qq346473525。

TA的精华主题

TA的得分主题

发表于 2019-1-24 10:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
高手,,你在那儿
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-12 23:29 , Processed in 0.048286 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表