向在家讨教一个多线程的问题!

xiaoxiaowm 2010-06-16 10:27:12
是一个用FOR开了一个较多线程的代码,传过去值老是会乱掉!大家看一下,代码运行的时候还会出错!

代码如下:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock.h>
#include <iostream.h>


#define IP_NUM 5 // the number of the ip to scan

#define MAX_PORT 5000 // the max port number

#define THREAD_NUM 100 // the thread number

#define SEG_LEN 200 // the segment between min_port and max_port


typedef struct port_segment {
struct in_addr dest;
unsigned int min_port;
unsigned int max_port;
} port_segment;

/*
* @dest_addr: the destinite address
* DESC: how to scan the address
*/
int do_scan( struct sockaddr_in* dest_addr )
{
SOCKET sockfd;

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
// my_error( "socket failed" );
{
cout<<"socket failed"<<endl;
return -1;
}

/* connect with the sever */
if ( connect(sockfd, (struct sockaddr *)dest_addr, sizeof(struct sockaddr)) == 0 ) {
//close( sockfd );
closesocket(sockfd);
return -1;
}
else
printf( "%s : port (%d) has found.\n", inet_ntoa(dest_addr->sin_addr), ntohs(dest_addr->sin_port) );

return 1;
}

/*
* @arg: the pointer points to the dest address
* DESC: do the scan with every port
*/
DWORD WINAPI scan( void *arg )
{
port_segment port;
struct sockaddr_in* dest_addr = new sockaddr_in;

/* copy the struct to port */
memcpy( &port, arg, sizeof(struct port_segment) );

memset( dest_addr, 0, sizeof(struct sockaddr_in) );
dest_addr->sin_family = AF_INET;
dest_addr->sin_addr.s_addr = port.dest.s_addr;

//cout<<port.min_port<<"--"<<port.max_port<<endl;
for ( int i = port.min_port; i <= port.max_port; ++i ) {
dest_addr->sin_port = htons( i );

//cout<<dest_addr->sin_port<<endl;
cout<<i<<endl;

/* do the scan with every port */
// if ( do_scan(dest_addr) < 0 )
// continue;

}
// delete dest_addr;

return 0;
}

int main( int argc, char *argv[] )
{
HANDLE pThread;
struct in_addr dest_ip[ IP_NUM ]; // IP_NUM ip address


if ( argc < 2 ) {
fprintf( stderr, "usage: ./scan [ip1] [ip2] .. [ip5]\n" );
exit ( EXIT_FAILURE );
}

/* copy all the ip address into dest_ip */
for ( int i = 1; i < argc; ++i ) {
dest_ip[i-1].S_un.S_addr=inet_addr(argv[i]);
if(0==dest_ip)
{
cout<<"invalid ip address"<<endl;
return -1;
}

// if ( inet_aton(argv[i], &dest_ip[i - 1]) == 0 ) {
// fprintf( stderr, "invalid ip address.\n" );
// exit ( EXIT_FAILURE );
// }
}

/* malloc THREAD_NUM thread */
//thread = ( pthread_t * )malloc( THREAD_NUM * sizeof(pthread_t) );

for ( int j = 0; j < argc - 1; ++j ) {
port_segment* port= new port_segment;
for ( int i = 0; i < THREAD_NUM; ++i ) {
port_segment* port= new port_segment;

port->dest = dest_ip[ 0 ];
port->min_port = i * SEG_LEN + 1;

/* the last segment */
if (i==(THREAD_NUM - 1)||(port->min_port+SEG_LEN-1)>MAX_PORT)
{
port->max_port = MAX_PORT;
break;
}
else
port->max_port = port->min_port + SEG_LEN - 1;

// cout<<port->min_port<<"-"<<port->max_port<<endl;
/* create threads to scan the ports */
// if ( pthread_create(&thread[i], NULL, scan, (void *)&port) != 0 )
// my_error( "pthread_create failed" );
pThread=CreateThread(NULL,0,scan,port,0,NULL);


CloseHandle(pThread);
/* waiting for the sub threads exit */
//pthread_join( thread[i], NULL );
// delete port;


}
delete port;
}

/* free the memory */


Sleep(5000000);
fprintf( stderr, " sleep over\n" );
return 0;
}
...全文
144 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiaowm 2010-06-20
  • 打赏
  • 举报
回复
自己顶一下,怎么就没有人回答呢?这是本人在CSDN第一次发贴子,失望啊!
贪食蛇男 2010-06-17
  • 打赏
  • 举报
回复
好乱。。。
healer_kx 2010-06-17
  • 打赏
  • 举报
回复
好长。。。
ForestDB 2010-06-17
  • 打赏
  • 举报
回复
同意1到5楼的意见。
candeabc123 2010-06-17
  • 打赏
  • 举报
回复
你的线程函数怎么那么快就退出了。。。
sixbusy 2010-06-17
  • 打赏
  • 举报
回复
单步调试,看看 传之前 ,之后的地址 有没有变化!
再看看 内存有没有变化!
上善若水邻 2010-06-17
  • 打赏
  • 举报
回复
好多、、、、、
god_sun 2010-06-17
  • 打赏
  • 举报
回复
好昏。。。
rwjlqn 2010-06-17
  • 打赏
  • 举报
回复
好难。。。
计算机专业学生实习报告 计算机专业学生实习报告全文共8页,当前为第1页。  怀着对自己将来的打算和期望,以及在父母的强烈催促下,我假期前就详细安排了自己的假期计划。   从我的专业看,外贸公司是一个不错的对口工作。老妈试着去给我联系了一家不错的外贸公司,可是由于我们学院放假太迟,那边的实习生人数已满,我错过了一次机会。幸运的是被告之可以一月之后再去联系。   于是,我选择了自己另外一大兴趣——电脑行业。怀着对电脑行业极大的崇拜和向往,我来到了杭州一家大型电脑市场。经过几次碰壁,我最终在一家电脑个体商户落户。没有报酬,也不管饭,可是得到了一个实习的机会。就这样,从技术再到销售,我不断向各位师傅讨教。相继学会了有关装机,装系统,装应用软件的基本操作,在客户需要时还根据客户要求上门服务。为了保证我学到的东西能够切实规范化,系统化。我要求自己每天都必须注意消化自己在平时所学到的东西。   实践期间我争取一切可能的机会让我动手,短短的几天时间自己装过几部电脑,绝大部分自己都曾到过用户家中为用户解决问题,我对电脑的一般性故障也能作一定的维护,具备了一定的产品真伪识别能力,甚至我还学到了很多经营技巧

64,662

社区成员

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

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