winsock能否传送自定义数据?
请问winsock控件getdata和senddata的数据类型是什么?另外我想通过winsock传送如下自定义数据,编译时通不过,请问有没有什么解决办法?
Type person
id as long
name as string
age as long
End Type
dim person1 as person
with person1
.id =2123
.name="张三“
.age=27
end with
winsock1.senddata (person)
问题点数:20、回复次数:4Top
1 楼helanshan(C++)回复于 2005-05-09 23:17:24 得分 8
1、首先自定义数据类型必须在标准模块中定义.
2、自定义类型中的元素类型如果是字符串,必须是定长字符串(如:name as string*10)
3、发送时应该不能发送整个类型,应该按元素发送:
dim strsend as string ’定义字符串变量
strsend=person1.id & "|" & person1.name & "|" & person1.age
winsock1.senddata strsend
4、接收端对接收到的字符串用split方法进行分割。
--------------------------------------------------------------------------------
我没有进行测试,如果不行,就不要哪个自定义类型了,直接:
strsend=id & "|" & name & "|" & age
Top
2 楼homezj(小吉)回复于 2005-05-09 23:47:18 得分 6
可以先按lenB长度,copymemory进Byte数组,再发送,接收端反过来,将收到的Byte数组copymemory进自定义结构
前提:若有String元素,需定长!Top
3 楼maplevsred(残桓枫雪)回复于 2005-05-09 23:59:24 得分 6
自定义的不能用Socket传。支持楼上的 strsend=id & "|" & name & "|" & age 的方式,我也常用。
如果有二进制数据,可能使用字节数组 dim a() as byte 这样的,用CopyMemory这个API把内容Copy到数组中,再传送数据内容,接收后再把字节数组中的数据Copy到一个自定义结构中。但要注意:结构的长度必须是固定的,特别是不能用非定长的String,因为VB的动态长度的String是用的指针加数据的方式,字符串本身指向的内存单元并不是其内容所在的内存单元,在使用CopyMemory时必然造成著名的“非法操作”。
如果要使用字符串类型的数据,建议用dim b(100) as Integer这样的数组代替,无论中文英文皆占2字节,传输前转换一次,接收后转换一次。
如果你对指针及VB中的指针应用较为熟悉,可以把CopyMemory这个API作如下声明:
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Sub CopyBinToStr Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As String, Source As Any, ByVal Length As Long)
Public Declare Sub CopyStrToBin Lib "kernel32" Alias "RtlMoveMemory" (Destination As Byte, ByVal Source As String, ByVal Length As Long)
具体怎么用看看声明的方式就知道了,如果看不懂,就建议你不要用
Top
4 楼maplevsred(残桓枫雪)回复于 2005-05-10 00:01:18 得分 0
呵呵,不小心比homezj(小吉) 慢了一点,我刚才说的楼上是指的 helanshan(C++) 说的那个。。Top




