小Bug大麻烦

上周把服务器端的大体框架做出来了,这周开始用各种消息做测试。
前面急着写结构,曾出了一个在Debug版本时出的错误也没找到原因,就直接改成Release版本直接做了。
可这周为了测试各种消息的状态,需要用到调试代码,就改了过来,本来以为挺简单的一个原因,却搞了一个上午:(。
先看代码:


 char* sdata=new char[2048];   //声明大的内存块接收数据
 memset(sdata,0,2048);

 sockaddr_in sender;     //发送者的socket
 int dwsender=sizeof(sender);

 int index=0,DataLenght=0;
 MSGPackage m;      //接收的信息对象
 
 //接收数据到临时数据区
 recvfrom(UDPClient,sdata,2048,0,(sockaddr *)&sender,&dwsender);
 
 //从临时数据区分段复制到数据报中
 memcpy((BYTE*)&(m.HeadIndex),sdata+index,sizeof(m.HeadIndex));
 index+=sizeof(m.HeadIndex);
 memcpy((BYTE*)&(m.MsgType),sdata+index,sizeof(m.MsgType));
 index+=sizeof(m.MsgType);
 memcpy((BYTE*)&(m.Encrypt),sdata+index,sizeof(m.Encrypt));
 index+=sizeof(m.Encrypt);
 memcpy((BYTE*)&(m.CRC),sdata+index,sizeof(m.CRC));
 index+=sizeof(m.CRC);
 memcpy((BYTE*)&(m.DataLen),sdata+index,sizeof(m.DataLen));
 index+=sizeof(m.DataLen);
 memcpy((BYTE*)&(m.Res),sdata+index,sizeof(m.Res));
 index+=sizeof(m.Res);

 m.data=new char[m.DataLen];                                      
 DataLenght=m.DataLen;
 memset(m.data,0,DataLenght);
 strcpy(m.data,sdata+index);
 
 //把数据包和发送地址存到接收队列中

 CMSG msg;
 msg.SetMSG(m,sender);

 m_g_ReciveCs.Lock();
 m_ReciveList.AddTail(msg);
 m_g_ReciveCs.Unlock();
 
 //删除临时数据
 delete [] m.data;
 m.data=NULL;
 delete [] sdata;
 sdata=NULL;

在接收过程中,申请大的内存块,把数据一次接收下来,然后再一块儿一块儿的复制数据包对象中,
再把数据包对象和发送人的地址一块儿放到接收队列中,最后把临时数据删除。

结果就是在删除临时数据m.data这个字符串指针时出错了,查来查去,最把问题搞清楚了。
strcpy复制时会从源数据的开始复制数据直接遇到NULL时终止,而在客户端,sdata的长度要比正确的值多了
一个m.DataLen,结果strcpy后,m.data的数据比分配的长度多,也就是复制越界了,所以改成Debug版本后
就出错了。另外即使数据长度没加长也是为有错误,因为在复制字符时会有一个终止符("/n")产生,所以在分配时应该多加一个,改成:
 m.data=new char[m.DataLen+1];    
这样就不会出错了。

Bug 微软的大Bug

06-18

大家用过c#的滚动条控检吗?rn我运行这个程序发现rnusing System;rnusing System.Drawing;rnusing System.Collections;rnusing System.ComponentModel;rnusing System.Windows.Forms;rnusing System.Data;rnrnnamespace WindowsApplication5rnrn /// rn /// Form1 的摘要说明。rn /// rn public class Form1 : System.Windows.Forms.Formrn rn private System.Windows.Forms.VScrollBar vScrollBar1;rn private System.Windows.Forms.Button button1;rn private System.Windows.Forms.HScrollBar hScrollBar1;rn /// rn /// 必需的设计器变量。rn /// rn private System.ComponentModel.Container components = null;rnrn public Form1()rn rn //rn // Windows 窗体设计器支持所必需的rn //rn InitializeComponent();rnrn //rn // TODO: 在 InitializeComponent 调用后添加任何构造函数代码rn //rn rnrn /// rn /// 清理所有正在使用的资源。rn /// rn protected override void Dispose( bool disposing )rn rn if( disposing )rn rn if (components != null) rn rn components.Dispose();rn rn rn base.Dispose( disposing );rn rnrn #region Windows 窗体设计器生成的代码rn /// rn /// 设计器支持所需的方法 - 不要使用代码编辑器修改rn /// 此方法的内容。rn /// rn private void InitializeComponent()rn rn this.vScrollBar1 = new System.Windows.Forms.VScrollBar();rn this.button1 = new System.Windows.Forms.Button();rn this.hScrollBar1 = new System.Windows.Forms.HScrollBar();rn this.SuspendLayout();rn // rn // vScrollBar1rn // rn this.vScrollBar1.Dock = System.Windows.Forms.DockStyle.Right;rn this.vScrollBar1.Location = new System.Drawing.Point(276, 0);rn this.vScrollBar1.Maximum = 100;rn this.vScrollBar1.Name = "vScrollBar1";rn this.vScrollBar1.Size = new System.Drawing.Size(16, 273);rn this.vScrollBar1.TabIndex = 0;rn this.vScrollBar1.ValueChanged += new System.EventHandler(this.vScrollBar1_ValueChanged);rn this.vScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.vScrollBar1_Scroll);rn // rn // button1rn // rn this.button1.Location = new System.Drawing.Point(168, 80);rn this.button1.Name = "button1";rn this.button1.TabIndex = 1;rn this.button1.Text = "button1";rn this.button1.Click += new System.EventHandler(this.button1_Click);rn // rn // hScrollBar1rn // rn this.hScrollBar1.Dock = System.Windows.Forms.DockStyle.Bottom;rn this.hScrollBar1.Location = new System.Drawing.Point(0, 257);rn this.hScrollBar1.Name = "hScrollBar1";rn this.hScrollBar1.Size = new System.Drawing.Size(276, 16);rn this.hScrollBar1.TabIndex = 2;rn this.hScrollBar1.Scroll += new System.Windows.Forms.ScrollEventHandler(this.hScrollBar1_Scroll);rn // rn // Form1rn // rn this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);rn this.ClientSize = new System.Drawing.Size(292, 273);rn this.Controls.Add(this.hScrollBar1);rn this.Controls.Add(this.button1);rn this.Controls.Add(this.vScrollBar1);rn this.Name = "Form1";rn this.Text = "Form1";rn this.ResumeLayout(false);rnrn rn #endregionrnrn /// rn /// 应用程序的主入口点。rn /// rn [STAThread]rn static void Main() rn rn Application.Run(new Form1());rn rnrn private void vScrollBar1_ValueChanged(object sender, System.EventArgs e)rn rn //this.Text=vScrollBar1.Value.ToString();rn rnrn private void vScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)rn rn this.Text=vScrollBar1.Value.ToString();rn rn rnrn private void button1_Click(object sender, System.EventArgs e)rn rn rn rnrn private void hScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)rn rn this.Text=hScrollBar1.Value.ToString();rn rn rnrnrn用鼠标调整滚动条,怎样调都无法达到最大数100 只能达到91rn不知道是为什么,大家帮看看.rnrn我用的是VS2003,win2kprn版本信息是:rn7.1.3091rnrn这个BUG可费我3天的时间啊.......rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭