From 9f071eb5a022911e98b893751839e51353c86429 Mon Sep 17 00:00:00 2001 From: freedomlove <335946148@qq.com> Date: Sun, 21 Feb 2021 20:06:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E5=85=83=E4=BA=8C+code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CODE/chapter2/SMTPClient.py | 66 ++++++++++++++++++++++++++++++ CODE/chapter2/UDP_Pinger_Client.py | 19 +++++++++ CODE/chapter2/UDP_Pinger_Server.py | 11 +++++ CODE/chapter2/Websever.py | 62 ++++++++++++++++++++++++++++ data/chapter2/section1.tex | 7 ++++ data/chapter2/section2.tex | 6 +++ data/chapter2/section3.tex | 6 +++ data/preface.tex | 2 +- 8 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 CODE/chapter2/SMTPClient.py create mode 100644 CODE/chapter2/UDP_Pinger_Client.py create mode 100644 CODE/chapter2/UDP_Pinger_Server.py create mode 100644 CODE/chapter2/Websever.py diff --git a/CODE/chapter2/SMTPClient.py b/CODE/chapter2/SMTPClient.py new file mode 100644 index 0000000..dd332d2 --- /dev/null +++ b/CODE/chapter2/SMTPClient.py @@ -0,0 +1,66 @@ +from socket import * +from base64 import * + +mailfrom = "mail from:2@test.com\r\n" +rcptto = "rcpt to:1@test.com\r\n" +data = "data\r\n" +quitmsg = "quit\r\n" + +msg = "\r\n I love computer networks!" +endmsg = "\r\n.\r\n" +#此处使用易邮邮件服务器软件搭建了一个内网邮件服务器 +mailserver = '10.130.82.62' +mailport = 25 +connectaddress = (mailserver, mailport) +# Create socket called clientSocket and establish a TCP connection with mailserver +clientSocket = socket(AF_INET, SOCK_STREAM) +clientSocket.connect(connectaddress) + +recv = clientSocket.recv(1024) +print (recv) +if recv[:3] != '220': + print ('220 reply not received from server.') +# Send HELO command and print server response. +heloCommand = 'HELO Alice\r\n' +clientSocket.send(bytes(heloCommand.encode())) +recv1 = clientSocket.recv(1024) +print (recv1.decode()) +if recv1[:3] != '250': + print ('250 reply not received from server.') + +#print('000000000000000') +#从命令和打印服务器响应发送邮件。 +login = b'auth login\r\n' +clientSocket.send(login) +recv2 = clientSocket.recv(1024).decode('utf-8') +print ('222+',recv2) + +userCommand = b64encode('2@test.com'.encode('utf-8')) +clientSocket.send((str(userCommand,encoding='utf-8')+'\r\n').encode()) +recv3 = clientSocket.recv(1024).decode('utf-8') +print ('333+',recv3) + +password = b64encode('2'.encode('utf-8')) +clientSocket.send((str(password,encoding='utf-8')+'\r\n').encode()) +recv4 = clientSocket.recv(1024).decode('utf-8') +print ('444+',recv4) + +#print('0000000000000000') + +clientSocket.send(bytes(mailfrom.encode())) +check = clientSocket.recv(1024) +print(check) +clientSocket.send(bytes(rcptto.encode()))#将RCPT发送到命令和打印服务器响应。 +check1 = clientSocket.recv(1024) +print(check1) +clientSocket.send(bytes(data.encode()))#发送数据命令和打印服务器响应。 +check2 = clientSocket.recv(1024) +print(check2) +clientSocket.send(bytes((mailfrom+msg+endmsg).encode()))#发送消息数据。 +check3 = clientSocket.recv(1024) +print(check3) +#发送退出命令并获得服务器响应。 +clientSocket.send(bytes(quitmsg.encode())) +check4 = clientSocket.recv(1024) +print(check4) +clientSocket.close() diff --git a/CODE/chapter2/UDP_Pinger_Client.py b/CODE/chapter2/UDP_Pinger_Client.py new file mode 100644 index 0000000..db005cf --- /dev/null +++ b/CODE/chapter2/UDP_Pinger_Client.py @@ -0,0 +1,19 @@ +from socket import * +import time +serverName = 'localhost' +serverPort = 12000 +clientSocket = socket(AF_INET, SOCK_DGRAM) +clientSocket.settimeout(1) + +for i in range(0, 10): + sendTime = time.time() + message = ('Ping %d %s' % (i + 1, sendTime)).encode() + try: + clientSocket.sendto(message, (serverName, serverPort)) + modifiedMessage, serverAddress = clientSocket.recvfrom(2048) + rtt = time.time() - sendTime + print('Sequence %d: Reply from %s RTT = %.3fs' % (i + 1, serverName, rtt)) + except Exception as e: + print('Sequence %d: Request timed out' % (i + 1)) + +clientSocket.close() diff --git a/CODE/chapter2/UDP_Pinger_Server.py b/CODE/chapter2/UDP_Pinger_Server.py new file mode 100644 index 0000000..25bda49 --- /dev/null +++ b/CODE/chapter2/UDP_Pinger_Server.py @@ -0,0 +1,11 @@ +import random +from socket import * +serverSocket = socket(AF_INET, SOCK_DGRAM) +serverSocket.bind(('', 12000)) +while True: + rand = random.randint(0, 10) + message, address = serverSocket.recvfrom(1024) + message = message.upper() + if (rand < 4): + continue + serverSocket.sendto(message, address) diff --git a/CODE/chapter2/Websever.py b/CODE/chapter2/Websever.py new file mode 100644 index 0000000..1d72b0d --- /dev/null +++ b/CODE/chapter2/Websever.py @@ -0,0 +1,62 @@ +# Import socket module +from socket import * +import sys # In order to terminate the program + +# Create a TCP server socket +#(AF_INET is used for IPv4 protocols) +#(SOCK_STREAM is used for TCP) + +serverSocket = socket(AF_INET, SOCK_STREAM) + +# Assign a port number +serverPort = 80 + +# Bind the socket to server address and server port +serverSocket.bind(("", serverPort)) + +# Listen to at most 1 connection at a time +serverSocket.listen(1) + +# Server should be up and running and listening to the incoming connections + +while True: + print('The server is ready to receive') + + # Set up a new connection from the client + connectionSocket, addr = serverSocket.accept() + + # If an exception occurs during the execution of try clause + # the rest of the clause is skipped + # If the exception type matches the word after except + # the except clause is executed + try: + # Receives the request message from the client + message = connectionSocket.recv(1024).decode() + # Extract the path of the requested object from the message + # The path is the second part of HTTP header, identified by [1] + filename = message.split()[1] + # Because the extracted path of the HTTP request includes + # a character '\', we read the path from the second character + f = open(filename[1:]) + # Store the entire contenet of the requested file in a temporary buffer + outputdata = f.read() + # Send the HTTP response header line to the connection socket + connectionSocket.send("HTTP/1.1 200 OK\r\n\r\n".encode()) + + # Send the content of the requested file to the connection socket + for i in range(0, len(outputdata)): + connectionSocket.send(outputdata[i].encode()) + connectionSocket.send("\r\n".encode()) + + # Close the client connection socket + connectionSocket.close() + + except IOError: + # Send HTTP response message for file not found + connectionSocket.send("HTTP/1.1 404 Not Found\r\n\r\n".encode()) + connectionSocket.send("

404 Not Found

\r\n".encode()) + # Close the client connection socket + connectionSocket.close() + +serverSocket.close() +sys.exit()#Terminate the program after sending the corresponding data diff --git a/data/chapter2/section1.tex b/data/chapter2/section1.tex index a2cc234..5022c15 100644 --- a/data/chapter2/section1.tex +++ b/data/chapter2/section1.tex @@ -60,6 +60,13 @@ UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠 \item 服务器程序(实验步骤中已给出)。 \end{itemize} + +参考资料: + +\begin{itemize} + \item {J.F Kurose and K.W. Ross, 计算机网络自顶向下方法(第7版)} +\end{itemize} + \subsection{实验步骤} \label{subsec:c2_s1_procedure} diff --git a/data/chapter2/section2.tex b/data/chapter2/section2.tex index 6c7b08f..59801ec 100644 --- a/data/chapter2/section2.tex +++ b/data/chapter2/section2.tex @@ -47,6 +47,12 @@ Web服务器接受并解析HTTP请求,从服务器的文件系统中获取请 \item 部分代码(实验步骤中已给出)。 \end{itemize} +参考资料: + +\begin{itemize} + \item {J.F Kurose and K.W. Ross, 计算机网络自顶向下方法(第7版)} +\end{itemize} + \subsection{实验步骤} \label{subsec:c2_s2_procedure} diff --git a/data/chapter2/section3.tex b/data/chapter2/section3.tex index ecb3db5..5b53105 100644 --- a/data/chapter2/section3.tex +++ b/data/chapter2/section3.tex @@ -76,6 +76,12 @@ RFC5321给出了SMTP的定义。SMTP有众多出色的性质, \item 部分代码(实验步骤中已给出)。 \end{itemize} +参考资料: + +\begin{itemize} + \item {J.F Kurose and K.W. Ross, 计算机网络自顶向下方法(第7版)} +\end{itemize} + \subsection{实验步骤} \label{subsec:c2_s3_procedure} diff --git a/data/preface.tex b/data/preface.tex index 3a80219..f0942cc 100644 --- a/data/preface.tex +++ b/data/preface.tex @@ -22,7 +22,7 @@ \begin{itemize} \item 第一单元:谢怡、陈建发、洪劼超、雷蕴奇,厦门大学 - \item 第二单元:吴荻,国防科技大学 + \item 第二单元:吴荻、徐明、夏竟、胡罡,国防科技大学 \item 第三单元:张晓丽,昆明理工大学 \end{itemize}