首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • WINSOCK,苦恼了我1年半的问题 [已结贴,结贴人:wyffyw2000]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-03-11 16:08:54 楼主
    For i = 0 To sckClient.UBound
        If sckClient(i).State = 7 Then
                sckClient(i).SendData sR
                DoEvents
        End If
    Next
    我不想用 DoEvents  ,,哪位  神仙 有办法呀????
    因为。。。
    比如在FOR 循环的过程中,突然系统有别的事件发生,它就会跑去处理别的事情了
    如果这样的别的事情太多,,那我的FOR 循环 还要不要工作呀,,我只是举个例子说明不想用Doevents

    甚 期盼 神仙级别的 高手 来救我一次呀
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xstong1982
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-11 17:50:061楼 得分:0
    额,那就sleep呀
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zyg0
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 10:16:052楼 得分:0
    不用 devents也行 用 一个事件 在那里面发送 不错处理起来麻烦 还要 加消息头和尾
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zyg0
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 10:16:563楼 得分:0
    vb没办法  要不用.net或者vc
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 11:17:164楼 得分:0
    影子:
    不用 devents也行 用 一个事件 在那里面发送 不错处理起来麻烦 还要 加消息头和尾
      麻烦你能不能详细的说说这个方法,好吗? 虽然用了这么久VB,但是有些 队列 什么的,还不会
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 11:19:005楼 得分:0
    我现在也在思考 用VC 完成端口做,,可是 完成端口 太复杂了,,到现在还没有啃下来,,,,
    所以  还得先用VB解决了,,,,以后再漫漫用VC 增强功能
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-03-12 12:15:576楼 得分:0
    既然你不希望程序分心,那你为啥还要加上DoEvents呢?

    不管用什么办法,多线程也好,多进程也罢,调度资源的始终是系统,你要专心的话还是让它专心地做吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 13:25:157楼 得分:0
    supergreenbean: 
      难道你就是那个 我曾经下载过你的很多程序  的 超级绿豆吗 ???
      -----不过感觉不是吧,,,超级绿豆  会不知道 我为什么必须在一个FOR 循环里 ,很无奈地,很不情愿地加上Doenents 吗?!
     
      回答:  我不想加Doenents,但必须在那里加Doenents,,原因是这是Visual Basic 的 WINSOCK 6.0

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • VirtualDesktop
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 13:52:168楼 得分:0
    晕...为什么是winsock 6就要加 doevents
    如果你不想for被打扰,就搞多线程吧...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 15:14:029楼 得分:0
    VirtualDesktop :
      从第一句看来,你确实不是对WINSOCK 6.0 很透彻
     
      第2句话,值得研究,,,可是VB的多线程 经得起考验吗? 程序是给客户安装用的,不是自己编个多线程玩玩,,
      要长期经得起运行考验的。

    我在这只是想求助的,,说话没有半点 难为 OR 讽刺 OR 偏激 的 意思或行为。 只针对问题发表意见,,请谅解。
      如果有些朋友提出了好的思路,,能够再详细些,或者能够带上部分 代码,那就感激不尽了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-03-12 15:28:5610楼 得分:0
    .........不敢说话了...纯帮顶....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 15:30:4811楼 得分:0
    老马,,你应该多说点呀,,期待中
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZOU_SEAFARER
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 15:48:0312楼 得分:0
    For i = 0 To sckClient.UBound
        If sckClient(i).State = 7 Then
                sckClient(i).SendData sR
                DoEvents
        End If
    Next

    不想用也可以不用呀 ,你不用DOEVENTS,同样也可以发送数据,不过这样发送的数据也许好多个SR组成一个大包,大概是8K后一起发送出去,.如果你加头尾标志的话,在接收端也很容易分离各段数据!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-03-12 15:51:2513楼 得分:2
    我对WINSOCK也了解得非常少,个人做过多个WINSOCK工作的事情就是,写过一个邮件群发软件.

    当时为了实现同时连接多个邮件服务器,从而实现同时发送多封邮件,就使用了WINSOCK数组,然后再将其封装在ActiveX EXE中,以使用VB6里官方推荐的"单元模型线程".

    在ActiveX EXE中,使用CreateObject建立的对象,它就工作于另一个单元线程中.

    虽然这种线程的线程间调度开销很大,但是却可以很稳定地实现多线程------至少我的应用中,没有发现API实现多线程里面那些非法操作啊之类的问题.

    推荐你测试一下.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-03-12 15:53:3514楼 得分:0
    但我认为,应该从你的程序流程里面再分析一下,看看能不能从流程上进行优化.

    毕竟WINSOCK本身也是事件驱动....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZOU_SEAFARER
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 15:55:2315楼 得分:2
    又仔细的看了你的要求,我发现我说错了,我理解为你的数据是数组而非你的WINSOCK数组,当我没有发言,哈哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 16:01:5516楼 得分:0
    ZOU_SEAFARER:
      嘻嘻,你还可以看出其中的端倪,  说话也比较风趣 恩
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 16:04:4617楼 得分:0
    见识过 老马 同志的 ActiveX EXE中建立多线程的 文章
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ZOU_SEAFARER
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 16:14:1118楼 得分:0
    好深的水呀,我是菜鸟,还不会游泳
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 16:39:1119楼 得分:0
    期盼奇迹。。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-03-12 21:48:4220楼 得分:0
    首先,我还是我。其次,我对Winsock研究不多,所以胡说的成分比较大。

    好,下面开始胡说:

    1、DoEvents的作用是清除当前输入队列中的按键信息,然后调用Sleep(0)将本线程的剩余时间片分给其他需要使用的线程。所以,插入一个DoEvents,或者一个Sleep函数的作用是差不多。
    2、VB是单线程的,你在这里不能使用阻塞式的循环或其他类似的东西,否则就算等到宇宙毁灭的时候,你也不会看到这个程序恢复响应。
    3、照我的理解(当然,我的感觉在大部分时候都是错的),你这里是想将SendData的异步操作改为同步。因此,我粗略地想了一下(当然,我向来都很粗的),希望下面这种方法对你的问题是否有所帮助


    VB.NET code
    Private Sub MySendData(ByVal Index As Integer) With sckClient(Index) If .State = sckConnected Then .SendData CStr(Index) & ">" & Text1.Text & CStr(Index) End If End With End Sub Private Sub sckClient_SendComplete(Index As Integer) If Index < sckClient.UBound Then MySendData Index + 1 End If End Sub Private Sub Command1_Click() MySendData (sckClient.LBound) End Sub
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • VirtualDesktop
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-12 22:31:5521楼 得分:0
    搞到现在我还是不明白为什么要加 doevents, 有否高人能指教一二?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • supergreenbean
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-03-12 23:16:1122楼 得分:0
    首先,SendData将数据根据大小分段,段的大小为&H2000(8K)。而后,调用send函数把分段后的数据一点点写入缓冲区发掉。
    在这里DoEvents的作用就是让send函数有时间依次把缓冲区里的数据发完,否则后面的SendData所写入的数据会被并到前面的缓冲区中。

    因此,实际上解决这个问题的最关键之处就是,在调用SendData发送大数据前,对其进行分段处理;在接收到分段数据后,进行组装。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-13 08:54:0023楼 得分:0
    supergreenbean :
     
      首先,SendData将数据根据大小分段,段的大小为&H2000(8K)。而后,调用send函数把分段后的数据一点点写入缓冲区发掉。 在这里DoEvents的作用就是让send函数有时间依次把缓冲区里的数据发完,否则后面的SendData所写入的数据会被并到前面的缓冲区中。------[你的见解是对的]
      因此,实际上解决这个问题的最关键之处就是,在调用SendData发送大数据前,对其进行分段处理;在接收到分段数据后,进行组装。------[参考 ZOU_SEAFARER:‘又仔细的看了你的要求,我发现我说错了,我理解为你的数据是数组而非你的WINSOCK数组,当我没有发言,哈哈’]
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-13 09:01:5324楼 得分:0
    supergreenbean 的VB.net的方法  以前曾经测试过, 但是好象没有你提供的这个好。。。
        我再测试下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • onetiger1243
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-13 10:30:4925楼 得分:0
    顶啊,我也同样问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-13 10:59:5626楼 得分:0
    supergreenbean:
        的VB.net的方法 ,也是有缺陷呀。
          当客户端(sckClient)很多,当它们发送数据的频率 很高的时候,,,就会出现问题了,,有些只能发给一个客户端(sckClient),,,因为其他的socket过来了,将INDEX 参数冲了?
        从这方面看, 是不是Private Sub sckClient_SendComplete(Index As Integer) 也是中间有个转让系统时间的过程? 那么它本身也就相当于一个Doevents了 !!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-13 11:02:2227楼 得分:0
    老马  或 其他 高手能不能给 贴个在线程里  SOCKET发送数据的  代码,,期待。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wyffyw2000
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-03-13 11:04:1428楼 得分:0
    或者 谁有没有成熟的用纯API编写的SOCKET的,,我自己在网络上找了几个,用在一般的应用了还说的过去,可是如果用在群发上就差了