【问题标题】:Invalid port in python socketspython套接字中的端口无效
【发布时间】:2015-08-05 11:40:42
【问题描述】:

尝试使用以下 sn-p 发送裸 ICMP 消息时出错:

Windows 说此端口对于给定的 IP 范围无效。

def send_ping(source_ip,target_ip,data_function=construct_icmp_echo):
    fail = 0
    skt_send = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
    skt_recv = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP)
    (src_binary,) = struct.unpack (">L",socket.inet_aton(source_ip))
    (tgt_binary,) = struct.unpack (">L",socket.inet_aton(source_ip))

    skt_send.setsockopt(socket.SOL_IP, socket.IP_TTL, 16)
    ipheader = struct.pack("BBHHHBBHLL",0x54,0xdc,48,50,8,16,1,0,src_binary,tgt_binary)
    cksum = icmpcksum(ipheader)
    ipheader = ipheader = struct.pack("BBHHHBBHLL",0x54,0xdc,48,50,8,16,1,cksum,src_binary,tgt_binary)
    skt_send.sendto(data_function(),(target_ip,22433))
    skt_recv.bind((target_ip,22433))
    skt_recv.settimeout(5)
    thetime = datetime.datetime.now()
    try: 
        s = datetime.datetime.now()
        while time.time - s < 60:
            a = skt_recv.recvfrom(1024)[0]
            hdr_reply = a[20:]
            icmp_type = a[20]
            if icmp_type == 0 :
                print ("got a ping")
                fl = True
                return target_ip
            if fl: break
    except socket.timeout as e:
        raise e
    return

这里: skt.recv_bind((target_ip,22433)) 我输入的 IP 地址是 B 类和 C 类 IP 地址。

我得到了这个回溯:

File "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.2\visualstudio_py_launcher.py", li
ne 78, in <module>
    vspd.debug(filename, port_num, debug_id, debug_options, run_as)
  File "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.2\visualstudio_py_debugger.py", li
ne 2465, in debug
    exec_file(file, globals_obj)
  File "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.2\visualstudio_py_util.py", line 1
11, in exec_file
    exec_code(code, file, global_variables)
  File "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensio
ns\Microsoft\Python Tools for Visual Studio\2.2\visualstudio_py_util.py", line 8
7, in exec_code
    exec(code_obj, global_variables)
  File "C:\Users\user\Documents\Visual Studio 2015\Projects\python-ipscan\python
-ipscan\python_ipscan.py", line 86, in <module>
    if __name__=="__main__": main ()
  File "C:\Users\user\Documents\Visual Studio 2015\Projects\python-ipscan\python
-ipscan\python_ipscan.py", line 83, in main
    send_ping (myaddr,"""155.223.197.1""",construct_icmp_echo)
  File "C:\Users\user\Documents\Visual Studio 2015\Projects\python-ipscan\python
-ipscan\python_ipscan.py", line 70, in send_ping
    traceback.print_stack()
Traceback (most recent call last):
  File "C:\Users\user\Documents\Visual Studio 2015\Projects\python-ipscan\python
-ipscan\python_ipscan.py", line 86, in <module>
    if __name__=="__main__": main ()
  File "C:\Users\user\Documents\Visual Studio 2015\Projects\python-ipscan\python
-ipscan\python_ipscan.py", line 84, in main
    traceback.extract_tb(sys.exc_info())
  File "C:\Program Files\Python34\lib\traceback.py", line 106, in extract_tb
    return list(_extract_tb_iter(tb, limit=limit))
  File "C:\Program Files\Python34\lib\traceback.py", line 59, in _extract_tb_or_
stack_iter
    f, lineno, next_item = extractor(curr)
AttributeError: 'tuple' object has no attribute 'tb_frame'

用户代码未处理时的异常: OSError was unhandled by user code Message: [WinError 10049] Invalid request for given address

【问题讨论】:

    标签: python windows sockets icmp


    【解决方案1】:

    您正在尝试在接收套接字绑定端口之前发送到端口 22433。因此,skt_send.sendto() 调用试图发送到一个不存在的端点 - 在该调用时,端口 22433 上没有任何监听。尝试将 skt_recv.bind() 调用放在它之前。

    查看解释器给出的回溯会很有帮助,因为只有对错误的模糊描述,我们必须猜测出了什么问题。

    【讨论】:

    • 没有帮助。添加了回溯。
    • 看起来您是在手动调用回溯,而不是让异常发生。当前报告的错误似乎与网络无关,而是由于不正确的回溯调用。这当然不是您报告的有关无效端口号的错误。程序没有产生异常回溯吗?
    • 我没有意识到手动调用时产生不同的回溯会很重要。
    • 对不起,我没有说清楚。在我看来,通过阅读您发布的回溯(谢谢,顺便说一句),您已经对您的程序进行了编辑,以便它正在调用traceback.print_stack()。当我询问回溯时,我假设(因为您说“Windows 说此端口对于给定的 IP 范围无效”)您的程序正在生成 Python 异常回溯。
    • 您看到的确切信息是什么?它是出现在终端窗口中还是作为 Windows 警报出现?
    猜你喜欢
    • 2017-12-19
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2017-07-24
    • 2011-07-28
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多