CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

winsock能否传送自定义数据?

楼主bebelee()2005-05-09 22:09:56 在 VB / 基础类 提问

请问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

相关问题

  • winsock的send方法能不能传送自定义的数据类型呀?
  • 如何传送自定义消息
  • Winsock控件是否可以传送二进制和用户自定义类型数据
  • datagrid能否插入自定义列?
  • VB能否传递自定义类型(自定义Type类型的传递问题)?
  • 自定义控件能否做成容器?
  • 自定义的结构类型能否做为输出参数?
  • 能否给CDO的Message加上自定义的属性?
  • 数据窗口中能否使用自定义函数?(6.5)
  • 如何自定义消息?能否给个例子

关键词

  • 数据
  • winsock
  • 自定义
  • strsend
  • 字符串
  • 类型
  • senddata
  • person
  • 接收
  • 元素

得分解答快速导航

  • 帖主:bebelee
  • helanshan
  • homezj
  • maplevsred

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo