题目很长,因为CSDN的文章标题最多100字,所以我就缩减了。题目的意思是指定使用socket.getservbyname()确定使用UDP协议的daytime服务的端口号,然后给服务器发消息,显示服务器回复的消息。
找了一圈,没有在网络上找到提供daytime服务,且为udp协议的服务器,无奈,只能自己写一个udp的服务器咯。
这里首先要说明一下这个socket.getservbyname()函数是个什么东西,在源码里,这个函数是这么写的:
def getservbyname(servicename, protocolname=None): # real signature unknown; restored from __doc__
"""
getservbyname(servicename[, protocolname]) -> integer
Return a port number from a service name and protocol name.
The optional protocol name, if given, should be 'tcp' or 'udp',
otherwise any protocol will match.
"""
return 0
前面这个servicename就是服务的名字,能写的没几个,比如ftp、http、daytime,这里不能天马行空自己写,只能写英特网上存在的服务。后面那个protocolname只能写’tcp‘或者’udp’,没有第三个值。
所以,在这道题目的要求下,只能写port = socket.getservbyname(‘daytime’,‘udp’),这个port的值必定等于13. 百度了一下13端口,就是固定的提供daytime服务的端口,就像21端口是提供ftp服务,80端口是提供http服务一样。
由于没有找到网络上已知的提供daytime服务的UDP服务器,所以就在本地写了一个提供daytime服务的UDP服务器,代码如下:
from socket import *
import time
HOST = ''
PORT = 13 #这里的端口号必须是13
BUFFSIZE = 1024
ADDR = (HOST, PORT)
with socket(AF_INET, SOCK_DGRAM) as udpServerSocket:
udpServerSocket.bind(ADDR)
while True:
data, addr = udpServerSocket.recvfrom(BUFFSIZE)
udpServerSocket.sendto(time.ctime().encode('utf-8'), addr)
再自己写了一个客户端,代码如下:
from socket import *
HOST = '127.0.0.1'
BUFFSIZE = 1024
with socket(AF_INET, SOCK_DGRAM) as udpClientSocket:
PORT = getservbyname('daytime', 'udp')
udpClientSocket.sendto('data'.encode('utf-8'), (HOST, PORT))
data, ADDR = udpClientSocket.recvfrom(BUFFSIZE)
print(data.decode('utf-8'))