GG们,帮俺看段代码

Brogrammer 2006-12-22 03:33:12
void __fastcall TForwardThread::ClientExecute()
{
char *buffer;
char strAmt[4];
char strTel[10];
int index,nRcvLen;
AnsiString strResponse,url;

//---- Place thread code here ----
// make sure connection is active
//while (!Terminated /*&& ClientSocket->Connected*/)
//{
try
{
nRcvLen = ClientSocket->ReceiveLength();
buffer = (char*)malloc(nRcvLen);
memset(strAmt, 0, sizeof(strAmt));
memset(strTel, 0, sizeof(strTel));

//Creates an instance of TWinSocketStream for a Windows socket object
TWinSocketStream *pStream = new TWinSocketStream(ClientSocket,30000);
try
{
// give the client 30 seconds to start writing
if (pStream->WaitForData(30000))
{
// if can't read in 30 seconds, close the connection
if (pStream->Read(buffer, sizeof(buffer) == 0))
ClientSocket->Close();
else
//if (pStream->Read(buffer, sizeof(buffer)) > 0)
{
/* TODO : process the request */
//从读取的数据中获得电话号码字段,并将其追加到url
memcpy(strTel,buffer,sizeof(strTel));
url = "http://syd007/handle.asp?username=a&password=1";
url.cat_printf("&telno=%s",strTel);

//最有可能出问题的就是这里了,在本地打开了iis
IdHTTP1->Port=80;
IdHTTP1->Host="localhost";
IdHTTP1->Request->Accept = "text/html";
strResponse = IdHTTP1->Get(url);
//响应消息中有一字端returnX,先找到它的位置,再得到X的值存在strResponse
index = strResponse.AnsiPos("return");
strResponse = strResponse.SubString(index+6,1);

//将信息写
memset(buffer,0,sizeof(buffer));
memcpy(buffer,"a",10);
memcpy(buffer+10,strResponse.c_str(),1);
pStream->Write(buffer,11);
}
}
else
ClientSocket->Close();
}
__finally
{
delete pStream;
free(buffer);
//delete mStream;
}
}
catch (Exception &E)
{
/* TODO : HandleException */
}
//}//while

}
===============================================================
程序开始运行,等待客户端输入。但有数据到达时,BCB跳出一个错误窗口,提示EAccessViolation错误,请GG们看看哪里的指针越界了,初次接触BCB,很多不熟的,thx!
...全文
148 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSQ__CPU 2006-12-22
  • 打赏
  • 举报
回复
还有代码的其他问题
memset(buffer,0,sizeof(buffer));
目的是干吗?初始化buffer的前4个字节?如果是这样,应该写明为 memset(buffer,0,4);

如果是想初始化buffer缓冲区全部,sizeof(buffer)结果是4,不是buffer的大小nRcvLen
CSQ__CPU 2006-12-22
  • 打赏
  • 举报
回复
这样的代码可能有问题。
nRcvLen = ClientSocket->ReceiveLength();
buffer = (char*)malloc(nRcvLen);

nRcvLen 大小没有确定,如果收到的长度是1,那么buffer 的缓冲大小是1,下面的memset(buffer,0,sizeof(buffer));等等都会引起(非法访问)问题。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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