一个由sizeof引发的问题

在C/S程序中,往往需要在服务端和客户端传送结构体,在最近的一个项目中定义了如下的结构体:

class ISign
{
public:

	unsigned short	m_sSign;
	long	m_sSumLen;
	char	md5[40];
	long	reqId;
};

#define SIGN_LEN	sizeof(ISign)

客户端和服务器端都使用了该结构体,由于在服务器端重新指定了对齐方式(#pragma pack(1)),所以SIGN_LEN的长度是50(2+4+40+4),

但在客户端程序中使用了默认的对齐方式(#pragma pack()),所以SIGN_LEN的长度是52(4+4+40+4)。

在这种情况下,使用SOCKET发送标识头的时候,由于客户端和服务端之间约定的字节流长度不一致,导致程序无法运行。

其他知识点:

可以通过#pragma pack(X), 在代码中改变部分结构体的对齐方式,也可以通过VS2008来设置,如下图

参考资料:

http://blog.csdn.net/susan19890313/article/details/7489848

时间: 2024-12-15 01:45:58

一个由sizeof引发的问题的相关文章

一个回车符引发的问题思考

在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题.在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉.但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的.最近,本人就遇到了一个回车符引发的问题. 近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在. 本人查了一下该函数的具体情况.opendir函数的原型为: DIR

一个二级菜单引发的血案

近期发现自己css不是很好,于是又看了一遍<css权威指南>.总感觉自己抓不到重点.弃疗中...于是看看其他书.然后学妹跟我说她的二级菜单写得很乱.当时我心里就在想二级菜单,有何难?自认为10分钟能搞定.跟她要效果图并很自大的说了句“等会儿,我写个简单的”.于是血案由此引发... 二级菜单要实现的原效果图是: (如发现雷同,不是巧合,是我从别的网页上截屏下来的 ~_~).既然说了简单,肯定效果没这么精美.但是至少基本效果和原理要实现. 10分钟过去了....15分钟过去了....这个“等会儿”

一个多线程问题引发的血案-(代码段执行完毕,子进程未执行完毕导致段错误)

今天遇到一个问题,gdb执行程序完全没有问题,但直接执行就会段错误,百思不得其解,各种纠结,各种搜索引擎都试了一遍,无果!后来问题还是被我自己挖出来了. 看下边一段代码: int TaskSendControl() { pthread_t prov_thread[CLIENT_NUM]; int prov[CLIENT_NUM]; for(int i=0; i< CLIENT_NUM; i++) { prov[i] = i; if( pthread_create(&prov_thread[i

android:一个Open键引发的问题!!

1.问题简介 首先描述一下问题,当我们安装完APP的时候,界面会显示两个按钮,一个完成键,一个Open键,点击Open键之后,进入应用.此时,我们点击HOME键,程序将会后台.然后再点击该桌面上应用程序的图标,巨大的BUG出现了:app会重新启动!而不是将原来的界面onresume!如果你的应用对多次启动不敏感,这道没什么,但是,如果你的应用对多次启动很敏感,你就必须做处理了. 2.解决方案 首先分析问题成因,在android目前的系统下(最新的为4.4.3),点击Open键和点击图标启动时,I

Mysql中where条件一个单引号引发的性能损耗

日常写SQL中可能会有一些小细节忽略了导致整个sql的性能下降了好几倍甚至几十倍,几百倍.以下这个示例就是mysql语句中的一个单引号('')引发的性能耗损,我相信很多朋友都遇到过,甚至还在这样写. 先看下我的表结构: CREATE TABLE `d_sku` ( `id` varchar(36) NOT NULL, `commodity_id` varchar(36) DEFAULT NULL, `counts` int(11) DEFAULT NULL, `price` double(15,

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是"临阵磨枪,不快也光",你"眉头一皱,计上心来",这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数:如果小了,就再拿右区间的中间数来试.比如求sqrt(16)的结果,你先试

ZigBee中内存管理(一个内存空间引发的血案)

这个Zigbee的项目好久没有写了,现在对这个项目有点陌生,好多东西都搞不懂了.今天写一个简单的无线发送小程序时,一直出问题,程序调用zstack中的AF_DataRequest函数,如下 AF_DataRequest( &Coor_Addr, &App_epDesc,                        APP_CLUSTERID_ADC,                        sizeof(ADC_Value),                        (uin

【转载】一个Sqrt函数引发的血案

转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/sotry-about-sqrt.html 源码下载地址:http://diducoder.com/sotry-about-sqrt.html 好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获. 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这

前后端交互模型(一个面试题引发的思考总结)

客户端和服务端的交互 面试题: 当用户在地址栏中输入网址,到最后看到页面,中间都经历了什么? (引出前后端交互模型的内容) 客户端 =======> 服务端 (request请求阶段) 服务端 <======= 客户端 (responese响应阶段) 1.URL地址解析 2.DNS域名解析(DNS服务器) 3.和服务器建立TCP连接 (三次握手) 4.把客户端信息传递给服务器(发送HTTP请求) 5.服务器得到并处理请求(HTTP响应内容) 6.客户端渲染服务器返回的内容 7.和服务器端断开T