C语言端口扫描源码,C语言实现TCP多线程端口扫描

该博客介绍了一段C语言代码,用于实现多线程端口扫描。用户可以指定要扫描的最大端口,程序会扫描127.0.0.1或指定IP的端口,并通过连接尝试判断端口是否开放。文章还展示了如何利用time.h库的clock函数计算扫描总耗时。
摘要由CSDN通过智能技术生成

多线程端口扫描实现(C语言)

源码:

#include

#include

#include

#include

#include

#pragma comment(lib,"WS2_32.lib")

DWORD WINAPI ScanThread (LPVOID port);

int main (int argc, char* argv[])

{

WSADATA wsd;

int port = 0;

int MAX_PORT;

clock_t start, end;

HANDLE handle;

DWORD dwThreadId;

//Initialize socket lib

if (WSAStartup (MAKEWORD (2, 2), &wsd) != 0)

{

printf ("WSAStartup failed!\n");

return 1;

}

printf ("请输入要扫描的最大端口:");

scanf ("%d", &MAX_PORT);

printf("Scaning......\n");

start = clock ();

//扫描的主要代码,根据需要删减

do{

handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)ScanThread, (LPVOID)port, 0, &dwThreadId);

port++;

} while (port < MAX_PORT);

WaitForSingleObject (handle, INFINITE);//等待最后一个线程结束

end = clock ();

int duration = end - start;

printf ("总耗时 %d ms", duration);

system ("pause");

return 0;

}

DWORD WINAPI ScanThread (LPVOID port)

{

int Port = (int)(LPVOID)port;

int retval;//调用各种socket函数的返回值

SOCKET sHost;

SOCKADDR_IN servAddr;

sHost = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (INVALID_SOCKET == sHost)

{

printf ("socket failed!\n");

WSACleanup ();

return -1;

}

servAddr.sin_family = AF_INET;

servAddr.sin_addr.S_un.S_addr = inet_addr ("127.0.0.1");

//setsockopt (sHost, IPPROTO_TCP, TCP_MAXRT, (char *)&Timeout, sizeof (Timeout));//设置快速扫描

servAddr.sin_port = htons (Port);

retval = connect (sHost, (LPSOCKADDR)&servAddr, sizeof (servAddr));//lpsockaddr is 环路地址

if (retval == SOCKET_ERROR) {

printf ("端口%d关闭!\n", Port); //这里不要使用WSACleanup()函数,不然后续的线程会创建不了socket

closesocket (sHost);

return -1;

}

printf ("端口%d开放!\n", Port);

closesocket (sHost);

return 1;

}

可以在ScanThread线程函数中设置server的IP来确定要扫描的主机,运行时会提示输入扫描的最大端口。

1f4aa909a23d?utm_campaign=maleskine

提示.png

调用time.h中的clock函数来精确确定扫描的时间,在end之前调用WaitForSingleObject函数等待最后一个线程扫描结束。

1f4aa909a23d?utm_campaign=maleskine

定义start,end时钟

1f4aa909a23d?utm_campaign=maleskine

调用WaitForSingleObject

测试结果:

扫描本地:

1f4aa909a23d?utm_campaign=maleskine

本地耗时1265ms

扫描百度(123.125.115.110):

1f4aa909a23d?utm_campaign=maleskine

扫描百度耗时21262ms

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛应用于系统编程的编程语言,具备强大的功能和灵活性。在C语言中,可以使用socket编程实现TCP端口扫描器来检测目标主机上的开放端口。 TCP端口扫描器是一种网络工具,用于探测目标主机上开放的TCP端口,这些开放的端口可以用来建立网络连接。TCP端口扫描器通过尝试建立TCP连接并检查连接的结果,从而确定哪些端口是开放的。 要实现TCP端口扫描器,需要借助C语言的socket库函数。首先,我们需要创建一个socket,调用socket()函数来创建一个套接字。然后,我们可以使用connect()函数来尝试连接目标主机的端口。如果连接成功,表示该端口是开放的,如果连接失败,则表示该端口是关闭或被防火墙限制。 以下是一个简单的C语言代码示例,演示了如何实现TCP端口扫描器: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { if (argc != 3) { printf("Usage: %s <IP> <port>\n", argv[0]); return 1; } const char *ip = argv[1]; int port = atoi(argv[2]); struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(ip); address.sin_port = htons(port); int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("socket creation failed"); return 1; } if (connect(sockfd, (struct sockaddr*)&address, sizeof(address)) == 0) { printf("Port %d is open\n", port); } else { printf("Port %d is closed\n", port); } close(sockfd); return 0; } ``` 以上代码中,首先检查命令行参数,确保传入了目标主机的IP地址和要扫描的端口号。然后,通过socket()函数创建一个套接字,并使用connect()函数尝试连接指定的IP地址和端口号。最后,根据连接的结果输出相应的信息,然后关闭套接字。 需要注意的是,该代码只能检测单个端口的状态。如果需要扫描多个端口,可以使用循环将上述代码包裹起来,并逐个尝试不同的端口号。 综上所述,以上是使用C语言以socket编程实现TCP端口扫描器的简单示例。通过这种方式,我们可以方便地检测目标主机上哪些端口是开放的,有助于网络安全评估和漏洞扫描等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值