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客户端无法工作,为什么?
我该怎么办?
答案 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上运行的某些内容。