Django 套接字连接超时

Django socket connection timout

我正在尝试检查某个设备 (Lauterbach PowerDebug Pro) 是否已连接到网络。我在 Django 视图中使用了以下代码。

    def checkConnection(hostname, port, timeout=5):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.settimeout(timeout)
        message = bytes.fromhex('{1024 bytes here}')
        s.sendto(message,(hostname,port))
        try:
            if s.recv(1024):
                return True
        except ConnectionResetError:
            return False
        except socket.timeout:
            return False

如果我从 Django View 运行 这个函数(通过 AJAX 调用),它将 return False.

如果我在 Python 控制台中 运行 这段代码,它将 return True。如果我 运行 manage.py shell 并手动编写此代码,它将 return True.

但是,如果我 运行 manage.py shell,导入并调用这个函数,由于超时错误,它会 return False

怎么会?我不知道为什么它不起作用。我已经使用 Wireshark 捕获了消息,它们都是一样的。下面是输出。

在 Django 中手动编写的代码 shell(returned True):

No. Time Source Destination
Protocol Length Info 233 17.202222 10.171.90.59 10.171.94.100 UDP 1066 59221 → 60010 Len=1024

Frame 233: 1066 bytes on wire (8528 bits), 1066 bytes captured (8528 bits) on interface 0 Ethernet II, Src: IntelCor_c1:d7:3e (b4:6b:fc:c1:d7:3e), Dst: All-HSRP-routers_5a (00:00:0c:07:ac:5a) Internet Protocol Version 4, Src: 10.171.90.59, Dst: 10.171.94.100 User Datagram Protocol, Src Port: 59221, Dst Port: 60010 Data (1024 bytes)

0000 03 01 01 00 62 ea 46 fd 54 52 41 43 45 33 32 00
....b.F.TRACE32. 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0370 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Data: 0301010062ea46fd54524143453332000000000000000000… [Length: 1024]

No. Time Source Destination
Protocol Length Info 234 17.220294 10.171.94.100 10.171.90.59 UDP 58 60002 → 59221 Len=16

Frame 234: 58 bytes on wire (464 bits), 58 bytes captured (464 bits) on interface 0 Ethernet II, Src: Cisco_74:52:0b (a4:6c:2a:74:52:0b), Dst: IntelCor_c1:d7:3e (b4:6b:fc:c1:d7:3e) Internet Protocol Version 4, Src: 10.171.94.100, Dst: 10.171.90.59 User Datagram Protocol, Src Port: 60002, Dst Port: 59221 Data (16 bytes)

0000 23 00 00 00 0a ab 5a 3b 54 52 41 43 45 33 32 00

.....Z;TRACE32.

Data: 230000000aab5a3b5452414345333200
[Length: 16]

在 Django shell 中导入了 checkConnection 函数和 运行(returned True):

No. Time Source Destination
Protocol Length Info 437 53.946438 10.171.90.59 10.171.94.100 UDP 1066 59224 → 60010 Len=1024

Frame 437: 1066 bytes on wire (8528 bits), 1066 bytes captured (8528 bits) on interface 0 Ethernet II, Src: IntelCor_c1:d7:3e (b4:6b:fc:c1:d7:3e), Dst: All-HSRP-routers_5a (00:00:0c:07:ac:5a) Internet Protocol Version 4, Src: 10.171.90.59, Dst: 10.171.94.100 User Datagram Protocol, Src Port: 59224, Dst Port: 60010 Data (1024 bytes)

0000 03 01 01 00 62 ea 46 fd 54 52 41 43 45 33 32 00
....b.F.TRACE32. 0010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 01f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0230 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0250 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0270 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0290 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 02f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0370 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 03f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Data: 0301010062ea46fd54524143453332000000000000000000… [Length: 1024]

No. Time Source Destination
Protocol Length Info 438 53.948831 10.171.94.100 10.171.90.59 UDP 58 60002 → 59224 Len=16

Frame 438: 58 bytes on wire (464 bits), 58 bytes captured (464 bits) on interface 0 Ethernet II, Src: Cisco_74:52:0b (a4:6c:2a:74:52:0b), Dst: IntelCor_c1:d7:3e (b4:6b:fc:c1:d7:3e) Internet Protocol Version 4, Src: 10.171.94.100, Dst: 10.171.90.59 User Datagram Protocol, Src Port: 60002, Dst Port: 59224 Data (16 bytes)

0000 23 00 00 00 0a ab 5a 3b 54 52 41 43 45 33 32 00

.....Z;TRACE32.

Data: 230000000aab5a3b5452414345333200
[Length: 16]

那么是什么给了?

编辑:它适用于 TCP 连接(例如 checkConnection('10.11.12.13', 23) 将 return 为真)。由于某些原因,只有UDP报文收不到。

在这种情况下,checkConnection 是:

    def checkConnection(hostname, port, timeout=5):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(timeout)
        try:
            s.connect((hostname, port))
            s.shutdown(socket.SHUT_WR)
            while True:
                try:
                    data = s.recv(1024)
                    if data:
                        s.close()
                        return True
        except socket.timeout:
            return False
        except TimeoutError:
            return False
        except ConnectionRefusedError:
            return False
        except ConnectionResetError:
            return False

看来诀窍是对 UDP 使用 recvfrom()

        try:
            data, address = s.recvfrom(1024)
            if data:
                return True

recv()
The recv() call is normally used only on a connected socket (see connect(2)).
It is equivalent to the call:

recvfrom(fd, buf, len, flags, NULL, 0);

我仍然不明白为什么 recv() 在所有情况下都有效,但从 Django 视图来看 运行 除外。