c语言实现端口扫描程序

  
   向指定的ip和端口发起请求,若该ip端口出于工作状态,则能成功连接,不能则说明端口已关闭。
#include <string.h>
#include <Winsock2.h>

#define DEST_IP "127.0.0.1"

#define DEST_PORT 1434

int main()
{
    //初始化WinSock
    WORD wVersionRequested = MAKEWORD(2,2);
    WSADATA wsaData;
    if(WSAStartup(wVersionRequested,&wsaData) != 0)
    {
        printf("初始化WinSock失败!\n") ;
        return 0 ;
    }

int sockfd,n;

struct sockaddr_in dest_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);

dest_addr.sin_family = AF_INET;

dest_addr.sin_port = htons(DEST_PORT);

dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);

//bzero(&(dest_addr.sin_zero));
n=connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
if(n==-1){
  printf("端口没有开启");
}else{
  printf("端口开启");
}
}
具体的socket,connect函数及用法参考http://blog.sina.com.cn/s/blog_79b01f66010163q3.html

在C语言实现端口扫描通常使用网络套接字编程技术,特别是TCP/IP协议栈提供的函数。这里是一个简单的例子,展示如何用C语言编写一个基础的命令行端口扫描工具,用于检测目标主机上哪些端口开放: ```c #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MAX_HOSTNAME_LEN 100 #define MAX_PORT 65535 void scan_port(int sockfd, struct sockaddr_in *target) { int port = 0; for (port = 0; port <= MAX_PORT; port++) { struct sockaddr_in serv_addr; bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); serv_addr.sin_addr.s_addr = target->sin_addr.s_addr; int result = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (result == -1) { if (errno != ECONNREFUSED) { perror("Error connecting to port"); return; } printf("Port %d is open\n", port); } else { perror("Error connecting to port"); close(sockfd); return; } } } int main(int argc, char *argv[]) { if (argc < 2) { printf("Usage: %s <hostname>\n", argv[0]); return 1; } char hostname[MAX_HOSTNAME_LEN]; strncpy(hostname, argv[1], MAX_HOSTNAME_LEN); hostname[MAX_HOSTNAME_LEN - 1] = '\0'; int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { perror("Failed to create socket"); return 1; } struct sockaddr_in target; inet_pton(AF_INET, hostname, &target.sin_addr); target.sin_family = AF_INET; target.sin_port = htons(80); // Change this line to scan a different port if (connect(sock, (struct sockaddr *)&target, sizeof(target)) == 0) { printf("Host %s is up and accessible\n", hostname); scan_port(sock, &target); } else { printf("Host %s seems down or not responding on port %hu\n", hostname, ntohs(target.sin_port)); } close(sock); return 0; } ``` 这个程序创建一个socket连接到指定的IP地址,并尝试打开每个端口。如果连接成功,表示该端口开放;如果连接失败并且返回`ECONNREFUSED`错误,则认为端口封闭。 注意:实际应用中,全面扫描可能会有法律风险和潜在的安全问题,因此只应在授权的情况下并遵守相应的法规进行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值