C++扫描指定主机开放的端口

转自王柏元的博客C++扫描指定主机开放的端口,代码可到原网站下载

C++扫描指定主机开放的端口,OS提供了connect()系统调用,用于与远程主机某端口建立连接,如果远程主机该端口处于帧听状态,则connect()连接成功;否则说明该端口关闭。

// ScanPorts.cpp : 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
#include<iostream>
using namespace std ;
#include<WinSock2.h>
#pragma comment (lib,"ws2_32.lib")
#define STATUS_FALIED 0xFFFF
unsigned long serverIP ;
long MaxThread = 200 ;
long ThreadCount = 0 ;
long * aa = & ThreadCount ;
 
//扫描端口的线程
DWORD WINAPI ScanPort ( LPVOID lpParam ) {
     short Port = * ( short * ) lpParam ;
     InterlockedIncrement ( aa ) ;
     //创建流式套接字
     SOCKET sock = socket ( AF_INET , SOCK_STREAM , 0 ) ;
     if ( sock == INVALID_SOCKET ) {
         cout << "创建套接字失败!" << endl ;
         return 0 ;
 
     }
     else {
         //填充服务器地址
         sockaddr_in severAddr ;
         severAddr . sin_family = AF_INET ;
         severAddr . sin_port = htons ( Port ) ;
         severAddr . sin_addr . S_un . S_addr = serverIP ;
         //判断此机器是否打开
         connect ( sock , ( sockaddr* ) & severAddr , sizeof ( severAddr ) ) ;
         struct fd_set write ;
         FD_ZERO ( & write ) ;
         FD_SET ( sock , & write ) ;
         //初始化超时时间
         struct timeval timeout ;
         timeout . tv_sec = 100 / 1000 ;
         timeout . tv_usec = 0 ;
         if ( select ( 0 , NULL , & write , NULL , & timeout ) > 0 )
         {
             cout << Port << "," ;
         } ;
         closesocket ( sock ) ;
 
 
     }
 
     InterlockedDecrement ( aa ) ;
     return 0 ;
}
 
void main ( int argc , char * argv [ ] )
{
     if ( argc != 2 ) {
         cout << "请输入目的主机IP地址" << endl ;
    
     }
     //建立与socket库的绑定
     WSADATA WSAData ;
     if ( WSAStartup ( MAKEWORD ( 2 , 2 ) , & WSAData ) != 0 )
     {
         cout << "WSAStartup falied!" << GetLastError ( ) << endl ;
         ExitProcess ( STATUS_FALIED ) ;
     }
     serverIP = inet_addr ( argv [ 1 ] ) ;
     cout << "下列端口已开放:" << endl ;
     for ( int i = 1 ; i < 1024 ; i ++ ) {
         //超过最大允许线程数等待
         while ( ThreadCount >= MaxThread )
             Sleep ( 10 ) ;
         //创建线程,扫描端口
     DWORD ThreadID ;
     CreateThread ( NULL , 0 , ScanPort , ( LPVOID ) new short ( i ) , 0 , & ThreadID ) ;
     }
     //还有没有结束的线程,等待
     while ( ThreadCount > 0 )
         Sleep ( 50 ) ;
 
     WSACleanup ( ) ;
 
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值