A_server 控件是 服务器端的 winsock 控件。A_client 控件是 客户端的 winsock 控件。
现假定 A_server 装在服务器上。客户端程序分别装在 A、B、C 三台客户端上。现在A发送一段字符串 "abcdefg",给A_server 服务器端。如何能让 A_server 服务器端,将此 "abcdefg" 字符串转发给 A、B、C 三台机器上????**************************************************Private Sub lt_server_DataArrival _
(index As Integer, ByVal bytesTotal As Long)Dim strData As String
lt_server(index).GetData strDataFor i = 0 To intMax
If lt_server(i).State = 7 Then
' MsgBox lt_server(i).LocalPort
lt_server(i).SendData strData
End If
Next i
End Sub**************************************************
现假定 A_server 装在服务器上。客户端程序分别装在 A、B、C 三台客户端上。现在A发送一段字符串 "abcdefg",给A_server 服务器端。如何能让 A_server 服务器端,将此 "abcdefg" 字符串转发给 A、B、C 三台机器上????**************************************************Private Sub lt_server_DataArrival _
(index As Integer, ByVal bytesTotal As Long)Dim strData As String
lt_server(index).GetData strDataFor i = 0 To intMax
If lt_server(i).State = 7 Then
' MsgBox lt_server(i).LocalPort
lt_server(i).SendData strData
End If
Next i
End Sub**************************************************
For i = 0 To intMax
If lt_server(i).State = 7 Then
' MsgBox lt_server(i).LocalPort
lt_server(i).SendData strData
End If修改为:dim wsk as winsock
for each wsk in lt_server
if wsk.index<>= and wsk.index<>index and wsk.state= 7 then
wsk.senddata strdata
endif
next wsk其实上面的代码 就是 一个index接收到了数据,就跟所有连接的index发送
不过应该用 集合的方式,而不是循环
-》
if wsk.index<>0 and wsk.index<>index and wsk.state= 7 then
If lt_server(i).State = 7 Then
lt_server(i).SendData strData
End If
Next i往客户端发信息,却只有最后登陆的客户端才可以收到信息。而其他的客户端都没有收到。这是为什么????
while lt_server(i).State <> sckconnected
do events '这里面加超时判断,以免死循环
wend If lt_server(i).State = 7 Then
lt_server(i).SendData strData
End IfNext i
楼上的这位。能不能把你的服务器端的代码帖出来看一下啊???谢谢了。
For i = 1 To intMax
lt_server(i).SendData strData
Next i
End Sub '如果这样写,那么收到信息的 只有最后一个与服务器相连的客户端。
*******************************************************************************
Private Sub lt_server_DataArrival(Index As Integer, ByVal bytesTotal As Long) lt_server(Index).GetData strData
For i = 1 To intMax
lt_server(i).SendData strData
msgbox "aaaaaaaaa" '这里莫非起个延迟的作用???
Next i
End Sub '如果这样写,那么所有客户端就都可以收到了。
'可是其中是什么原理.
*******************************************************************************
http://expert.csdn.net/Expert/topic/1857/1857336.xml?temp=.5424616可能是winsock的bug, 你需要在循环中加 doevents便可以 ,上面的帖子说明了原因
DoEvents 函数会返回一个 Integer,以代表 Visual Basic 独立版本中打开的窗体数目,例如,Visual Basic,专业版,在其它的应用程序中,DoEvents 返回 0。DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件,并且在 SendKeys 队列中的所有键也都已送出之后,返回控制权。DoEvents 对于简化诸如允许用户取消一个已启动的过程 — 例如搜寻一个文件 — 特别有用。对于长时间过程,放弃控制权最好使用定时器或通过委派任务给 ActiveX EXE 部件来完成。以后,任务还是完全独立于应用程序,多任务及时间片由操作系统来处理。小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。
*****************************************************************看了,微软msdn的这么多罗嗦的话.可是关于上面这段,没有几句能看得懂的。它说的太抽像
那么,这个函数倒底是干嘛的,起什么作用。谁能用最通俗的话来讲给我听听呀?
谢谢"我爱吃猪肉,但是长不胖,为什么??" 以及 "rapper" 和所有给此帖回复的热心朋友。稍后,我会把分结上。谢谢你们的回复:)
小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。
****************************************************************
尤其是这一段,说的这么吓人,可是却不知道它在说什么意思????像这段程序代码,会不会有问题??Private Sub lt_server_DataArrival(Index As Integer, ByVal bytesTotal As Long)
lt_server(Index).GetData strData
For i = 1 To intMax
lt_server(i).SendData strData
DoEvents
Next i
End Sub有这么几点值得注意: 比如服务器每次收到一条信息后要转送给几十个客户端。
此时,比如客户端B发了一条信息,然后服务器开始For 循环,转送B发来的信息给其他几十个客户端。而还没有执行完上面这段代码,客户端C 却又发出了一条信息,那么此时服务器怎么处理????并且,这种没有执行完这段代码,又再次调用了doevents这条语句。会不会是上面那段所说?
不是一個連線請求,可以透過建立一控制項陣列的方式,使用同一個控制項,來同時接受多個連線請求。利用這種方法,不再需要關閉連線,而只需建立新的控制項執行個體 (透過設定其 Index 屬性),然後在新的執行個體上呼叫 Accept 方法。下面的程式碼假設名稱為 sckServer 的表單上有一個 Winsock 控制項,它的 Index 屬性被設定為 0;因此,此控制項是控制項陣列的一部份。在宣告部份,宣告了一個模組層次的變數 intMax。在表單的 Load 事件中,intMax 被設定為 0,陣列中第一個控制項的 LocalPort 屬性被設定為 1001。然後呼叫控制項的 Listen 方法,使之成為「聆聽」控制項。在連線請求到達時,程式碼將檢測 Index 是否為 0 (「聆聽」控制項的值)。如果為 0,聆聽控制項將遞增 intMax 的值,並使用該號碼來建立新的控制項執行個體。然後,使用新的控制項執行個體接受連線請求。Private intMax As LongPrivate Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End SubPrivate Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub
小心 确保以 DoEvents 放弃控制权的过程,在第一次 DoEvents 返回之前,不能再次被其他部分的代码调用;否则会产生不可预料的结果。此外,如果其它的应用程序可能会和本过程以不可预知的方式进行交互操作,那么也不要使用 DoEvents,因为此时不能放弃控制权。
****************************************************************
尤其是这一段,说的这么吓人,可是却不知道它在说什么意思????像这段程序代码,会不会有问题??Private Sub lt_server_DataArrival(Index As Integer, ByVal bytesTotal As Long)
lt_server(Index).GetData strData
For i = 1 To intMax
lt_server(i).SendData strData
DoEvents
Next i
End Sub有这么几点值得注意: 比如服务器每次收到一条信息后要转送给几十个客户端。
此时,比如客户端B发了一条信息,然后服务器开始For 循环,转送B发来的信息给其他几十个客户端。而还没有执行完上面这段代码,客户端C 却又发出了一条信息,那么此时服务器怎么处理????并且,这种没有执行完这段代码,又再次调用了doevents这条语句。会不会是上面那段所说?
----------->
doevents的时候,如果c又发了一条消息,又产生了这个事件,则会再次调用,如果一直这样循环,
列如c发送的频率很快,则会导致 stack overflow错误,你可以观看践的结构
lt_server_DataArrival
..other code
lt_server_DataArrival
..other code
lt_server_DataArrival
..other code
lt_server_DataArrival
..other code
.........
这个other code就是doevents的时候执行的消息队列检测。他又会去调用
lt_server_DataArrival这个函数,所幸这中情况很难发生
1: c一般来说不会如此频繁
2: dataarrival事件每次到达时间有一个最小间隔,即winsock线程的检测间隔
而doevents的时候一般小于这个时间
3: 即便重掉,要stack overflow 也不容易,原因是c一般也不会持续频繁不过这中问题,我曾经在comm的oncomm事件中发生过
从设计角度来看,在系统会调用的事件中最好不用doevents, 这里不用会收不到
应该是winsock的bug(要不没道理解释),可以用API sleep(10)来代替
doevent应该发生在用户的函数中,在一个运算时间很长的循环中,使ui不会停止
响应的情况