我正在编辑端口扫描程序,我正在编辑使用线程.这是原始代码的基础知识:
for i in range(0, 2000):
s = socket(AF_INET, SOCK_STREAM)
result = s.connect_ex((TargetIP, i))
if(result == 0) :
c = "Port %d: OPEN\n" % (i,)
s.close()
Run Code Online (Sandbox Code Playgroud)
这大约需要33分钟才能完成.所以我想我会把它设置为让它运行得更快一点.这是我的第一个线程项目,所以它不是太极端,但我运行了以下代码大约一个小时,没有例外但没有输出.我只是做错误的线程或什么?
import threading
from socket import *
import time
a = 0
b = 0
c = ""
d = ""
def ScanLow():
global a
global c
for i in range(0, 1000):
s = socket(AF_INET, SOCK_STREAM)
result = s.connect_ex((TargetIP, i))
if(result == 0) :
c = "Port %d: OPEN\n" % (i,)
s.close()
a += …
Run Code Online (Sandbox Code Playgroud) 我对我在下面设置的盒子进行了基本的 nmap 扫描,这是输出。
$ nmap xxx.xx.org
Starting Nmap 7.40SVN ( https://nmap.org ) at 2017-05-17 13:25 GMT
Nmap scan report for xxx.xx.xx (xx.xx.5.180)
Host is up (0.00069s latency).
rDNS record for xx.xx.5.180: www.xxx.org
Not shown: 988 filtered ports
PORT STATE SERVICE
20/tcp closed ftp-data
21/tcp open ftp
53/tcp open domain
80/tcp open http
110/tcp open pop3
143/tcp open imap
443/tcp open https
993/tcp open imaps
995/tcp open pop3s
1123/tcp open murray
2030/tcp open device2
10000/tcp open snet-sensor-mgmt
Nmap done: 1 IP …
Run Code Online (Sandbox Code Playgroud) 在程序(Java)中,我需要检查并行端口中的特定引脚.每当该引脚从逻辑0变为1(正边沿时钟)时,我必须读取端口上的数据并保存它.这种情况大约每10毫秒发生一次,但可能会有所不同.
为了做到这一点,我用一个不断检查端口的while循环创建了一个单独的线程,但这使得处理器变得疯狂,我知道这是因为while循环.我的问题是,如何在不使用处理器密集的while循环的情况下不断扫描端口?该程序并不准确知道何时发生引脚更改,只是它发生在每10ms左右.
我正在编写一个端口扫描器,目的是循环遍历整个子网,以查看端口 445 是否在任何主机上打开,作为学习 C 编程的一种方式。该程序当前的设置方式是,需要手动输入一个 IP 地址,然后扫描仪就会启动。它工作完美(终于)。
我当前面临的问题:我不确定如何使该程序扫描整个子网,而不仅仅是单个主机。研究完这个问题后,我相信最好的方法是去掉 IP 地址的最后一个八位字节,并让它从 1-254 循环。然而,我并不完全确定如何开始解决这个问题。这是我当前的代码(为了澄清而大量注释):
...
void portScan() {
struct hostent *host;
int err, i , sock ,start , end;
char hostname[100];
struct sockaddr_in sa;
//Get the hostname to scan
printf("Enter hostname or IP to scan: ");
gets(hostname);
//Get start port number
start = 445;
//Get end port number
end = 445;
//Initialise the sockaddr_in structure
strncpy((char*)&sa , "" , sizeof sa);
sa.sin_family = AF_INET;
//direct ip address, use it
if(isdigit(hostname[0])) {
sa.sin_addr.s_addr …
Run Code Online (Sandbox Code Playgroud) 下面的代码是我用来创建端口扫描程序的,但是,当我点击"扫描"它执行但gui冻结直到它完成扫描,是否有任何可能的方法允许它在扫描时执行其他操作?
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class PortScannerGUI extends JFrame implements ActionListener
{
JPanel Panel = new JPanel(null);
JTextField Field = new JTextField();
JButton Button = new JButton();
JTextArea Area = new JTextArea();
JButton limit = new JButton("limit");
public PortScannerGUI()
{
super();
setSize(350, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
LoadUI();
}
public void LoadUI()
{
Area.setBounds(20, 50, 310, 310);
Area.setBorder(BorderFactory.createLineBorder(Color.BLUE));
Area.setEditable(false);
Field.setBounds(20, 10, 200, 35);
Button.setBounds(230, 10,100, 35);
Button.setText("Scan");
Button.addActionListener(this);
Panel.add(Field);
Panel.add(Area); …
Run Code Online (Sandbox Code Playgroud) 我有一个TCP端口扫描程序,它扫描给定IP上的所有开放端口,并仅返回打开的端口和符号上的服务名称.为此,我创建一个套接字,将其设置为非阻塞模式,并select()
在端口上如果超时则表示端口已关闭,否则打开.问题是我的select()总是超时,即使我尝试扫描开放端口.我希望有人指出我的错误,我的逻辑是不是很糟糕?
#include <stdlib.h>
#include <iostream>
#include <cstdio>
#include <string.h>
#include <netdb.h>
#include <fcntl.h>
#include <assert.h>
#include <sys/time.h>
#include <errno.h>
using namespace std;
fd_set working_set;
hostent *he;
char* protoc [2] = { "tcp","udpn" };
int port;
struct sockaddr_in servaddr;
int sendfd;
servent *srvport;
void set_nonblock(int socket) {
int flags;
flags = fcntl(socket,F_GETFL,0);
assert(flags != -1);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
}
void set_block(int socket) {
int flags;
flags = fcntl(socket,F_GETFL,0);
assert(flags != -1);
fcntl(socket, F_SETFL, flags | ~O_NONBLOCK);
} …
Run Code Online (Sandbox Code Playgroud)