有一java程序为通讯服务端,这个程序有一个口令验证的过程,connect没问题,登陆也没问题,但是登陆后发包,服务器显示收到的就不对了;直接connect后发包,服务器能收到,当然了,因为没有登陆,所以处理结果不对。
初始化:
If Winsock1.State <> 0 Then
    Winsock1.Close
End If
Winsock1.protocol = sckTCPProtocol
Winsock1.RemoteHost = Txt_ip.Text
Winsock1.RemotePort = Txt_port.Text
Winsock1.connect
登陆:
ReDim loginBuffer(Len(sdata) / 2)
For iLoop = 1 To Len(sdata) / 2
loginBuffer(iLoop - 1) = Val("&H" & Mid(sdata, iLoop * 2 - 1, 2))
Next iLoopDo While Winsock1.State <> sckConnected
DoEvents
Loop
Winsock1.SendData loginBuffer
DoEvents发送的测试包:
Dim activeBuffer() As Byte
Dim iLoop As Integer
Dim sdata1 As String
Dim msg_head As cmpp_head
msg_head.Total_Length = Len(msg_head)
msg_head.Total_Length = Hex(msg_head.Total_Length)
 
For n = 1 To 8 - Len(msg_head.Total_Length)
    msg_head.Total_Length = "0" & msg_head.Total_Length
Next
    msg_head.Command_Id = nCMPP_ACTIVE_TEST
    msg_head.Sequence_Id = getSeq_Id(Sequence_Id)
    
sdata1 = ""
sdata1 = msg_head.Total_Length
sdata1 = sdata1 & msg_head.Command_Id
sdata1 = sdata1 & msg_head.Sequence_Id
sdata1 = sdata1 & vbCrLfReDim activeBuffer(Len(sdata1) / 2)
For iLoop = 1 To Len(sdata1) / 2
activeBuffer(iLoop - 1) = Val("&H" & Mid(sdata1, iLoop * 2 - 1, 2))
Next iLoopDo While Winsock1.State <> sckConnected
DoEvents
Loop
Winsock1.SendData activeBuffer
DoEvents不知道是怎么回事?查了好久,没找到问题所在。请高手解答。

解决方案 »

  1.   

    daisy8675(莫依) ,你是说用两个Winsock控件还是啥,我刚学socket编程,不太清楚,麻烦说具体点。谢谢
      

  2.   

    连接没有问题,都是sckConnected,假设分别发送A、B包,第一次发A包没问题,接着发B包就有问题了;反之,亦然。
      

  3.   

    收到的是错误的,java端显示收到的是空行。
      

  4.   

    lz,数据是什么样的格式发送的呢?有没有事前约定呢?我猜JAVA,SERVER端一定是收到你上一包信息的时候接受到了VBCRLF,所以显示出来了,但是由于没有按约定,在其后加入XX识别码。所以当你第二包到达的时候,那边认为是垃圾数据,所以丢弃了,然后清空接收队列,等待下次数据到达这个原因占80%调试方法如下:
    1.在SENDDATA前,将发送的BYTE包,保存到本地,可以写入二进制,每次都这么做。
    2.检查是否每次的REMOTEIP和REMOTEPORT的值都相同。。
    3.如果测试完毕之后检查4包数据之间的差异。
    4.如果发送数据没有问题的话,可能多半是协议的问题
    5.将数据给JAVA组的同事,看格式是否能正确被SERVER端处理。。呵呵如果是第三方公司,则跟他们的工程师联系,得到正确的数据发送协议
      

  5.   

    多谢acmilan1984 。
    通过调试,从发送的数据包来看,两次发送格式的没有差异。
    只连接了一个远端,所以REMOTEIP和REMOTEPORT是一样的。
    协议就是使用的CMPP3.0。
    我这边做的是一个测试程序,便于测试java组同事做的系统的正确性。我用该测试程序往我写的一个vb的服务端发送数据是没有问题的,从这个角度看,测试测试没有问题;但是我用我写的一个vc的测试程序往java服务端发包,结果是正确的;所以问题还是出在vb测试程序上,我在根据你们的思路找找原因看看,多谢大家。
      

  6.   

    lz推荐你安装一个Sniffer软件监视一下通讯数据包。。
    推荐是用IRIS 4.07.1可以查看正确的发往远程的数据包内容
    你检查VC发送的原始数据包与VB的差别哈哈直接就可以对比了
      

  7.   

    终于搞定了,vb的程序多发了两个字节的0,这样下一个包的包头就不对了。这个问题整了半个月,晕。
    感谢各位,尤其是acmilan1984。