程序分为3方。客户端,中转,终端。
客户端负责收集数据,并逐条发送到中转。大概数据量在100-1000条。
中转负责在接收到数据后将数据转发到终端。
终端是其它公司的接收端,机制不详,只知道终端在每次握手时只能传送一条数据。现有程序是从客户端到中转的发送过程没有问题,问题出现在从中转向终端发送时,终端永远只收一条数据。中转程序中设置了两个Socket,一个用于接收客户端,另一个用于将接收到的数据转发到终端。在第一条发送之后,其余每条的发送会在得到上一条返回值后再发送。通过自己设计的终端测试无论是在内网还是通过公网都能实现。但是在连接实际终端后在得到第一条的反馈信息后,第二条可以发出,但是就在没有恢复信息了。请问这是为什么?相关程序如下:客户端:Option Explicit
Public sendflag As Boolean
Public i As IntegerPrivate Sub Command1_Click()
Call SendToSHA
End SubPrivate Sub Form_Load()
sendflag = True
i = 1
If Winsock1.State = sckClosed Then
    Winsock1.Connect
    DoEvents
End If
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData tempIf temp = "1" Then
    sendflag = True
    i = i + 1
    Call SendToSHA
Else
    sendflag = False
End If
End SubPrivate Sub SendToSHA()Dim j As Integer
j = i
Do While j <= 5
    If sendflag = True Then
    Winsock1.SendData CStr(i) 
    DoEvents
    sendflag = False
    End If
    j = j + 1
LoopEnd Sub中转Option Explicit
Public sendflag As BooleanPrivate Sub Form_Load()
Winsock1.Listen
If Winsock2.State = sckClosed Then
    Winsock2.Connect
    DoEvents
End If
sendflag = True
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close
Winsock1.Accept requestID
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock1.GetData temp
List1.AddItem temp
If Winsock2.State = sckClosed Then
    Winsock2.Connect
    DoEvents
End IfIf sendflag = True Then
    Call SendToCCB(temp)
    sendflag = False
End If
End SubPrivate Sub SendToCCB(temp As String)Winsock2.SendData temp
DoEvents
sendflag = FalseEnd SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim temp As String
Winsock2.GetData temp
List1.AddItem temp
MsgBox temp
Winsock1.SendData "1"
sendflag = True
End Sub

解决方案 »

  1.   

    客户端只跟中转进行通讯,发和回应该是异步了
    看你这一段:Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim temp As String
    Winsock1.GetData temp
    List1.AddItem temp
    If Winsock2.State = sckClosed Then
        Winsock2.Connect
        DoEvents
    End If
    好象在接收的时候再判断发送时的状态?感觉应该是两个并行,有点像FTP
      

  2.   

    我猜测是终端在与中转建立一个连接并接收完中转发送来的送据后,终端就关闭了连接。而中转只用了一个socket,既用于监听,又用于接受请求。注意:在接受请求时,socket的状态已改变,已经不能监听了。如果的确如此,在终端关闭了连接,然后再请求连接时,中转没有监听,无法完成下一个连接。至少,我从中转看到的问题是:接受请求后,将无法建立新连接。
      

  3.   

    多谢各位支持。不过现在中专段已经更改了,在每次收到回复后我将中转关闭,然后再重新开启,可是不知道为什么,Socket的State总是连接中的状态,无法转变成已连接,请问如何处理。
    新修改的中转程序如下:
    Option Explicit
    Public sendflag As Boolean
    Public ss As WinsockPrivate Sub Form_Load()
    Winsock1.Listen
    If Winsock2.State = sckClosed Then
        Winsock2.Connect
        DoEvents
    End If
    MsgBox Winsock2.State
    sendflag = True
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    Winsock1.Close
    Winsock1.Accept requestID
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim temp As String
    Winsock1.GetData temp
    List1.AddItem tempIf Winsock2.State = sckClosed Then
        Winsock2.Connect
        DoEvents
    End IfCall SendToCCB(temp)End SubPrivate Sub SendToCCB(temp As String)If Winsock2.State <> 7 Then
        Winsock2.Close
        Winsock2.Connect
        DoEvents
    End IfWinsock2.SendData temp
    DoEvents
    sendflag = FalseEnd SubPrivate Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
    Dim temp As String
    Winsock2.GetData temp
    List1.AddItem tempWinsock1.SendData "1"
    sendflag = True
    Winsock2.CloseEnd Sub
      

  4.   

    感觉有些乱
    可以参照MSDN上写一下
    而且如果你的数据量不是很大的话,为什么不让中转端一次性发送多条记录呢,这样可以减少握手的次数,每两记录间用特殊符号,如"#"间隔至于客户端可以通过
    wskServer(Index).GetData TempStr
    Str() = Split(TempStr, "#", -1, vbTextCompare)
    然后解析Str()的方式来获取所有记录如果怕通讯误码,可以增加校验包