网络编程中的结构体转化成char*该如何解决

网络编程中的结构体转化成char*
typedef struct PacketHead

BYTE BitType;//通信包和数据包的类型
BYTE Num;//序号
BYTE Length;//包的长度
BYTE Remain;//保留字段
}PacketHead,*pPacketHead;
typedef struct Packet
{
PacketHead Head; //数据头
CString Str; //数据区
WORD CRC; //CRC校验码
}Packet,pPacket;


如何将Packet包转化成char* 因为网络编程中send()函数的参数是char*

不要(char*)
不要 CString str.Format("%c%c%c%c%s%d",......)
不要 memcpy();
这三种情况是遇到 0 字符串就截断了,后面的字符串都丢了。




------解决方案--------------------
结构体中不要含有指针成员,将结构体中的CString换成char[],然后直接send发送结构体

或者你序列话成byte[],不一定非要转成char[]吧
------解决方案--------------------
用va系列函数,比如va_list,va_start,va_end,vsnprintf等。linux下一般这样用,windows好象也兼容,你查一下msdn
------解决方案--------------------
char*只是类型标志而已,对于大多数接受char*的函数都有0截断的规则,
但send没有,char*只是给你一个指向设置而已,send函数也也有长度设置,
要转的话Packet对象指针强转char*即可,

还有Packet结构体内别出现象CString那样有多维内存的对象,否则接收异常
------解决方案--------------------
关注 帮顶了。。。
遇到0字符截断,#pragma pack(1)下会有效果吗?。。。
------解决方案--------------------
楼主的意思,是指这样的结果不正确吧!
Packet p;
send(s,(char*)&p,strlen((char*)&p),0);

这样当然不能用了。你这样数据格式本身是有问题的。

我建议你这样设计
typedef struct Packet
{
PacketHead Head; //数据头
WORD CRC; //CRC校验码
char Str[65536]; //数据缓冲区,建议直接用字符组
}Packet,pPacket;

由于数据头,校验,是固定的,应该放在前面,而数据是可变的,应该放在后面,这样内存数据是连续的,处理起来就方便


send(s,(char*)&p,sizeof(PacketHead) + sizeof(WORD) + strlen(Str),0);

如果你用CString Str的话,就要这样发送

send(s,(char*)&p,sizeof(PacketHead) + sizeof(WORD),0);
send(s,(char*)(LPCTSTR)p.Str,p.Str.GetLength(),0);


另外,如果你说的0字符串,如果是包含在数据区的,那么需要一个额外的值来保存数据长度,你必须知道这个长度。

typedef struct Packet
{
PacketHead Head; //数据头
WORD CRC; //CRC校验码
int StrLength;// 数据长度
char Str[65536]; //数据缓冲区,建议直接用字符组
}Packet,pPacket;

------解决方案--------------------
CString Str; //数据区
 
这东西不行.未知长度.而且他指向的是个指针