VC mfc 多线程执行有问题

想编一个端口扫描程序,自己写了两个函数UINTCSearchIPDlg::SearchPortThread(LPVOIDparam)UINTCSearchIPDlg::S... 想编一个端口扫描程序,自己写了两个函数
UINT CSearchIPDlg::SearchPortThread(LPVOID param)
UINT CSearchIPDlg::SearchIPThread(LPVOID param)
一个按钮事件中调用
{
**********
hThread=AfxBeginThread(SearchIPThread,this);
CloseHandle(hThread);
Sleep(10);
}
其中在SearchIPThread(LPVOID param)中调用SearchPortThread
{
************
hThread1=AfxBeginThread( SearchPortThread, (LPVOID)PDlg,0,0,0,NULL);
CloseHandle(hThread1);
Sleep(10);
}
完整定义:
UINT CSearchIPDlg::SearchPortThread(LPVOID param)
{

CSearchIPDlg *PDlg=(CSearchIPDlg*)param;
int sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
return 0;
}
struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(PDlg->m_strIP);
addr.sin_port=htons(dport);
PDlg->m_Result.AddString(PDlg->m_strIP+"searchconnect");
int a=connect(sockfd,( struct sockaddr*)&addr,sizeof(addr));
if(a<0)
{
PDlg->m_Result.AddString(PDlg->m_strIP+"NO");
shutdown(sockfd,0);
return 0;
}
else
{
PDlg->m_Result.AddString(PDlg->m_strIP+"OK");
shutdown(sockfd,0);

}

// closesocket(sockfd);
return 1;

}

运行时并没报错,但只有从起始IP开始的前几个还能正确扫描,后面的及时端口开放也扫不出,由PDlg->m_Result.AddString(PDlg->m_strIP+"searchconnect");这句可显示出执行了创建socket,但是连句话PDlg->m_strIP+"OK“, PDlg->m_strIP+"NO"都没显示。
是怎么回事,大家帮帮忙吧
展开
 我来答
amote258
2011-07-03 · TA获得超过1965个赞
知道小有建树答主
回答量:1101
采纳率:0%
帮助的人:947万
展开全部
原因很明显.
请看
hThread=AfxBeginThread(SearchIPThread,this);
CloseHandle(hThread);
Sleep(10);
问题就出现在这个地方.AfxBeginThread 是个 无阻塞 函数, 执行后马上 返回, 但是SearchIPThread 线程仍在继续执行, 结果 马上又 CloseHandle,势必导致 SearchIPThread 线程 执行了 一部分 就结束了. 这个时候 Sleep 还有什么意义??

调整 顺序
hThread=AfxBeginThread(SearchIPThread,this);
Sleep(100000);//10毫秒真的太少.
CloseHandle(hThread);

或者 把 CloseHandle(hThread); 和 Sleep() 去掉 只保留 AfxBeginThread.
这是完全可以的,大可不比介意 hThread 的释放问题. window会自动清理.
更多追问追答
追问
还是不行呀,假如测试202.206.208.10~202.206.208.30 这些主机吧
感觉他每次都是全部链接过了(202.206.208.10~202.206.208.30 )
再一起显示PDlg->m_Result.AddString(PDlg->m_strIP+"NOorOK")
结果出来的是20条202.206.208.30NO或202.206.208.30OK
和我想的每次链接完后就显示202.206.208.10NO
202.206.208.11OK .......
和不一样,还有法子改么
追答
你的源码有问题 ,
请看 该句
addr.sin_addr.s_addr=inet_addr(PDlg->m_strIP);
PDlg->m_strIP 是什么??肯定是202.206.208.30, PDlg->m_strIP 始终是 202.206.208.30
显示的 当然就只有 这一个IP了.

说一下 解决的思路吧
unsigned long s_ip,o_ip
s_ip=ntohl(inet_addr(开始IP));//这里的IP是点分式,;例如 202.206.208.10
o_ip=ntohl(inet_addr(结束IP));
if(s_ip = o_ip)
{
memset(&addr,0,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(s_ip);//注意这里变了.
addr.sin_port=htons(dport);
PDlg->m_Result.AddString(PDlg->m_strIP+"searchconnect");
int a=connect(sockfd,( struct sockaddr*)&addr,sizeof(addr));
if(am_Result.AddString(PDlg->m_strIP+"NO");

return 0;
}
else
{
PDlg->m_Result.AddString(PDlg->m_strIP+"OK");

}
s_ip++;//注意本句
shutdown(sockfd,0);//注意本句,换了位置

}

以上就是利用 while循环 . 这只是一个 思路,不保证没有错误. 你 使用的话 必须要优化 修改.
chaiqu29
2011-07-03 · TA获得超过593个赞
知道小有建树答主
回答量:843
采纳率:0%
帮助的人:0
展开全部
好像有问题(这两句代码本身在非多线程的程序中是正确的,已实际应用过) 工作着线程的执行函数要么是全局的要么是静态的你的函数是那个?(如果是
追问
静态函数和全局的我都试过,没区别呀
还要说一下,过一会result列表框会显示最后一个“IP地址+NO”很多行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-07-03
展开全部
你这是WINDOWS平台么- -,
我看着这么别扭。。。
int sockfd=socket(AF_INET,SOCK_STREAM,0);
改成
SOCKET sockfd=socket(AF_INET,SOCK_STREAM,0);试试
检验SOCKET相关函数的返回值要判断是否等于SOCKET_ERROR,
如果等于SOCKET_ERROR,就证明函数出错了,这时候用WSAGetLastError()看一下错误代码,根据错误代码就知道你是什么原因出错了。

你那个直接判断<0我没用过,也不知道对不对,还是按MSDN的来吧。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式