自定义结构体赋值给byte指针,怎么取出数据来呢

自定义结构体赋值给byte指针,如何取出数据来呢?
本帖最后由 oyljerry 于 2014-03-12 09:53:01 编辑
如下所示:
char lpData[sizeof(NETDATA_PACK)+sizeof(LOGIN_INFO)];
ZeroMemory(lpData,sizeof(lpData));
((LPNETDATA_PACK)lpData)->dwFlag=FLAG_NETDATA;
((LPNETDATA_PACK)lpData)->dwMessage=NETCMD_LOGIN;
((LPNETDATA_PACK)lpData)->dwLength=sizeof(LOGIN_INFO);
*((int*)((LPNETDATA_PACK)lpData)->lpData)=1;
if(m_Client.Send(m_Client.GetConnectionID(), (LPBYTE)lpData, iLen))
{
    ::LogSend(m_Client.GetConnectionID(), strContent);
    return TRUE;
}
我将要发送的数据lpData数组强制转换为(LPBYTE)类型了,其中lpData数组存的是((LPNETDATA_PACK)结构体数据,我服务端收到数据之后我如何得到((LPNETDATA_PACK)类型的数据呢?下面是我服务端收到数据的函数
ISocketListener::EnHandleResult CICMServerDlg::OnReceive(CONNID dwConnID, const BYTE* pData, int iLength)
{
......................
.......................
.........................
}
------解决方案--------------------
按照数据结构体强转
------解决方案--------------------
如果是TCP,不能保证每次收到的都是一个完整的数据包,所以得缓存接收到的数据,按照接收的数据长度来取,要么定义协议,增加帧头帧尾,然后按协议解析取数据。
------解决方案--------------------
我觉得可以增加头尾字段,然后再解析读取。
------解决方案--------------------
自定义结构体赋值给byte指针,怎么取出数据来呢
------解决方案--------------------
如果保证每次发的数据都是定长,直接接收凑齐长度再处理。
如果是变长的,可以弄个简单包头指明长度,然后接收到凑齐指定长度的数据再处理。简单模型如下(不包含错误处理)
定长

int totalLen = 0;
int rcvLen = sizeof(MSG_PACKET);

while((rcvLen = recv(acceptedSocket, ((char*)&msgPacket) + totalLen, sizeof(MSG_PACKET) - totalLen, 0)) > 0)
{
totalLen += rcvLen;
if(totalLen < sizeof(MSG_PACKET))
{
continue;
}

break;
}


变长(未考虑大小端,网络字节序问题):

int totalLen = 0;
int rcvLen = sizeof(int);
int dataLen = -1;
while((rcvLen = recv(acceptedSocket, ((char*)&dataLen) + totalLen , sizeof(int) - totalLen, 0)) > 0)
{
totalLen += rcvLen;
if(totalLen < sizeof(int))
{
continue;
}

break;
}

if(0 > dataLen)
{
//该干嘛干嘛
}

totalLen = 0;
rcvLen = dataLen;
byte *dataBuf = (byte*)malloc(dataLen);
memset(dataBuf, 0, dataLen);
while((rcvLen = recv(acceptedSocket, ((char*)&dataLen) + totalLen, dataLen - totalLen, 0)) > 0)
{
totalLen += rcvLen;
if(totalLen < dataLen)
{
continue;
}

break;
}

       //这里真是该干嘛干嘛


写得有点仓促,有些漏洞,但大致思路这样应该是可以了。
------解决方案--------------------
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;