vc多线程中使用cstring,运行时程序出错退出
在主进程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,那就运行正常,奇了怪了,这是什么原因???怎么解决。
相关推荐
VC中BSTR、Char和CString类型的转换
### VC中BSTR、Char和CString类型的转换在VC(Visual C++)开发环境中,进行不同类型之间的转换是一项常见的任务,特别是在处理字符串时。
VC6.0环境下GPS数据采集程序设计:串口通信与NMEA协议解析实战
串口通信是嵌入式与工业控制领域的基础技能,其核心在于通过物理链路实现设备间的数据交换。在Windows平台下,基于API的串口编程需要掌握CreateFile、ReadFile等系统调用,并配合多线程技术确保数据接收的实时性与稳定性。GPS数据采集作为典型应用场景,依赖NMEA-0183协议标准,该协议以文本帧格式输出经纬度、速度、时间等定位信息,解析过程中需完成帧同步、校验和验证及度分格式转换。理解这些底层原理,不仅有助于解决老系统维护中的实际问题,也能为理解现代物联网数据采集框架提供扎实基础。本文从串口
基于VC与MFC的串口调试工具开发:从线程模型到CRC校验的完整实践
在嵌入式开发与工控领域中,串口通信是设备调试与数据采集的基础能力。掌握上位机开发中的串口编程,意味着能够高效地完成协议解析、数据监控与指令下发。Windows平台下,通过VC与MFC框架可以快速构建稳定可靠的串口调试工具,其核心在于理解文件句柄操作、DCB参数配置以及事件驱动的多线程模型。使用CreateFile与ReadFile实现底层数据收发,结合WaitCommEvent避免界面卡死,配合缓冲区优化与十六进制显示,能够应对高速数据流场景。CRC16校验、定时发送、数据过滤等扩展功能进一步提升了协议的调
VC中CString,int,string,char*之间的转换
VC 中 CString、int、string、char* 之间的转换CString、int、string、char* 是四种常用的数据类型,在 VC 中它们之间的转换非常常见,本文将详细介绍它们之间的转换方法以及应用实例
VC6.0 实现CString 分割 对于初学者比较实用 本人实际操作使用
在Microsoft Visual C++ 6.0(简称VC6.0)这个古老的开发环境中,程序员们仍然可以使用MFC(Microsoft Foundation Classes)库进行C++编程。


