首页 > 解决方案 > Python socket 检测在代码的不同部分打开和关闭的相同端口

问题描述

何时choice == 6socket扫描 IP 中的某个端口并打印它是否打开。

When choice == 9socket扫描特定 IP 的一系列端口并打印哪些端口是开放的,哪些不是。

但是,当扫描相同的 IP 和端口时,这两个扫描显示不同的结果:如果我在选项 9 中扫描 1 到 99 的端口,则只有端口 98 显示为关闭,其余端口是打开的,但在选项 6 中,所有端口都显示为关闭。为什么会这样?

    import socket
    import os
    import time
    #you must have figlet install in your system 
    while True : 
        print("\033[1;33;40m")
        os.system('figlet Socket') 
        time.sleep(0.1)
       
        print("1-Get ip by Host Name")
        time.sleep(0.1)
        print("2-Get port number By Name User Enter")
        time.sleep(0.1)
        print("3-GEt Name By Port Number User Enter")
        time.sleep(0.1)
        print("4-Get Host Name For Your Device")
        time.sleep(0.1)
        print("5-Get Internal Ip Address For Your Device")
        time.sleep(0.1)
        print("6-Check If Port Open Or not For Host You Enter")
        time.sleep(0.1)
        print("7-Convert Host Data To Network Short")
        time.sleep(0.1)
        print("8-convert Host Data To Network Long ")
        time.sleep(0.1)
        print("Enter Any Other Key To Exit")
        time.sleep(0.1)
        print("-----------------------------------------------")
        time.sleep(0.1)
        choice = input('Enter Your Choice : ')
        if choice == "1":
            host = input("Enter Host Name : ")
            ip = (socket.gethostbyname(host))
            print(ip)
        elif choice == "2":
            name = input("Enter The Name Of Port YOu Want To know It's Number : ")
            port = socket.getservbyname(name)
            print(port)
        elif choice == "3":
            port1 = input("Enter Port Number To Get Name Of Port : ")
            name = socket.getservbyport(int(port1))
            print(name)
        elif choice == "4":
            print("Host Name For Your Devise Is : ", socket.gethostname())
    
        elif choice == "5":
            print("Internal IP Is : ", socket.gethostbyname(socket.gethostname()))
        elif choice == "6":
            ip = input("Enter The IP : ")
            port = int(input("Enter Port To Check If it Open : "))
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ip_port = (str(ip), port)
            result = sock.connect_ex(ip_port)
            if result == 0:
                print("Port Is Closed")
            else:
                print("port Is Open")
                sock.close()
        elif choice == "7":
            short = input("Please Enter The data you want to Transfare : ")
            rshort = socket.htons(int(short))  #Host To Network Short
            print(rshort)
        elif choice == "8":
            long = input("Please Enter The data you want to Transfare : ")
            rlong = socket.htonl(int(long))  #Host To Network Short
            print(rlong)
        elif choice == "9" :
             ip=input("Enter The ip You Want To scan ")    
             rang=int(input("Enter Range You want To scan "))
             x=0
             while x<rang :
                    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                    ip_port = (str(ip), x)
                    result = sock.connect_ex(ip_port)
             if result == 0 :
                    print("port ",x,"is closed ")
                    x=x+1
             else :
                    print("Port ",x,"is opend")
                    x=x+1
            
              
        else:
            os.system('figlet GoodBye')
            time.sleep(1)
            os.system('clear')
            time.sleep(0.5)
            break

标签: pythonsockets

解决方案


来自socket的文档

socket.connect_ex(address)

...返回错误指示符 ...如果操作成功,则错误指示符为 0

但是,您的代码将返回值零视为连接失败的指标,而它实际上是成功的指标- 端口正在打开

result = sock.connect_ex(ip_port)
if result == 0: # port OPEN!
    print("Port Is Closed")
else:
    print("port Is Open")

推荐阅读