为什么CSocket接收INT数据会错误..在线等待...

lzd 2002-10-07 04:39:45
客户端代码
struct OpenPoint
{
short Game_Function;
char UserName[20];
int mOpenPoint;
};

CSocket m_pSocket;
OpenPoint m_OpenPoint;

char* CharUserName="daf"
ZeroMemory(&m_OpenPoint,sizeof(OpenPoint));
m_OpenPoint.Game_Function=2;
strcpy(m_OpenPoint.UserName,CharUserName);
m_OpenPoint.UserName[strlen(CharUserName)]='\0';
m_OpenPoint.mOpenPoint=100;


int send = 0;
while(send<sizeof(OpenPoint))
{
int nCharSend=m_pSocket->Send((void*)(&m_OpenPoint+send),sizeof(OpenPoint)-send,0);
send+=nCharSend;
}


服务器代码

struct OpenPoint
{
char UserName[20];
int mOpenPoint;
};

CSocket m_pServerSocket;
OpenPoint m_OpenPoint;
short temp;
m_pServerSocket->Receive(&temp,sizeof(short),0);
switch(temp)
{

case 0:
{
break;
}

case 2:
{
ZeroMemory(&m_OpenPoint,sizeof(OpenPoint));
int receive = 0;
while(receive<sizeof(OpenPoint))
{
int nCharSend=m_pServerSocket->Receive((void*)(&m_OpenPoint+receive),sizeof(OpenPoint)-receive,0);
receive+=nCharSend;
}
}

为什么接收到的m_pServerSocket.mOpenPoint=6553600(本来应该是100)而m_pServerSocket.UserName则正常?
...全文
43 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
everandforever 2002-10-07
  • 打赏
  • 举报
回复
struct OpenPoint
{
short Game_Function; //和USERNAME前2字节共占4字节
char UserName[20]; //剩下18字节,占5个四字节
int mOpenPoint; //占一个4字节.
};
struct OpenPoint
{
char UserName[20]; //占5个四字节
int mOpenPoint; //占一个四字节
};

解决方法:short Game_Function改为int类型就 可以 了.
lzd 2002-10-07
  • 打赏
  • 举报
回复
太谢谢啦..高手..给分啦...
我的QQ:11091594
MSN:liuzhidong1981@hotmail.com
everandforever 2002-10-07
  • 打赏
  • 举报
回复
啊,对数据对齐.
everandforever 2002-10-07
  • 打赏
  • 举报
回复
没见有什么错,你CASE 2,BREAK了没有?
han012 2002-10-07
  • 打赏
  • 举报
回复
这是一个关于使用CSocket传输struct数据类型的非常经典的错误.

错误原因在于结构(struct)中有数据对齐属性!
关于这一点可以用sizeof(OpenPoint)来确认, 返回值不是你期望的!
不同的机器对于对齐属性有不同的设置,所以不进行1byte对齐而在不同的机器间传递结构一定会有多余的填充数据扰乱传输结果...

关于控制结构(struct)对齐属性有多种方法,最简单的方法如下:

1)open menu "project\settings..."
2)select "C\C++" tab
3)select "Code generation" category
4)select "1 Byte" from "struct member alignment" list
5)rebuild all projects and run again.


16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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