第二次Send时出现“Buffer is too small”的问题

wswwwt 2008-06-15 12:32:14
一个按一次按纽send一次(POST少量数据)的程序:
void CAMFCDlg::OnClickedSta()
{
.............................
char dest[1024];
char hostname[800]="需要POST的内容";
send(m_socket, hostname, strlen(hostname), 0);
recv(m_socket,(LPSTR)dest,sizeof(dest),0);

//需要在第二次运行时,在hostname中加入第一次运行时服务器返回给客户端的一串验证码,用以下代码来截取dest中收的验证码
static char * abc;
char * abcstr;
//加一个计数器来显示程序运行次数,初始为0
if(计数器 == 0)
{
char * header,* tail;
header=strstr(dest,"。。。");
tail=strstr(dest,"。。。");
*tail=0;
abc = abcstr;
}
}

---------------------------------------------------------------
以上代码编译没有问题,程序在第一次运行时也没有问题,第二次(按按纽)运行时出现BUG(File:.\tcscat_s.inl Line:42 Expression:(L"Buffer is too small"&&0)),经调试停在tcscat_s.inl的“_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);”处,请问该怎么解决?
...全文
1135 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
iandy2233 2011-11-02
  • 打赏
  • 举报
回复
不是加零的问题...晕
wswwwt 2008-06-16
  • 打赏
  • 举报
回复
将第一次的验证码先存入文本,第二次运行时在文本里面取,这样就搞定了
butwang 2008-06-15
  • 打赏
  • 举报
回复
dest太小吧,最好放到全局内存,容量大些1024*4...
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
回12楼,就是加'\0'不行才改0的,改strlen("abc")+1也无济于事,而将截取验证码的部分去掉,第二次就能成功发送
arong1234 2008-06-15
  • 打赏
  • 举报
回复
不是"0",而是'\0',楼主连这个都不知道啊?
每个字符串都必须有'\0'结尾,你的dest和src都必须满足这个

例如字符串"abc",实际包含4各字符,'a', 'b', 'c', '\0',如果你发送方发送"abc"时发送的是strlen("abc")+1个长度,则\0自动发送了

楼主必须首先弄明白原理,不然人家讲什么你都不懂
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
回9楼,还是不行哦,还是Buffer is too small. 有没有可能是定义static char * abc并截取第一次的dest后,指针指向dest,导致第二次dest时没有缓存了?
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
回9楼,还是不行哦,还是Buffer is too small. 有没有可能是定义static char * abc并截取第一次的dest后,指针指向dest,导致第二次dest时没有缓存了?
cppwin 2008-06-15
  • 打赏
  • 举报
回复
这样加0

int num = recv(m_socket,(LPSTR)dest,sizeof(dest),0);
if( num >0 && num <1024 ) dest[num]=0;
else{错误处理}
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
出现"string is not null terminated"的BUG是因为dest[1024],改为dest[10240]BUG又是"Buffer is too small"了,现在还是Buffer is too small的问题
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
回3楼,我在发的时候改为send(m_socket, hostname, strlen(hostname)+1, 0)还是不行啊.收的时候加个0,在第二次运行的时候先前的BUG变为了string is not null terminated
我是这样加的:
strcat_s(dest,"0");
printf("%s",dest);
不知道是否可行
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
回1楼,应该不是dest容量的问题吧,我将容量设得再大也还是一样啊,应该是没有加\0的问题,但不知道具体该怎么加,我在发的时候改为send(m_socket, hostname, strlen(hostname)+1, 0)还是不行啊,应该不是发的时候没有加\0吧?推测可能是在收的时候没有加\0,因为调试的BUG也是停在“_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);”这里的

请问具体\0该怎么加啊
cnzdgs 2008-06-15
  • 打赏
  • 举报
回复
系统是不会替你处理的,如果你要发送一个字符串,可以在取得字符串长度后再加上一个字符作为发送的长度,也可以在接收之后自己在最后加一个0。
wswwwt 2008-06-15
  • 打赏
  • 举报
回复
谢谢,\0应该是系统自己加上去的吧,这方面不太清楚,能再详细一点吗?这个"\0"是要怎么加的
cnzdgs 2008-06-15
  • 打赏
  • 举报
回复
应该是没有发送'\0'。注意strlen获取的长度是不包含字符串结尾的'\0'的。
arong1234 2008-06-15
  • 打赏
  • 举报
回复
怀疑是你收到字符串后没有在尾部加\0,导致要cat的字符串太长
arong1234 2008-06-15
  • 打赏
  • 举报
回复
我们不可能列出所有可能的不正常情况的,所以才要求你懂为什么要有\0,谁能知道你程序到底发生什么事情呢?这需要单步调试的,问你一句,当你调用strcat时,源缓存和目的缓存里到底是不是合法的字符串?也就是这两个字符串到底有没有\0结尾?

不要指望别人给你所有问题的答案,因为问题会有千变万化的。大家只能给你方向,但是解决只能是你自己,你要是不懂原理,稍微有点变化,就不知道怎么做了

[Quote=引用 13 楼 wswwwt 的回复:]
回12楼,就是加'\0'不行才改0的,改strlen("abc")+1也无济于事,而将截取验证码的部分去掉,第二次就能成功发送
[/Quote]

18,363

社区成员

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

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