自定义结构体赋值给byte指针,如何取出数据来呢?

wushuang443 2014-03-12 08:57:06
如下所示:
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)
{
......................
.......................
.........................
}
...全文
325 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushuang443 2014-03-13
  • 打赏
  • 举报
回复
谢谢各位的建议与分享,解决了问题了。谢谢哈,
赵4老师 2014-03-12
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html
赵4老师 2014-03-12
  • 打赏
  • 举报
回复
#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;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
啵啵啃 2014-03-12
  • 打赏
  • 举报
回复
引用 6 楼 wushuang443 的回复:
[quote=引用 3 楼 dahaiI0 的回复:] 如果是TCP,不能保证每次收到的都是一个完整的数据包,所以得缓存接收到的数据,按照接收的数据长度来取,要么定义协议,增加帧头帧尾,然后按协议解析取数据。
已经定义了自己的网络数据协议包了,((LPNETDATA_PACK这个结构体就是网络协议包,我客户端这样发送数据,我测试过了,长度是对的,我服务端的代码如下:LPLOGIN_INFO m_login; m_login=((LPLOGIN_INFO)((LPNETDATA_PACK)pData)->lpData); TRACE("mType=%d,\n",m_login->mType); TRACE("dwFlag=%d,dwMessage=%d,dwLength=%d,lpData=%d,\n",((LPNETDATA_PACK)pData)->dwFlag,((LPNETDATA_PACK)pData)->dwMessage,((LPNETDATA_PACK)pData)->dwLength,m_login->mType);
第一个问题是:TRACE语句都不执行,直接跳过去了,。。。。 第二个问题:第二个TRACE语句前面3个有值,问题是第4个没有值,也就是说我m_login=((LPLOGIN_INFO)((LPNETDATA_PACK)pData)->lpData);这样好像没取到存储在lpdata里面的值[/quote] m_login = (LPLOGIN_INFO)pData + sizeof(NETDATA_PACK); 应该是这样吧,不知道你发送端怎么定义的。 如果LPNETDATA_PACK是LPNETDATA_PACK类型的指针的话,那么你发送的数据应该是包含了NETDATA_PACK和LOGIN_INFO两个结构体的数据,所以你解析LOGIN_INFO的数据时应将LPOGIN_INFO指向的地址偏移到NETDATA_PACK内容之后
啵啵啃 2014-03-12
  • 打赏
  • 举报
回复
引用 6 楼 wushuang443 的回复:
[quote=引用 3 楼 dahaiI0 的回复:] 如果是TCP,不能保证每次收到的都是一个完整的数据包,所以得缓存接收到的数据,按照接收的数据长度来取,要么定义协议,增加帧头帧尾,然后按协议解析取数据。
已经定义了自己的网络数据协议包了,((LPNETDATA_PACK这个结构体就是网络协议包,我客户端这样发送数据,我测试过了,长度是对的,我服务端的代码如下:LPLOGIN_INFO m_login; m_login=((LPLOGIN_INFO)((LPNETDATA_PACK)pData)->lpData); TRACE("mType=%d,\n",m_login->mType); TRACE("dwFlag=%d,dwMessage=%d,dwLength=%d,lpData=%d,\n",((LPNETDATA_PACK)pData)->dwFlag,((LPNETDATA_PACK)pData)->dwMessage,((LPNETDATA_PACK)pData)->dwLength,m_login->mType);
第一个问题是:TRACE语句都不执行,直接跳过去了,。。。。 第二个问题:第二个TRACE语句前面3个有值,问题是第4个没有值,也就是说我m_login=((LPLOGIN_INFO)((LPNETDATA_PACK)pData)->lpData);这样好像没取到存储在lpdata里面的值[/quote] 我晕,刚才写代码去了没看到你这个,重新再看看。
啵啵啃 2014-03-12
  • 打赏
  • 举报
回复
如果保证每次发的数据都是定长,直接接收凑齐长度再处理。 如果是变长的,可以弄个简单包头指明长度,然后接收到凑齐指定长度的数据再处理。简单模型如下(不包含错误处理) 定长

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;
		}	

       //这里真是该干嘛干嘛
写得有点仓促,有些漏洞,但大致思路这样应该是可以了。
wushuang443 2014-03-12
  • 打赏
  • 举报
回复
引用 3 楼 dahaiI0 的回复:
如果是TCP,不能保证每次收到的都是一个完整的数据包,所以得缓存接收到的数据,按照接收的数据长度来取,要么定义协议,增加帧头帧尾,然后按协议解析取数据。
已经定义了自己的网络数据协议包了,((LPNETDATA_PACK这个结构体就是网络协议包,我客户端这样发送数据,我测试过了,长度是对的,我服务端的代码如下:LPLOGIN_INFO m_login; m_login=((LPLOGIN_INFO)((LPNETDATA_PACK)pData)->lpData); TRACE("mType=%d,\n",m_login->mType); TRACE("dwFlag=%d,dwMessage=%d,dwLength=%d,lpData=%d,\n",((LPNETDATA_PACK)pData)->dwFlag,((LPNETDATA_PACK)pData)->dwMessage,((LPNETDATA_PACK)pData)->dwLength,m_login->mType);
第一个问题是:TRACE语句都不执行,直接跳过去了,。。。。 第二个问题:第二个TRACE语句前面3个有值,问题是第4个没有值,也就是说我m_login=((LPLOGIN_INFO)((LPNETDATA_PACK)pData)->lpData);这样好像没取到存储在lpdata里面的值
wukonggaoxing 2014-03-12
  • 打赏
  • 举报
回复
action爱生活 2014-03-12
  • 打赏
  • 举报
回复
我觉得可以增加头尾字段,然后再解析读取。
dahaiI0 2014-03-12
  • 打赏
  • 举报
回复
如果是TCP,不能保证每次收到的都是一个完整的数据包,所以得缓存接收到的数据,按照接收的数据长度来取,要么定义协议,增加帧头帧尾,然后按协议解析取数据。
wushuang443 2014-03-12
  • 打赏
  • 举报
回复
引用 1 楼 jiuzhoulh 的回复:
按照数据结构体强转
试了不行啊。要不你写来看下
jiuzhoulh 2014-03-12
  • 打赏
  • 举报
回复
按照数据结构体强转

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧