socket传输数据的数据尺寸问题?

dotnet90 2010-04-26 03:40:20
//用户出牌
struct CMD_S_OutCard
{
WORD wCardType;
WORD wHuangShang;
BYTE bAllCardCount[GAME_PLAYER]; //扑克数目
BYTE bAllCardData[GAME_PLAYER][15]; //扑克列表
BYTE bCardCount; //出牌数目
WORD wCurrentUser; //当前玩家
WORD wOutCardUser; //出牌玩家
WORD wChaOrGouUser; //叉勾用户 BYTE bCardData[15]; //扑克列表
};

CMD_S_OutCard OutCard;//用户出牌
ZeroMemory(&OutCard, sizeof(OutCard));
OutCard.wCardType = 0;
OutCard.bCardCount=bCardCount;
OutCard.wOutCardUser=m_wCurrentUser;
OutCard.wCurrentUser=m_wCurrentUser;
OutCard.wHuangShang=m_wHuangShang;
CopyMemory(OutCard.bAllCardCount,m_bCardCount,sizeof(m_bCardCount));
CopyMemory(OutCard.bAllCardData,m_bHandCardData,sizeof(BYTE)*sizeof(m_bHandCardData));
CopyMemory(OutCard.bCardData,m_bTurnCardData,m_bTurnCardCount*sizeof(BYTE));

WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);



接收的时候,
//变量定义
CMD_S_OutCard * pOutCard=(CMD_S_OutCard *)pBuffer;
WORD wHeadSize=sizeof(CMD_S_OutCard)-sizeof(pOutCard->bCardData);

//效验数据
ASSERT(wDataSize>=wHeadSize);
if (wDataSize<wHeadSize) return false;
ASSERT(wDataSize==(wHeadSize+pOutCard->bCardCount*sizeof(pOutCard->bCardData[0])));
if (wDataSize!=(wHeadSize+pOutCard->bCardCount*sizeof(pOutCard->bCardData[0]))) return false;
在没有上面结构体的红色变量是正确的,多加了一个变量就不能用了,请大家帮我看看错在哪里了?
...全文
247 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dotnet90 2010-05-27
  • 打赏
  • 举报
回复
谢谢 谢谢
Un1 2010-04-26
  • 打赏
  • 举报
回复
tcp是会粘包的,需要直接写上层协议。简单点用udp也行,但通常包不要大于1500
pbdwadr 2010-04-26
  • 打赏
  • 举报
回复
wChaOrGouUser发送前没有初始化
dotnet90 2010-04-26
  • 打赏
  • 举报
回复
struct CMD_S_OutCard
{
WORD wCardType;
BYTE bAllCardCount[GAME_PLAYER]; //扑克数目
BYTE bAllCardData[GAME_PLAYER][15]; //扑克列表
BYTE bCardCount; //出牌数目
WORD wCurrentUser; //当前玩家
WORD wOutCardUser; //出牌玩家
};
这个结构体在用socket传输的过程中,
WORD wSendSize=sizeof(OutCard)-sizeof(OutCard.bCardData)+OutCard.bCardCount*sizeof(BYTE);
m_pITableFrame->SendTableData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);
m_pITableFrame->SendLookonData(INVALID_CHAIR,SUB_S_OUT_CARD,&OutCard,wSendSize);

wSendSize正确吗?

接收的时候数据大小的校验这样的写法有错误吗?
Eleven 2010-04-26
  • 打赏
  • 举报
回复
难道是结构体对齐的问题??猜的?
呵呵,最好Debug下调试看看吧
尹成 2010-04-26
  • 打赏
  • 举报
回复
对,同意1楼的思路!
快乐鹦鹉 2010-04-26
  • 打赏
  • 举报
回复
//效验数据
这下面的代码行加断点,看哪个条件不满足。

18,356

社区成员

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

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