int ret = 0;
ret = recv(m_s, buff, 512, 0);
if(ret == 0)
{
TRACE("Recv data error: %d\n", WSAGetLastError());
return ;
}
ret=strlen(buff)+1;
buff[ret] = '\0';
return ;
接受的buffer最大能开多大,为什么我想开成2048 就会出现非法操作??
救命!!!!!!!!!
ret = recv(m_s, buff, 512, 0);
if(ret == 0)
{
TRACE("Recv data error: %d\n", WSAGetLastError());
return ;
}
ret=strlen(buff)+1;
buff[ret] = '\0';
return ;
接受的buffer最大能开多大,为什么我想开成2048 就会出现非法操作??
救命!!!!!!!!!
解决方案 »
- 如何在treecontrol控件节点前加图片,且关键是双击节点时实现该图片颜色的变化
- CListCtrl问题
- cannot convert parameter 1 from 'class CString' to 'unsigned short *'
- MFC编程中的利用classwizard建立的函数与自定义的函数的区别
- 初学c++,有个错误不懂 ,请大虾们一定瞧瞧瞧 C2676: binary '<<' :……
- CTabCtrl空间到底怎么用?怎么无法可视化编辑,简直太不方便了,我该怎么办?
- 为何虚拟键VK_ENTER被当成是没有定义的值?
- 请问在vc中用什么解析xml,我想在vc中写xml,大家帮忙指点一下!
- 自画按钮的问题
- 一个急切的问题:在VC里如何实现禁止屏保
- 怎样在程序中拦截消息?
- ※※※直接从对话框打印的问题※※※
buff[ret] = '\0'; //只要上面一行不出错,这行是多余的
当我用 2048 的时候 char buff[2048] 长度应该够了 和实际接受的数据
char buff[2048] ;
memset( buff , 0 , 2048 ) ;
ret = recv(m_s, buff, 2048, 0);
if(ret == 0)
{
TRACE("Recv data error: %d\n", WSAGetLastError());
return ;
}
return ;
]
千山鸟飞绝,万径人踪灭。
孤舟蓑笠翁,独钓寒江雪。
1.现在还不能用strlen取数据。没有结束符'\0'.strlen要求字符串必须用‘\0’结束。
2.如果你真的需要加‘\0’的话,应该直接用buff[ret] = '\0';不需要ret=strlen(buff)+1;否则会可能导致多了一个字节。出错。
建议你将将ret返回,由调用他的模块来处理你读了多少个字节。当然你可以通过加'\0'的方式,不过你要保证你的buff足够长,至少有一个空间加'\0'吧。
ok?
如果最后'\0'没有处理好,那为什么512的时候可以用???。。~~~~~~~~~~~~~~~为什么~~~~~
执行非法操作前ret是多少?
是哪一行导致非法操作的?有时候分析起来很困难,但一调试问题就很显然了。
代码如下:
int ret = 0;
fd_set fdread;
FD_ZERO(&fdread);
FD_SET(m_hSocket1,&fdread);
timeval time={0,50};
select(0,NULL,&fdread,NULL,&time);
ret = recv(m_hSocket1, buff, 2048, 0);
if(ret == 0)
{
TRACE("Recv data error: %d\n", WSAGetLastError());
strcpy(buff,"null");
return 0;
}
else if(ret>0)
{
buff[1][ret] = '\0';
}
else if(ret<0)
{
strcpy(buff,"null");
}
ret = recv(m_hSocket1, buff, 2048, 0);?
BUFF有2048那么大么?