问题: 当关闭程序时,报错:Socket Noitfication Sink:DrawProgram.exe 。
发现时间:4.7号
解决过程:
1、在网上查找 "Socket Noitfication Sink:DrawProgram.exe “, 关于这个问题针对某个程序的问题不多,大多数都是某些孩子们玩游戏时 ,由于内存不足或者其他冲突而出现的问题,也有的人在说是由于csocket 在窗口关闭时没有关闭等,但是看了看,已经关闭了,因此认为还是其他内存问题
2、检查程序的析构过程,是否new之后,delete了。看了好几遍,都没有问题,然后逐步想错误在哪里?
1) 服务器从数据库中读取到数据然后放入到List中没有错误,然后客户端发送请求,并接收数据也没有错误:也就是说客户端将图片发送到服务器,并保存到数据库中,这个过程是没有错误的。
2) 当客户端接收到数据后,与之前对照字节顺序是相同的,正确
3)但是在客户端打开图片是报错:output.c 中的一个text 为没有内容处报错。那么:在将字节转化为自己定义的CMyImage类时发生了错误,由于在这个类中定义了指针,因此之前在将该指向数据发送到服务器时,是单独转化的,那么这里也是单独转化赋值的,这个正确!但是错误在哪呢?
4)还是定义的那个指针,由于在这里CMyImage *newNode = new CMyImage();
memcpy(newNode,(CMyImage*)(GetBuffer + tempNum),sizeof(CMyImage)); 过程中,只是声明了 imageBuffer 指针,而并没有定义,之后竟然可以得到正确的图片,这也是找不到错误的地方,感觉图片都生成了,而且正确,这段代码怎么会有错误。但不管怎样,这个CMyImage类中的m_iamgeBuffer 是在堆内存中存放对象,如果自己不释放的话,那么等到储蓄结束时,其仍会被delete,但是机器并不知道它到底是多少,释放多少!
memcpy(newNode,(CMyImage*)(GetBuffer + tempNum),sizeof(CMyImage)); 过程中,只是声明了 imageBuffer 指针,而并没有定义,之后竟然可以得到正确的图片,这也是找不到错误的地方,感觉图片都生成了,而且正确,这段代码怎么会有错误。但不管怎样,这个CMyImage类中的m_iamgeBuffer 是在堆内存中存放对象,如果自己不释放的话,那么等到储蓄结束时,其仍会被delete,但是机器并不知道它到底是多少,释放多少!
5)解决问题:获得CmyImage 时 定义new unsigned char[len];
其实,之前似乎也犯过相同的错误,在使用memcpy时,总是声明了指针,而不定义,就调用memcpy,当然就是提示错误。。。而这里的这个好像有些隐蔽!
问题解决:2012.4.9
继续~还有n个问题需要解决!
//
时间:4.11
时间:4.11
发现问题:由于在网络接收数据时,误操作,尽然将每次接收到的数据设置为了4,因此在服务器发送大量数据之后,客户端会出现严重的阻塞,一直在receive,程序像死了一样。解决这个问题后,socket Notification SInk 问题又跳出:
症状: 在开启程序后,接收服务器发送来的大量图片信息时,弹出,这次出现问题的代码很固定,不像之前,摸不着头脑,在哪里都弹出该错误,估计这里之前也是有问题的,只是冲突没有之前解决的那个明显而已。
具体问题描述:
自己定义了如下结构体,并通过网络发送,当然其中的_variant_ t 变量通过safeArray来赋值
typedef struct tagImageInfo
{
TCHAR imageID[10];
TCHAR imageName[10];
TCHAR iFlag[10];
LONG imageLen;
_variant_t varBLOB;
}MYIMAGE;
{
TCHAR imageID[10];
TCHAR imageName[10];
TCHAR iFlag[10];
LONG imageLen;
_variant_t varBLOB;
}MYIMAGE;
客户发送端:
//imageBuffer 为字节形式;
memcpy(imageBuffer + tempNum,(byte*)((CMyImage*)node),sizeof(CMyImage));
//CMyTestPoint * newTestPoint = (CMyTestPoint*)(imageBuffer + tempNum);
tempNum += sizeof(CMyImage);
for(int i=0;i<((CMyImage*)node)->m_ImageLen;i++)
{
imageBuffer[tempNum+i] = ((CMyImage*)node)->m_imageBuffer[i];
}
tempNum += ((CMyImage*)node)->m_ImageLen;
//CMyTestPoint * newTestPoint = (CMyTestPoint*)(imageBuffer + tempNum);
tempNum += sizeof(CMyImage);
for(int i=0;i<((CMyImage*)node)->m_ImageLen;i++)
{
imageBuffer[tempNum+i] = ((CMyImage*)node)->m_imageBuffer[i];
}
tempNum += ((CMyImage*)node)->m_ImageLen;
然后加报头等,发送;
在服务器的接受端 :在添加都List中的MYIMAGE 新创建,并单独添加的各个变量; 其实这里想说的就是:在客户端从服务器接收到字节流后,也许将其转化为MYIAMGE 添加到List中,由于之前需要做检查,创建了新的MYIMAGE, 但是在这里由于只是单纯的将字节流变为MYIMAGE类型,想着直接强制类型转换,然后由于有_variant_t 类型,这种思想是不正确的,之前是这么做的,而且编译并不报错,并且大部分是可运行的,偶尔报错“csocket notification sink”。
接收端:
就像以上所说,本来强制转化了一下子,这就跳出了这么个错误!
之前: LONG hasMem = length - restLen;
byte *infoBuffer = new byte[infoLen];
for(int i=0;i<perNum -iLen;i++)
{
infoBuffer[i] = recvArray.GetAt(i+ HEAD_NUMBER+ hasMem);
}
MYIMAGE *imageInfo = (MYIMAGE*)infoBuffer;
byte *m_imageBuffer = new byte[imageInfo->imageLen+1];
for(int i =0;i<imageInfo->imageLen;i++)
{
m_imageBuffer[i] = recvArray.GetAt(i + infoLen + hasMem + HEAD_NUMBER);
}
//将byte字节数组存成varBlob类型
imageInfo->varBLOB.vt = VT_ARRAY | VT_UI1;
SAFEARRAY *m_psafe;
SAFEARRAYBOUND m_baud;
m_baud.lLbound =0;
m_baud.cElements = imageInfo->imageLen;
m_psafe = SafeArrayCreate(VT_UI1,1,&m_baud);
for(long i=0;i<imageInfo->imageLen;i++)
{
SafeArrayPutElement(m_psafe,&i,m_imageBuffer++);
}
imageInfo->varBLOB.parray = m_psafe;
imageList.AddTail(*imageInfo);
byte *infoBuffer = new byte[infoLen];
for(int i=0;i<perNum -iLen;i++)
{
infoBuffer[i] = recvArray.GetAt(i+ HEAD_NUMBER+ hasMem);
}
MYIMAGE *imageInfo = (MYIMAGE*)infoBuffer;
byte *m_imageBuffer = new byte[imageInfo->imageLen+1];
for(int i =0;i<imageInfo->imageLen;i++)
{
m_imageBuffer[i] = recvArray.GetAt(i + infoLen + hasMem + HEAD_NUMBER);
}
//将byte字节数组存成varBlob类型
imageInfo->varBLOB.vt = VT_ARRAY | VT_UI1;
SAFEARRAY *m_psafe;
SAFEARRAYBOUND m_baud;
m_baud.lLbound =0;
m_baud.cElements = imageInfo->imageLen;
m_psafe = SafeArrayCreate(VT_UI1,1,&m_baud);
for(long i=0;i<imageInfo->imageLen;i++)
{
SafeArrayPutElement(m_psafe,&i,m_imageBuffer++);
}
imageInfo->varBLOB.parray = m_psafe;
imageList.AddTail(*imageInfo);
解决办法:
LONG hasMem = length - restLen;
byte *infoBuffer = new byte[infoLen];
for(int i=0;i<perNum -iLen;i++)
{
infoBuffer[i] = recvArray.GetAt(i+ HEAD_NUMBER+ hasMem);
}
MYIMAGE *imageInfo = new MYIMAGE;
UINT firstLen = sizeof(imageInfo->imageID);
UINT secondLen = sizeof(imageInfo->imageName);
UINT thirdLen = sizeof(imageInfo->iFlag);
UINT forthLen = sizeof(imageInfo->imageLen);
for(int i=0;i<firstLen;i++)
{
imageInfo->imageID[i] = infoBuffer[i];
}
for (int i=0;i<secondLen;i++)
{
imageInfo->imageName[i]= infoBuffer[i+ firstLen];
}
for(int i=0;i<thirdLen;i++)
{
imageInfo->iFlag[i] = infoBuffer[i+firstLen+secondLen];
}
imageInfo->imageLen = 0;
//应该从高位算起
byte *infoBuffer = new byte[infoLen];
for(int i=0;i<perNum -iLen;i++)
{
infoBuffer[i] = recvArray.GetAt(i+ HEAD_NUMBER+ hasMem);
}
MYIMAGE *imageInfo = new MYIMAGE;
UINT firstLen = sizeof(imageInfo->imageID);
UINT secondLen = sizeof(imageInfo->imageName);
UINT thirdLen = sizeof(imageInfo->iFlag);
UINT forthLen = sizeof(imageInfo->imageLen);
for(int i=0;i<firstLen;i++)
{
imageInfo->imageID[i] = infoBuffer[i];
}
for (int i=0;i<secondLen;i++)
{
imageInfo->imageName[i]= infoBuffer[i+ firstLen];
}
for(int i=0;i<thirdLen;i++)
{
imageInfo->iFlag[i] = infoBuffer[i+firstLen+secondLen];
}
imageInfo->imageLen = 0;
//应该从高位算起
UINT startP = firstLen + secondLen +thirdLen+forthLen -1;
UINT endP = firstLen + secondLen +thirdLen;
for(int i=startP;i>=endP;i--)
{
imageInfo->imageLen = imageInfo->imageLen*256 + infoBuffer[i];
}
byte *m_imageBuffer = new byte[imageInfo->imageLen+1];
UINT endP = firstLen + secondLen +thirdLen;
for(int i=startP;i>=endP;i--)
{
imageInfo->imageLen = imageInfo->imageLen*256 + infoBuffer[i];
}
byte *m_imageBuffer = new byte[imageInfo->imageLen+1];
应该有其他简单通用的方法,往看到的各位大侠,给些意见!
教训:偷懒是不对的!你偷懒一小点,就要头大的查找很久!