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

he8311 he8311 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在做一个网络扫描程序,出现一个很奇怪的现象。
在主进程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++)开发环境中,进行不同类型之间的转换是一项常见的任务,特别是在处理字符串时。

so_yes

VC6.0环境下GPS数据采集程序设计:串口通信与NMEA协议解析实战

串口通信是嵌入式与工业控制领域的基础技能,其核心在于通过物理链路实现设备间的数据交换。在Windows平台下,基于API的串口编程需要掌握CreateFile、ReadFile等系统调用,并配合多线程技术确保数据接收的实时性与稳定性。GPS数据采集作为典型应用场景,依赖NMEA-0183协议标准,该协议以文本帧格式输出经纬度、速度、时间等定位信息,解析过程中需完成帧同步、校验和验证及度分格式转换。理解这些底层原理,不仅有助于解决老系统维护中的实际问题,也能为理解现代物联网数据采集框架提供扎实基础。本文从串口

weixin_34406086

基于VC与MFC的串口调试工具开发:从线程模型到CRC校验的完整实践

在嵌入式开发与工控领域中,串口通信是设备调试与数据采集的基础能力。掌握上位机开发中的串口编程,意味着能够高效地完成协议解析、数据监控与指令下发。Windows平台下,通过VC与MFC框架可以快速构建稳定可靠的串口调试工具,其核心在于理解文件句柄操作、DCB参数配置以及事件驱动的多线程模型。使用CreateFile与ReadFile实现底层数据收发,结合WaitCommEvent避免界面卡死,配合缓冲区优化与十六进制显示,能够应对高速数据流场景。CRC16校验、定时发送、数据过滤等扩展功能进一步提升了协议的调

weixin_33875564

VC中CString,int,string,char*之间的转换

VC 中 CString、int、string、char* 之间的转换CString、int、string、char* 是四种常用的数据类型,在 VC 中它们之间的转换非常常见,本文将详细介绍它们之间的转换方法以及应用实例

wangmin604123

VC6.0 实现CString 分割 对于初学者比较实用 本人实际操作使用

在Microsoft Visual C++ 6.0(简称VC6.0)这个古老的开发环境中,程序员们仍然可以使用MFC(Microsoft Foundation Classes)库进行C++编程。

caoshukai
评论 13
收藏 已收藏
分享
返回顶部
he8311
VC/MFC 16,550 成员 421,606 内容