讨论winsock控件接收数据原理,不知道大家有没有遇到过?

时间:2022-07-04 20:54:21
我今天遇到了一个奇怪的问题,,不过已经解决了..但我还是不知道,接收原理..
我用一个子过程调用Servers.Winsock1.SendData "IsProcess" & Prc 发送数据
但是接收方只能接收到8个数据..刚开始我以为发送方有问题,调试看了下发送的是完整数据,没有问题..
我又把接收方的得到的数据输出到立即窗口 的确值接收到了8个数据,,,问题可能是接收方..可能因Chr(0)(空格太多)

请大家帮我解释下为什么我发送20多个数据接收方只能接收到8个 而去掉发送方的Chr(0)(很多这个)接收方就可以收到完整数据了....
如果接收方发现空格太多是不是接收一半数据啊?


我先给出没有修改的发送方代码:
 


Function Get_Prc_List()
DoEvents
  Dim Prc As String
   PrcHwnd = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) '快照系统所有进程
     If PrcHwnd <> -1 Then
      Dim PrcInfo As PROCESSENTRY32
       PrcInfo.dwSize = Len(PrcInfo)
        If Process32First(PrcHwnd, PrcInfo) <> 0 Then
           Prc = PrcInfo.szExeFile & vbCrLf
        While Process32Next(PrcHwnd, PrcInfo) <> 0
           Prc = Prc & PrcInfo.szExeFile & vbCrLf
         Wend
        End If
        Servers.Winsock1.SendData "IsProcess" & Prc
        Debug.Print Prc
     End If
End Function




就是这2句了:Prc = PrcInfo.szExeFile & vbCrLf   
             Prc = Prc & PrcInfo.szExeFile & vbCrLf



我把这2句改成这样接收方就可以收到完整数据了..
Prc = Left(PrcInfo.szExeFile, InStr(1, PrcInfo.szExeFile, Chr(0)) - 1) & vbCrLf
Prc = Prc & Left(PrcInfo.szExeFile, InStr(1, PrcInfo.szExeFile, Chr(0)) - 1) & vbCrLf

这样就没有问题..请大家解释下我听可以吗?






     

13 个解决方案

#1


为什么去掉那些Chr(0) 接收方才可以得到完整数据呢? 
因为发送方的chr(0)太多而导致的吗?

#2


MsgBox "Str1" & Chr(0) & "Str2"
运行下试试。

估计与这原理差不多,但我说不清。

#3


有些真说不清,有一次我遇上过"g"或者"G"字符打头的数据包发不出去的情况,重装了一次电脑就好了
chr(0)也是能发的,不过含有asc值大于127的最好不要用字符串来发,接收的时候会出错

#4


引用 3 楼 bakw 的回复:
有些真说不清,有一次我遇上过"g"或者"G"字符打头的数据包发不出去的情况,重装了一次电脑就好了
chr(0)也是能发的,不过含有asc值大于127的最好不要用字符串来发,接收的时候会出错


不用字符串来发那用什么来发呢?有的人说字节数组来发..这个怎么用?
我发送的数据前面都带一个字符串的..主要用来给接收端判断用的..接收到的命令是什么.

#5


不可显示字符的发送是要慎重处理的~~~

#6


引用 5 楼 chinayuppie 的回复:
不可显示字符的发送是要慎重处理的~~~

是啊..我处理掉了那些Chr(0)了..

#7


用字节发送,用协议控制,参考:

http://blog.m5home.com/article.asp?id=169

#8


引用 1 楼 near1 的回复:
为什么去掉那些Chr(0) 接收方才可以得到完整数据呢? 
因为发送方的chr(0)太多而导致的吗?
这个可能是被截断了,因为chr(0)一般是作为字符串结束标志的.

使用字节方式发送,再解析字节内容...就没问题了.

#9


该回复于2011-06-27 12:23:16被版主删除

#10


不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!

#11


特殊符号直接在客户端进行解析

#12


VB在读到chr(0) 时,会认定字符串结束了。
chr(0)是字符串的结束符,无论是VB,还是C语言,都一样的。既然是结束了,当然发送不过去。

#13


 Dim Prc As String
 Dim B() As Byte
B=strconv("IsProcess" & Prc,vbFromUnicode)
Servers.Winsock1.SendData B

#1


为什么去掉那些Chr(0) 接收方才可以得到完整数据呢? 
因为发送方的chr(0)太多而导致的吗?

#2


MsgBox "Str1" & Chr(0) & "Str2"
运行下试试。

估计与这原理差不多,但我说不清。

#3


有些真说不清,有一次我遇上过"g"或者"G"字符打头的数据包发不出去的情况,重装了一次电脑就好了
chr(0)也是能发的,不过含有asc值大于127的最好不要用字符串来发,接收的时候会出错

#4


引用 3 楼 bakw 的回复:
有些真说不清,有一次我遇上过"g"或者"G"字符打头的数据包发不出去的情况,重装了一次电脑就好了
chr(0)也是能发的,不过含有asc值大于127的最好不要用字符串来发,接收的时候会出错


不用字符串来发那用什么来发呢?有的人说字节数组来发..这个怎么用?
我发送的数据前面都带一个字符串的..主要用来给接收端判断用的..接收到的命令是什么.

#5


不可显示字符的发送是要慎重处理的~~~

#6


引用 5 楼 chinayuppie 的回复:
不可显示字符的发送是要慎重处理的~~~

是啊..我处理掉了那些Chr(0)了..

#7


用字节发送,用协议控制,参考:

http://blog.m5home.com/article.asp?id=169

#8


引用 1 楼 near1 的回复:
为什么去掉那些Chr(0) 接收方才可以得到完整数据呢? 
因为发送方的chr(0)太多而导致的吗?
这个可能是被截断了,因为chr(0)一般是作为字符串结束标志的.

使用字节方式发送,再解析字节内容...就没问题了.

#9


该回复于2011-06-27 12:23:16被版主删除

#10


不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!

#11


特殊符号直接在客户端进行解析

#12


VB在读到chr(0) 时,会认定字符串结束了。
chr(0)是字符串的结束符,无论是VB,还是C语言,都一样的。既然是结束了,当然发送不过去。

#13


 Dim Prc As String
 Dim B() As Byte
B=strconv("IsProcess" & Prc,vbFromUnicode)
Servers.Winsock1.SendData B