免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2392 | 回复: 9

[C] 书上的一个扫描器代码 运行段错误。 [复制链接]

论坛徽章:
0
发表于 2009-05-29 23:43 |显示全部楼层
10可用积分
这个书上的错误还真不少!自己已经修改了一部分,勉强编译过去了。但是运行段错误


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

typedef struct _post_segment
{
        struct in_addr dest_ip;  //目标IP
        unsigned short int min_port; //起始端口
        unsigned short int max_port;    //结束端口
}port_segment;


void my_err(const char *err_string,int line)
{
        fprintf(stderr,"line:%d:",line);
        perror("err_str_ing");
        exit(1);
}

int do_scan(struct sockaddr_in serv_addr)
{
        int conn_fd;
        int ret;
        conn_fd=socket(AF_INET,SOCK_STREAM,0);
        if(conn_fd<0)
        {
                my_err("socket\n",__LINE__);
                exit(1);
        }
        if(ret=connect(conn_fd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))<0)
        {
                /*if(error=ECONNREFUSED)
                {
                        close(connfd);
                        return 0;
                }
                else
                {
close(connfd);
                        return 0
                }*/
                perror("connect");
                exit(1);
        }
}

void * scaner(void *arg)
{
        unsigned short int i;
        struct sockaddr_in serv_addr;
        port_segment portinfo;
        memcpy(&portinfo,arg,1000);
        memset(&serv_addr,0,sizeof(struct sockaddr_in));
        bzero(&(serv_addr.sin_zero),8);
        serv_addr.sin_family=AF_INET;
        serv_addr.sin_addr.s_addr=portinfo.dest_ip.s_addr;
        for(i=portinfo.min_port;i<=portinfo.max_port;i++)
        {
                serv_addr.sin_port=htons(i);
                if(do_scan(serv_addr)<0)
                {
                        perror("error");
                        exit(1);
                }
        }
}

[[i] 本帖最后由 yby123 于 2009-5-29 23:44 编辑 [/i]]

论坛徽章:
0
发表于 2009-05-29 23:44 |显示全部楼层
int main(int argc ,char **argv)
{
        pthread_t* thread;
        //pthread_t thread;
        int max_port,thread_num,seg_len,i;
        struct in_addr dest_ip;
        if(argc!=7)
        {
                printf("错误\n");
                exit(1);
        }
        printf("1");
        for(i=0;i<argc;i++)
        {
              if(strcmp("-n",argv)==0)
        {
                thread_num=atoi(argv[i+1]);
                if(thread_num<=0)
                {
                        printf("错误\n");
                        exit(1);
                }

        }
        if(max_port<thread_num)
        {
                thread_num=max_port;

        }
        seg_len=max_port/thread_num;
        if((max_port%thread_num)!=0)
        {
                thread_num+=1;

        }
        thread=(pthread_t *)malloc(thread_num*sizeof(pthread_t));
        for(i=0;i<thread_num;i++)
        {
                port_segment portinfo;
                portinfo.dest_ip=dest_ip;
                portinfo.min_port=i*seg_len+1;
                if(i==thread_num-1)
                {
                        portinfo.max_port=max_port;
                }
                else
                {
                        portinfo.max_port=portinfo.min_port+seg_len-1;
                }
                //printf("asdasdsa");
                pthread_create(&thread,NULL,scaner,(void *)&portinfo);
                pthread_join(thread,NULL);
        }
        return 0;



}

论坛徽章:
0
发表于 2009-05-29 23:51 |显示全部楼层
用gdb调试一下吧
如果有段错误,一般会产生core文件的

用gdb打开之后

好像是用where命令? 还是??(具体命令忘了)

论坛徽章:
0
发表于 2009-05-30 00:02 |显示全部楼层
原帖由 GodPig 于 2009-5-29 23:51 发表
用gdb调试一下吧
如果有段错误,一般会产生core文件的

用gdb打开之后

好像是用where命令? 还是??(具体命令忘了)

where或者bt

论坛徽章:
0
发表于 2009-05-30 19:06 |显示全部楼层
我很想要你这10分
void * scaner(void *arg)
{
        unsigned short int i;
        struct sockaddr_in serv_addr;
        port_segment portinfo;
        memcpy(&portinfo,arg,1000);
        memset(&serv_addr,0,sizeof(struct sockaddr_in));


}
哦哦哦~~

我不敢要了..

[ 本帖最后由 r2r4 于 2009-6-1 12:08 编辑 ]

论坛徽章:
0
发表于 2009-05-30 23:02 |显示全部楼层
memcpy(&portinfo,arg,1000);

这个什么意思,为什么要copy1000个字节

论坛徽章:
0
发表于 2009-05-31 11:56 |显示全部楼层
原帖由 r2r4 于 2009-5-30 19:06 发表
我很想要你这10分
void * scaner(void *arg)
{
        unsigned short int i;
        struct sockaddr_in serv_addr;
        port_segment portinfo;
        memcpy(&portinfo,arg,1000);
    ...



什么意思?? 没看明白~~

论坛徽章:
0
发表于 2009-05-31 20:37 |显示全部楼层
memcpy(&portinfo,arg,sizeof(struct port_segment));
我修改了 还是不可以

论坛徽章:
0
发表于 2009-06-01 10:19 |显示全部楼层

回复 #2 yby123 的帖子

没仔细看,感觉问题不少,比如:

thread=(pthread_t *)malloc(thread_num*sizeof(pthread_t));

没有看到 free,另外这里不需要指针,声明为 pthread_t thread 即可。

论坛徽章:
0
发表于 2009-06-01 10:37 |显示全部楼层
pthread_t* thread;

pthread_create(&thread,NULL,scaner,(void *)&portinfo);

thread已经定义为指针了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP