多线程端口扫描的问题

黑云笑月 2009-04-15 08:23:06
我想对任意指定IP段的任意端口进行扫描,例如对168.0.0.1-168.0.0.255段的80-1000端口进行扫描。思路是用for循环读取每个IP地址,再对IP地址中的端口才用多线程扫描。我第一次使多线程,不知道这样写对不对,多线程这段代码是
for(tempport = Portlist[j].iPortStart; tempport <= Portlist[j].iPortEnd; tempport++)
{
//传递给线程的变量,包括IP和端口
pInfor = new infor;
strcpy(pInfor->ip,dest_ip);
pInfor->port=tempport;
while(nThreadNum > 200)
{
Sleep(10);
}
//创建线程
handle = CreateThread(NULL,0,port_scan,(LPVOID)pInfor,0,&dwThreadId);
if(NULL!= handle)
{
hScanThreads[nThreadNum++] = handle;
}
}
结果运行时,往往扫描了168.0.0.1-168.0.0.3后就报内存读错误,但单步调试时没有错,请高手指点下如何改正。
...全文
367 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodname 2009-04-16
  • 打赏
  • 举报
回复
你给出的信息还是不大够,所以顶再多次也不好判定。

你再多发些代码上来吧,如果不是特别复杂的话。
angel_64 2009-04-16
  • 打赏
  • 举报
回复
多线程调试太讨厌了,尤其是VC调试多线程的时候很容易死
黑云笑月 2009-04-16
  • 打赏
  • 举报
回复
自己再顶下
chichismile 2009-04-16
  • 打赏
  • 举报
回复
多线程调试有没有什么好方法呢?
黑云笑月 2009-04-15
  • 打赏
  • 举报
回复
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
goodname 2009-04-15
  • 打赏
  • 举报
回复
多线程的东西即使代码完全,问题也未必很容易分析出来,更何况你这残缺不全的代码呢。

你应该通过删减代码的方式,整理出一个清晰简单的模型来,
那些线程间共享使用的变量是怀疑的重点。
黑云笑月 2009-04-15
  • 打赏
  • 举报
回复
那位高手帮我看看,我头都大了
黑云笑月 2009-04-15
  • 打赏
  • 举报
回复
这个if(hOutputFile != NULL)语句只是把扫描的端口信息写到一个文本文件中去而已,应该没关系吧
xiehui3651 2009-04-15
  • 打赏
  • 举报
回复
建议在线程函数里加打印信息进行调试
goodname 2009-04-15
  • 打赏
  • 举报
回复
if(hOutputFile != NULL)
{
//将句柄指向文件结尾处
SetFilePointer(hOutputFile,NULL,NULL,FILE_END);
WriteFile(hOutputFile,tmpout,strlen(tmpout),&dwWrited,NULL);
}

这些去掉有问题吗

你的hOutputFile是从别处传来的,是否没有做好同步。
  • 打赏
  • 举报
回复
线程函数要保证可重入性
xiehui3651 2009-04-15
  • 打赏
  • 举报
回复
好像不能保证开了一个线程以后nThreadNum就一定马上++了吧
黑云笑月 2009-04-15
  • 打赏
  • 举报
回复
下面就是有问题的代码,,请高手帮忙看看
static DWORD WINAPI port_scan(LPVOID lpParam)
{
DWORD dwRet;
DWORD dwWrited;
SOCKET mysocket;
char tmpout[30] = {0};
struct sockaddr_in my_addr;

infor *lpinfor = (infor*)lpParam;
int nowport=lpinfor->port;

mysocket = socket(AF_INET, SOCK_STREAM,0);
if(mysocket==INVALID_SOCKET)
{
mutex.OwnMutex();
cout<<"创建套接字失败!"<<endl;
mutex.RelsMutex();
dwRet = ERROR_CREATE_SOCKET;
}
else{
unsigned long ul = 1;
if(ioctlsocket(mysocket, FIONBIO, (unsigned long*)&ul)!=0)
{
mutex.OwnMutex();
cout<<"未能成为非阻塞模式!"<<endl;
mutex.RelsMutex();
dwRet = ERROR_MODIFY_FIONBIO;
}
else
{
//建立连接
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(nowport);
my_addr.sin_addr.s_addr = inet_addr(lpinfor->ip);
connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

fd_set r;
FD_ZERO(&r);
FD_SET(mysocket, &r);

//设置连接超时2秒
struct timeval timeout ;
timeout.tv_sec = 2;
timeout.tv_usec = 0;

dwRet=select(0, 0, &r, 0, &timeout);

if (dwRet<=0)
{
strcpy(tmpout,lpinfor->ip);
strcat(tmpout,":");
char szBuf[8] = {0};
itoa(lpinfor->port,szBuf,10);
strcat(tmpout,szBuf);
cout<<tmpout<<"->close!"<<endl;
closesocket(mysocket);
}
else
{
strcpy(tmpout,lpinfor->ip);
strcat(tmpout,":");
char szBuf[8] = {0};
itoa(lpinfor->port,szBuf,10);
strcat(tmpout,szBuf);
cout<<tmpout<<"->open!!!!"<<endl;
strcat(tmpout,"\r\n");

if(hOutputFile != NULL)
{
//将句柄指向文件结尾处
SetFilePointer(hOutputFile,NULL,NULL,FILE_END);
WriteFile(hOutputFile,tmpout,strlen(tmpout),&dwWrited,NULL);
}
}
}

//设回阻塞模式
unsigned long ul1= 0;
dwRet=ioctlsocket(mysocket, FIONBIO, (unsigned long*)&ul1);
if (dwRet == SOCKET_ERROR)
{
closesocket(mysocket);
}
}
delete lpinfor;
return dwRet;
}
x360995630 2009-04-15
  • 打赏
  • 举报
回复
C++还没有用过多线程,学习了
goodname 2009-04-15
  • 打赏
  • 举报
回复
这段代码看不出哪有问题来,
或者看看port_scan的部分代码

感觉应该是线程之间共享一些变量没有加锁造成的。
黑云笑月 2009-04-15
  • 打赏
  • 举报
回复
自己顶下
ysysbaobei 2009-04-15
  • 打赏
  • 举报
回复
黑云笑月 2009-04-15
  • 打赏
  • 举报
回复
自己再顶下

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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