y4ung 2017-10-12 02:19 采纳率: 100%
浏览 2932
已结题

C语言多线程传参数时,线程里的参数值一直没变?

我想用C实现一个多线程的端口扫描,对每个ip都创建100个线程;
在main里for循环中创建线程,打印出来的参数(arg->min_port,arg->max_port)是没问题的,
但是在线程函数里打印出传进去的参数时,min_port与max_port都是一样的,请问该怎么解决? 谢谢


#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <pthread.h>

#define THREAD_NUM 100
#define MAX_PORT 65535
#define SEG_LEN 649


struct port_seg
{
    char *dest;
    int min_port;
    int max_port;
};

typedef struct port_seg port_segment;

void * scan(void * arg)
{
    struct port_seg * parg;
    int min_port;
    int max_port;
    int sockfd;
    struct sockaddr_in server;
    int length;
    int ret;    
    struct servent* result; 

    parg = (struct port_seg *)arg;

    min_port = parg->min_port;
    max_port = parg->max_port;

    printf("ip:%s\n",parg->dest);
    printf("min_port:%d\n",min_port);   
    printf("max:%d\n",max_port);

    if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
    {
        perror("generating socket error\n");
        exit(1);
    }   

    memset(&server,0,sizeof(struct sockaddr_in));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(parg->dest);


    length = sizeof(struct sockaddr);   


    for(int i=min_port;i<=max_port;i++)
    {       
        server.sin_port = htons(i);
        if(0>(ret=connect(sockfd,(struct aockaddr*)&server,length)))
        {
            //perror("connect err\n");
            continue;
        }
        else
        {   
            if(NULL == (result = getservbyport(server.sin_port,"tcp")))
            {   
                continue;
            }
            else
            {   
                printf(">>> ip:%s, name:%s, s_port:%d\n", parg->dest, result->s_name,ntohs(result->s_port));
            }

        }

        close(sockfd);  
    }   

    close(sockfd);
    exit(0);
}


int main(int argc, char** argv)
{
    pthread_t * thread;
    thread = (pthread_t *)malloc(THREAD_NUM * sizeof(pthread_t));

    if(argc<1)
    {
        printf("./portscanner ip1, ip2, ……");
        exit(1);
    }

    for(int i=1; i<argc; i++)
    { // each group
        for(int j=0;j<THREAD_NUM;j++)
        { 
//          printf("j:%d  ",j);
            port_segment port;
            port.dest = argv[i];
            port.min_port = j*SEG_LEN+1;

            if(j == THREAD_NUM - 1)
            {
                port.max_port = MAX_PORT;
            }
            else
            {
                port.max_port = port.min_port + SEG_LEN -1;
            }

//          printf("min:%d\n",port.min_port);
//          printf("max:%d\n",port.max_port);                       

            if ( pthread_create(&thread[j], NULL, scan, (void *)&port) != 0 )
                    {
                        perror( "pthread_create failed\n" );
                        free(thread);
                        exit(1);
            }

        }
    }


    exit(0);
}


  • 写回答

2条回答 默认 最新

  • Jhone.Yu 2017-10-12 02:45
    关注

    你在创建线程后传进的参数,在没有进入下一次for循环给port.min 和port.max 赋值之前,scan线程中的parg->min 和 parg->max 值没有错。

    创建了线程你要考虑到 这时候主线程不会停啊,还会继续跑的,主线程的for循环是会一直继续直到结束,一直在改变port地址里面的数据!

    这判断的基础是在port的地址一直不变的情况下,建议打印一下port的地址看看!不要只打印数据!

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站