Python UDP客户端没有响应

时间:2017-11-16 10:15:23

标签: python python-2.7 udpclient

python UDP客户端:

root@kali-linux:~# python
Python 2.7.14 (default, Sep 17 2017, 18:50:44) 
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> target_host = "127.0.0.1"
>>> target_port = 80
>>> client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
>>> client.sendto("AAABBBCCC",(target_host,target_port))
9
>>> data, addr = client.recvfrom(4096)
        # to this line,no response
>>>print data   # waiting for imput

当我输入“data,addr = client.recvfrom(4096)”然后输入时,我等待十分钟没有回复。

但是当我编写TCP客户端时,它可以工作。这是代码:

root@kali-linux:~# python
Python 2.7.14 (default, Sep 17 2017, 18:55:37) 
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>import socket
>>>target_host = "www.baidu.com"
>>>target_port = 80
>>>client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>>client.connect((target_host,target_port))
>>>client.send("GET / HTTP/1.1\r\nHost: baidu.com\r\n\r\n")
35
>>>response = client.recv(4096)
>>>print response 
#output
HTTP/1.1 200 OK
Date: Thu, 16 Nov 2017 12:05:07 GMT
Content-Type: text/html
Content-Length: 14613
Last-Modified: Wed, 01 Nov 2017 03:00:00 GMT
Connection: Keep-Alive
Vary: Accept-Encoding

AND SO ON ..........

TCP客户端可以工作,UDP客户端无法工作,为什么?

我该怎么办?

1 个答案:

答案 0 :(得分:2)

UDP端口和TCP端口是不同的实体。您可以在TCP端口80上运行TCP服务器,在UDP端口80上运行完全不同的东西(例如,NTP服务器,尽管这通常在UDP端口123上运行)。

在您的第一个代码段中,您正在向UDP端口80发送UDP数据包。很可能没有任何内容正在UDP端口80上侦听,因此数据包会被静默丢弃。

您的行data, addr = client.recvfrom(4096)正在等待某人(不一定是您发送请求的服务器)向您发送另一个UDP数据包。由于通常没有任何内容在UDP端口80上进行侦听,因此revcfrom调用将永远等待。它工作正常。这是预料之中的。

你可以做些什么来收到一些东西: 1.将您的UDP片段的套接字bind()到端口2222(或任何空闲端口),然后运行它。它将再次等待。 2.使用`target_port = 2222'运行第二个实例(在不同的shell中)。现在,您应该在第一个实例上收到内容为“AAABBBCCC”的UDP数据包。

在您的第二个代码段中,您使用的是TCP,并且您正在联系响应的TCP端口80(而不是UDP端口80)上的Web服务器。正如您所见,这可以正常工作,但仅限于TCP端口80上运行的某些内容。