多线程socket 端口扫描程序,实现了,但是速度不行,求指点。

#pragma comment(lib,"ws2_32.lib")
#include <stdio.h>
#include <winsock2.h>
#define MAXTHREAD 500
#define PORTSTART 1
#define PORTEND 60000
#define TIMEOUT 1
#define WAITTIME 10
#define IP "61.135.169.105"  //百度地址
FILE * logHandle;
DWORD PortScan(LPVOID lp);
typedef struct
{
    SOCKET s;
    sockaddr_in addr;
} mySocket;//传递参数
int threadCount = 0;
CRITICAL_SECTION c;
int main()
{
    
    WSADATA ws;
    InitializeCriticalSection(&c);
    fopen_s(&logHandle,"C:\\Documents and Settings\\Administrator\\桌面\\log.txt","w+");
    int nRet = WSAStartup(MAKEWORD(2,2),&ws);
    if(nRet !=0)
    {
        fprintf(logHandle,"Failed to initial the socketdll,%ld\n",WSAGetLastError());
        return 1;
    }
    for(int i=PORTSTART;i<=PORTEND;i++)
    {    
        mySocket *listenSocket = new mySocket;
        listenSocket->s = socket(AF_INET,SOCK_STREAM,0);
        if(listenSocket->s == INVALID_SOCKET)
        {
            fprintf(logHandle,"create socket error with %ld\n",WSAGetLastError());
            return 1;
        }

        listenSocket->addr.sin_addr.s_addr = inet_addr(IP);
        listenSocket->addr.sin_family = AF_INET;
        memset(listenSocket->addr.sin_zero,0,8);
        listenSocket->addr.sin_port = htons(i); //创建监听的socket
        

        while(threadCount >MAXTHREAD)
        {
            Sleep(5000);
        }
        if(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)PortScan,(LPVOID)listenSocket,NULL,NULL))
        {
            threadCount ++;
        }
    }
    while(threadCount >0)
    {
        Sleep(5000);
    }
    WSACleanup();

    return 0;
}
DWORD PortScan(LPVOID lp)
{
    int nRet;
    mySocket *s = (mySocket *)lp;
    //EnterCriticalSection(&c);
    int port = ntohs(s->addr.sin_port);

    connect(s->s,(sockaddr *)&s->addr,sizeof(sockaddr_in));
    unsigned long flag = 1;
    nRet = ioctlsocket(s->s,FIONBIO,&flag);
    if(nRet != 0)
    {
        fprintf(logHandle,"ioc error with %ld\n",WSAGetLastError());
    }
    fd_set mask;
    FD_ZERO(&mask);
    FD_SET(s->s,&mask);
    struct timeval tm = {1,0};
    switch(select(0,NULL,&mask,NULL,&tm))
    {
    case -1:
        fprintf(logHandle,"%d port connect error %ld\n",port,WSAGetLastError());
        break;
    case 0:
        fprintf(logHandle,"%d port time out\n",port);
        break;
    default:
        fprintf(logHandle,"%d port open\n",port);
    }
    closesocket(s->s);
    threadCount --;
    delete s;
    //LeaveCriticalSection(&c);
    return 0;
}

转载于:https://www.cnblogs.com/S-volcano/archive/2012/09/04/2670731.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好的学习网址收藏

ASP.Net: http://www.189works.com/tech/devlodoc/donet/ 统一系统管理平台&#xff1a; http://www.cnblogs.com/umplatform/转载于:https://www.cnblogs.com/Qiaoyq/archive/2012/09/05/2672371.html

C++ 空指针和野指针

//1&#xff0c;指针变量指向内存中编号为0的空间为空指针 //2&#xff0c;空指针指向的内存空间是不可以访问的 #include<iostream> using namespace std; int main() {int a 10;int * p &a;cout << p << endl;cout << &a << e…

sql 大数据量插入优化

在做一IOS项目时&#xff0c;因为要动态根据文件导入创建数据库,刚开始的时候因为使用动态查询的方式&#xff0c;就是每次插入数据之前查询当前数据是否已经存在,这样的效率极低.6w条纪录3个关联表,使用了30-50分钟的样子. 后来使用动态保存索引号的方式&#xff0c;耗时只是3…

const修饰是指针和常量

1. const修饰指针——常量指针 int a10: int b10: int *p&a;const int* p&a; 常量指针 特点:指针的指向可以修改&#xff0c;但是指针指向的值不可以改&#xff08;p可以改&#xff0c;*p不可以改&#xff09;*p 20;错误&#xff0c;指针指向的值不可以改 p &b; 正…

GL 与 CV 管线 (pipeline) 比较与相互转换

这里把二者作一个比较&#xff0c;并对相关的矩阵做一个联系以使能够相互转换。 1. CV中图像形成过程 (transformation stages) 这一过程可概括为四个坐标系的转换&#xff0c;分别为&#xff1a;世界坐标系、相机坐标系、图像坐标系、像素坐标系&#xff0c;如下图&#xff1a…

C++结构体作为函数参数传参

#include<iostream> using namespace std;#include<string>//结构体 struct Student {string name;int age;int score;}st3;/**结构体作为函数参数传参*/ //值传递 void printStufdent1(struct Student st3) {cout << "子函数" << endl;st3.…

三层架构笔记

1.窗口属性 { IsMdiContainer:True 指定该窗体是否是MDI容器 windowState:Maximized窗口最大化 (4)设置StartPotion:CenterParent 窗口位置居中 (5)Icon:自定义图标 (6)MaximizeBox:False 无最大化选项 (7)FormBorderStyle:FixedSingle 不可改变窗口大小 (8)AcceptButton:bt…

C++结构体中const使用场景

看如下代码&#xff1a; #include<iostream> using namespace std;#include<string>//结构体 struct Student {string name;int age;int score;}st3;//值传递 void printStufdents(struct Student st2) {cout << "子函数" << endl;st2.age…

基于外键关联的一对多单向关联

基于外键关联的单向一对多关联是一种很少见的情况&#xff0c;并不推荐使用。 <class name"Person"><id name"id" column"personId"><generator class"native"/></id><set name"addresses">…

C++结构体案例

#include<iostream> using namespace std;#include<string>//学生结构体 struct Student {string name;int age;int score; };struct Teacher {string tName;struct Student sArray[5];};//定义一个给老师学生赋值的函数 void allocateSpace(struct Teacher tArray…

php程序设计简明教程

序 编写一本有关PHP的简明教程&#xff0c;对PHP选修课程而言&#xff0c;是很必要的。 PHP语言是开放源代码语言&#xff0c;由PHP开发小组及全世界的PHP爱好者时刻进行着维护和更新&#xff0c;不断增强其功能&#xff0c;所以在网络上不断地会涌现大量的PHP的电子参考手册&a…

C++ rand()函数和srand()函数

随机数和伪随机的区别 &#xff1a; #include<iostream> using namespace std; #include<string>#include<string> #include <stdlib.h> #include <time.h> #define MIN 0 //随机数产生的范围 #define MAX 99 //函数声明…

301重定向IIS设置,及伪静态后 301重定向出错案例分享

301重定向&#xff0c;网络上的知识已经很多了&#xff0c;我在这第一次实践过程中&#xff0c;出现了一个算是低级的错误&#xff0c;但也比较典型&#xff0c;也许其它新手也会碰到&#xff0c;分享一下&#xff1a; 一、301重定向实施&#xff1a; 我们哪里体检网&#xff0…

C++ 通讯录设计(一)

#include<iostream> #include<string> using namespace std;//- 封装函数显示该界面如void showMenu() // - 在main函数中调用封装好的函数//菜单界面函数功能 void showMenu() {cout << "***********************" << endl;cout << &…

文献管理软件概述

一、时代背景 文献管理软件的诞生也是社会需求的产物。很多整天与文献打交道的人被文献郁闷了&#xff0c;然后就有了专门的文献管理软件。整天与文献打交道最多的无非是科研工作者&#xff0c;还有一类图书馆员以及文献发行者&#xff0c;不过后一类人群是少数。此处主要讨论科…

C++ 通讯录设计(二)

功能描述: 实现添加联系人功能&#xff0c;联系人上限为1000人&#xff0c;联系人信息包括(姓名、性别、年龄、联系电话、家庭住址) 添加联系人实现步骤: ●设计联系人结构体 ●设计通讯录结构体 ●main函数中创建通讯录 ●封装添加联系人函数 ●测试添加联系人功能 1.1&#…

C++ 通讯录设计(三)

显示联系人 功能描述:显示通讯录中已有的联系人信息 显示联系人实现步骤: . ●封装显示联系人函数 ●测试显示联系人功能 1.1封装显示联系人函数 思路:判断如果当前通讯录中没有人员,就提示记录为空&#xff0c;人数大于0,显示通讯录中信息 //显示联系人 void showPerson(Addr…

SWT多线程注意事项

要在后台线程里对前台界面组件进行访问的解决办法&#xff1a;使用Display对象&#xff0c;Display对象主要负责管理事件循环和控制UI线程和其它线程之间的通信。 若要访问UI界面上的对象必须通过UI线程来访问&#xff0c;就是说在非UI线程中调用UI对象是不允许的&#xff0c;这…

C++ 通讯录设计(四)

1、删除联系人 功能描述:按照姓名进行删除指定联系人 删除联系人实现步骤: ●封装检测联系人是否存在 ●封装删除联系人函数 ●测试删除联系人功能 1.1封装检测联系人是否存在 设计思路: 删除联系人前&#xff0c;我们需要先判断用户输入的联系人是否存在&#xff0c;如果存在删…

cetos 中vsftpd从安装到配置完全教程

1 安装并启动服务 [rootedwin.org]#rpm –qa | grep vsftpd &#xff1b;查看是否安装vsftpd服务 [rootedwin.org]#yum install vsftpd &#xff1b;安装vsftpd服务 [rootedwin.org]/etc/init.d/vsftpd start ;启动服务 [rootedwin.org]#chkconfig vsftpd on ;让系统服务随着系…