导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

vc多线程中使用cstring,运行时程序出错退出

he8311 2009-08-23 12:47:29
我在做一个网络扫描程序,出现一个很奇怪的现象。
在主进程A中起了10个线程进行扫描,调用B.h
B.h
UINT scan(LPVOID pParam)
{
INFO* info=new INFO();
info=NULL;
info=(INFO*)pParam;
CInput* p=new CInput();
p=NULL;
p=(CInput*)info->ptr;
int PortS=info->PortS;//起始端口
int PortE=info->PortE;//结束端口

CString tmp="",PN;
SOCKET sockd;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 0 );
if ( WSAStartup( wVersionRequested, &wsaData ) != 0 )
{
AfxMessageBox("Can not initial winsock!",NULL,MB_OK);
}

//下面填充socket结构
local.sin_addr.s_addr=htonl(INADDR_ANY);//inet_addr("202.101.166.5");
local.sin_family=AF_INET;
local.sin_port=0;
remote=info->IpAddr;
remote.sin_family=AF_INET;
int len=sizeof(remote);
int act=-100;
//int err;
ULONG argp=1;
int tt;
char error;
tt = sizeof(int);
timeval tm;
fd_set set;
int i;
for(i=PortS;i<PortE;i++)
{
count+=1;
screenCount="processing IP: ";
screenCount+=inet_ntoa(remote.sin_addr);//清空输出窗口显示内容
tmp.Format("%d",i);
screenCount+="\r\n 正在扫描的端口号:"+tmp;
tmp.Format("%d",count);
screenCount+="\r\n 本IP已扫描端口数: "+tmp;
tmp.Format("%d",portAmount);
screenCount+="\r\n 本IP需扫描的端口总数:"+tmp;
p->m_cAllOutput.SetWindowText(screenCount);
remote.sin_port=htons(i);//htons(i)
sockd=socket(AF_INET,SOCK_STREAM,0);//IPPROTO_TCP不能用
ioctlsocket(sockd,FIONBIO,&argp);//设置socket为非阻塞模式
int berr=bind(sockd,(LPSOCKADDR)&local,sizeof(local));
if(berr==SOCKET_ERROR)
{
DWORD aa=GetLastError();
tmp.Format("%d",aa);
AfxMessageBox("Bind error",NULL,MB_OK);
// AfxMessageBox(tmp,NULL,MB_OK);
}

if(sockd<0)
{
AfxMessageBox("socket error",NULL,MB_OK);
}

if( connect(sockd,(struct sockaddr *)&remote,len)==-1)
{
tm.tv_usec =200;//毫秒
tm.tv_sec = 1;//秒
FD_ZERO(&set);
FD_SET(sockd, &set);
if( select(sockd+1, NULL, &set, NULL, &tm) > 0)
{
getsockopt(sockd,SOL_SOCKET,SO_ERROR,&error,&tt);
if(error ==0) act = 0;
else act = -100;
}
else act = -100;
}
else act=0;

if(act==0)
{
n++;//端口数加1
tmp.Format("%d",n);
str+="TCP端口号"+tmp+": ";
tmp.Format("%d",i);
str+=tmp;

PN="http (World Wide Web HTTP)";
出错点: str+=tmp+" "+PN+"\r\n";//只要使用这句,程序就会出错退出,这是为什么???
switch(i)
{
case 7:
PN="echo (ECHO)";
break;
case 9:
PN="discard (Discard)";
break;
default:
PN="****协议名称等待加入中****";
break;
}

str+=" "+tmp+" "+"\r\n";
}
closesocket(sockd);
}//对应 for(int i=PortS;i<PortE;i++)
WSACleanup();
return 0;
}
上面有个很奇怪的现象,只要使用PN,程序就会运行出错退出,但是将PN替换成tmp,那就运行正常,奇了怪了,这是什么原因???怎么解决。
...全文
176 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
he8311 2009-08-31
int a,b;
a^b是什么意思?其中的^是什么运算操作符?没看到过。
回复
he8311 2009-08-31
真没人知道吗
回复
he8311 2009-08-27
[Quote=引用 10 楼 jwybobo2007 的回复:]
str对象在哪里?没看到定义
[/Quote]
关键不在str的定义,我试了,加上PN就出错,去掉PN就不会出错,与str有没有定义没关系。这是什么原因,如果是str没有定义引起的,那么应该不管是否有PN存在,都会出错啊,你说是吧。
回复
jwybobo2007 2009-08-27
str对象在哪里?没看到定义
回复
he8311 2009-08-27
没人知道吗,高手在哪里???
回复
he8311 2009-08-26
[Quote=引用 7 楼 lizmei001 的回复:]
你的str在那里定义了?有没有初始化?
[/Quote]
上面说的是什么意思?不明白
在B.h 中,定义 CString tmp="",PN;
但使用tmp没问题,使用PN就出错,不知道怎么回事?

回复
lizmei001 2009-08-25
你的str在那里定义了?有没有初始化?
回复
he8311 2009-08-25
晕啊
回复
he8311 2009-08-24
[Quote=引用 2 楼 arong1234 的回复:]
INFO* info=new INFO();
info=NULL;
info=(INFO*)pParam;

你知道你这三行代码是干吗么?第二行、第三行使得第一行代码毫无意义,并且造成了内存泄漏。原来是java程序员?你不需要第一行
[/Quote]
现在问题出错的地方不是这里,而是字符串PN使用,但不用PN,就不会出错了,我感到不理解的是,为什么同样是CString类型,使用tmp为什么就不会运行出错???
回复
he8311 2009-08-24
[Quote=引用 1 楼 arong1234 的回复:]
你scan怎么创建的?尤其是那个pParam是不是一个临时变量的指针
[/Quote]

scan是我手工建的,pParam只是个形参
回复
arong1234 2009-08-23
而且应该严禁在头文件中定义函数
回复
arong1234 2009-08-23
INFO* info=new INFO();
info=NULL;
info=(INFO*)pParam;

你知道你这三行代码是干吗么?第二行、第三行使得第一行代码毫无意义,并且造成了内存泄漏。原来是java程序员?你不需要第一行
回复
arong1234 2009-08-23
你scan怎么创建的?尤其是那个pParam是不是一个临时变量的指针
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……