求助:网络发送结构体的字节序问题

化了妆的幸福呀 2014-01-18 11:58:07
刚学网络编程不久,在做一个接受功能的时候,发现字节序不正确。
发送端主要部分:
#pragma pack(1)
struct Msg1{
BYTE num;
BYTE iden;
short len;
short avalia;
int path;
int pitch;
int roll;
}msg1;
msg1.num=0x00;
msg1.iden=0xb0;
msg1.len=htons(0x0012);
UpdateData();
if (m_pose==0)
{
msg1.avalia=htons(0x0000);

}
else
{
msg1.avalia=htons(0x0001);
}
msg1.path=htonl(0x12345678);
msg1.pitch=htonl(0x09876543);
msg1.roll=htonl(0x01100220);

char SendBuffer[18];


memcpy(SendBuffer,&msg1,sizeof(msg1));
sendto(m_socket,SendBuffer,18,0,
(SOCKADDR*)&addrTo,sizeof(SOCKADDR));

接收端主要部分:
DWORD WINAPI CFistDlg::RecvProc(LPVOID lpParameter)
{
SOCKET sock=((RECVPARAM*)lpParameter)->sock;
HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;

SOCKADDR_IN addrRecv;
int len = sizeof(SOCKADDR);

char recvBuf[100];


int recvRst;
CString recvStr;

while(TRUE)
{
recvRst = recvfrom(sock, recvBuf, 100, 0, (SOCKADDR*)&addrRecv, &len);

if (SOCKET_ERROR == recvRst)
{

break;
}

::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)recvBuf);

}
return 0;
}



void CFistDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
typedef struct AA
{
BYTE num;
BYTE iden;
short len;
short avalia;
int path;
int pitch;
int roll;
}aa;
AA *paa=(AA *)lParam;

SetDlgItemInt(IDC_EDIT_RECV,paa->num);
SetDlgItemInt(IDC_EDIT1,paa->iden);
SetDlgItemInt(IDC_EDIT2,ntohs(paa->len));
SetDlgItemInt(IDC_EDIT3,ntohs(paa->avalia));
SetDlgItemInt(IDC_EDIT4,ntohl(paa->path));
SetDlgItemInt(IDC_EDIT5,ntohl(paa->pitch));
SetDlgItemInt(IDC_EDIT6,ntohl(paa->roll));
}

我是用串口调试助手在另一台电脑上接收十六进制的,然后在发送回来,可是结果int型的结果不正确,BYTE和short的接收结果都是正确的,请问是我哪里错了呢?先谢谢了,第一次发帖,不会把程序粘成code格式的,不好意思了。
...全文
162 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2014-01-18
  • 打赏
  • 举报
回复
你的接收端不用#pragma pack(1)指定对齐方式?
  • 打赏
  • 举报
回复
谢谢,糊涂了~结贴了
我系麦叔叔 2014-01-18
  • 打赏
  • 举报
回复
楼上正解。#pragma pack(1)字节对齐

18,356

社区成员

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

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