当前位置:编程学习 > VB >>

关于winsock发送的问题

当发送方的winsock 有多个控件同时发送数据时,我发现只有最后一个控件数据能发出去,如:
Private Sub Command1_Click()
    Dim sendmsg As String
    sendmsg = Text1.Text
    winsockl.SendData sendmsg
    winsock2.SendData sendmsg
End Sub

只有winsock2的数据发送了出去,求解,是什么原因造成winsock1数据未发送?并且除了使用Doevents以外,还有什么方法可以解决以上问题? 

--------------------编程问答--------------------
  Dim sendmsg As String
  sendmsg = Text1.Text
  winsockl.SendData sendmsg
  Doevents '就是用它罗
  winsock2.SendData sendmsg

你不把工作权还给系统,
让它先送出winsockl内容,
就急着堆上winsock2数据,
当然就仅winsock2的数据发送了出去啦。

另,
MSDNa中有关於DoEvents的细部处理,
Google一下呗。 --------------------编程问答-------------------- 用不同的端口看看 --------------------编程问答-------------------- 不用doevents是因为,当服务器连接多个客户端进行交互的时候,如将控制权交还系统,可能产生很多不可预测的结果,并且经过多次测试,我发现winsock1数据虽未发送,但当接着再单独发送一个winsock1数据时,会将前后两个数据一起发送出去,因此,我想求教是否有其它方法解决问题;
另外我也使用了不同的端口,结果还是不行 --------------------编程问答--------------------
引用 1 楼  的回复:
你不把工作权还给系统,
让它先送出winsockl内容,
就急着堆上winsock2数据,
当然就仅winsock2……

实际winsock1数据并未被覆盖,不知为何VB会不发送winsock1的数据,求教原理 --------------------编程问答-------------------- 你的是什么协议?什么端口?系统环境如何?你的工作步骤又如何? --------------------编程问答-------------------- 感觉winsock就是一大堆古怪问题,不知道大家有没有同感 --------------------编程问答-------------------- TCP协议
端口:200、201、202、203(调试中更换过其它端口,问题依然存在)
系统:windows XP
调试过程:
    主机:端口200、201监听
    客机:winsock1(端口200)、winsock2(端口201)请求连接
    主机:端口202、203接收连接
    客机:winsock1、winsock2单独使用发送、接收数据,一切正常;同时发送数据发生以上问题
所以,提问求教出错原因
个人认为不因是vb 6.0 winsock的设计缺陷,但多次调试始终找不出原因所在,特请高手指点! --------------------编程问答-------------------- 就是因为winsock有个8K的缓冲区 --------------------编程问答--------------------
引用 8 楼  的回复:
就是因为winsock有个8K的缓冲区

缓冲区是winsock单次发送的最大数据量,好像于本问题无关 --------------------编程问答-------------------- 自己回复:
经过测试,winsock1和winsock2如使用的是同一个端口发生数据,运行正常;只有在使用不同端口时才会发生上述问题 --------------------编程问答-------------------- 谁有碰到过同样问题的吗? --------------------编程问答-------------------- 添加两个定时器,Timer1与Timer2,Intval都等于100,然后在定时器事件里分别调用两个控件的SendData方法.

原理是利用定时器优先级低的特点,在系统最空闲时调用sendData. --------------------编程问答-------------------- 谢谢myjian的解决思路!
我想求教:1、造成该问题的原因是winsock本身的原因,还是我遗漏了什么关键设置造成的原因;2、虽然该问题造成winsock1未发送,但指令已经发出,发送的数据已在内存中,有何方法激发发送内存中的数据。求高手指点! --------------------编程问答-------------------- 这个问题我也说不上原因,好象没人仔细地研究过.

但是根据定时器方案能极大提高使用可靠性来看,有可能与VB的单线程工作环境有关.

以前遇到过一个非常典型的例子就是一个服务器端在连接过多的情况下丢失数据,但是协议是采用TCP.

其原因是在DataArrival事件里处理的事件太多了:

一个奇怪的问题请问各位大侠,tcp协议也有丢包的吗?该怎么解决?

你可以参考一下. --------------------编程问答-------------------- 感谢myjian的回复!
我的程序是服务器连接多个客户机,需要及时发送数据,如每一个连接端口使用一个定时器的话,将启用过多的定时器,不实用啊,不知大家在设计服务器连接多个客户机的程序时,是如何解决及时数据发送问题的? --------------------编程问答-------------------- 不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
--------------------编程问答-------------------- zhao4zhong1是说Winsock在设计时缺陷过多,本身先天不足? --------------------编程问答--------------------
引用 15 楼  的回复:
感谢myjian的回复!
我的程序是服务器连接多个客户机,需要及时发送数据,如每一个连接端口使用一个定时器的话,将启用过多的定时器,不实用啊,不知大家在设计服务器连接多个客户机的程序时,是如何解决及时数据发送问题的?

NONO,只需要一个定时器.

定义一个与WINSOCK控件同大小的数组作为每个连接的发送缓存,定时器在每次产生事件时扫描缓存,有数据的就发出,并清空. --------------------编程问答-------------------- 谢谢老马!建议可行
--------------------编程问答--------------------   winsockl.SendData sendmsg
  winsock2.SendData sendmsg
你的是tcp保持连接的协议。搞一下阻塞。winsock就这样。主要看你怎么设计。发送之后返回一个值确定是不是发送成功。判断一下再发送下一个数据.因为你不管怎么弄。除非是多线程。都是先发完这个。再发下一个。要么doevents转移控制权。timer一样也是根据间隔时间转移。
一般我都是这样.1个1个发。就算http协议也是要他返回之后才做绝对。在vb单线程中怎么做都是一样。一条路1个人。你走一下。他走。
  winsockl.SendData sendmsg
 do while x<>"xx" '=看是否收到某个信息。收到就跳出去
doevnets
sleep 1
loop
  winsock2.SendData sendmsg
--------------------编程问答-------------------- 关键是不要在和_DataArrival相同的控制流中使用.SendData;而要通过Timer倒腾一下。
解决思路一:
_DataArrival将收到的数据放在一个FIFO缓冲区中后,启动相应处理Timer,立即Exit Sub;
处理Timer中从FIFO缓冲区中取出数据作必要处理后.SendData
解决思路二:
_DataArrival将收到的数据作相应处理,将要返回的数据放在一个FIFO缓冲区中后,启动相应发送Timer;
发送Timer中从FIFO缓冲区中取出要发送数据.SendData
补充:VB ,  控件
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,