WinSocket发送消息时能传递非字符数据吗?
send (SOCKET s,const char FAR * buf, int len,int flags);
如果定义如下联合,现对结构体(MSG.DATA)赋值,然后buf指向MSG.charbuf()
发送出去的数据会残缺不全,为什么呢?
union MSG{
struct DATA abc; //结构体数据,包括字符型、整形等数据项
char charbuf[100]; //charbuf数组,长度与结构相同
}
关键时其中的整形数据接收不到,不知各位大侠有无这样的经历啊,
如何解决的呢?还请赐教啊!
问题点数:50、回复次数:14Top
1 楼tigerjade(tigerjade)回复于 2000-10-24 11:01:00 得分 10
不用做这样的union吧,直接进行强制类型转换。但是需要注意的是网络字节序和主机字节序之间的转换。
char *实际上是指向内存块的一个指针,并不是说这个指针只能是char类型。整型数据因为包括多个字节,因此需要进行字节顺序的转换。
Top
2 楼realcedar(void)回复于 2000-10-24 16:45:00 得分 0
我最先就是用强制类型转换试验的,但是有一个问题就是:发送的时候,
发送全字符型数据是可以的,若是有整形数据,他就会从整形开始的地方
截断,所以发送出去的数据是不完整的。
Top
3 楼realcedar(void)回复于 2000-10-24 16:54:00 得分 0
我最先就是用强制类型转换试验的,做了union实际上是一样的
但是都有有一个问题就是:发送的时候,发送全字符型数据是可以
的,若是有整形数据,他就会从整形开始的地方截断,所以发送出
去的数据是不完整的。
比如说 long i; 那么 i = 8 时,它要占用4个字节,如果
我没记错的话应该是0080。所以发送是一碰到前面的0就会截断。
why???
Top
4 楼kp(老妖)回复于 2000-10-24 16:57:00 得分 0
看看MSDN的例子,里面有一个Chat程序,不知道对你有帮助没有!?Top
5 楼dingsg(丁丁)回复于 2000-10-24 17:23:00 得分 20
你的问题的关键是:
1>char与int 之间存在字结束的差异!
2>网络的传输方式引起了你的问题!
:::当同步传输时,你的问题不会存在!
:::能出现如此问题,我断言此时你的程序使用异步传输模式的!
3>解决这个问题;
在你的结构或者Union中在添加两个或者一个char指针,用于存放int(两倍的char 字节) 数据!
:::
此时我想问题应该可以解决啦
OK?
Top
6 楼tigerjade(tigerjade)回复于 2000-10-24 18:07:00 得分 5
应当不会出现这种情况吧,你只要在len参数中指定sizeof(long),就会把四个字应都发送出去。我以前用这种方式没有问题啊。Top
7 楼ning7608(小牛)回复于 2000-10-24 19:59:00 得分 10
用GloabalLock将其锁定,然后取得handle 的地址,就可以用了Top
8 楼realcedar(void)回复于 2000-10-26 11:24:00 得分 0
谢谢各位的解答,受益非浅。Top
9 楼dingsg(丁丁)回复于 2000-10-26 13:35:00 得分 0
我的分析:
我想你的通信方式是异步方式的!同步应该不会有这个问题的!
问题的解决:
1>发送前把整数分成两部分:高位与低位,用char型
2>收到后,把高位与低位(用char型)转成相应的整数!
OK?
丁丁Top
10 楼meifen(meifen)回复于 2001-07-13 15:29:09 得分 0
4Top




