一、昨日内容回顾
1.arp协议含义
2.子网,子网掩码
3.两台电脑在网络中怎么通信的?
4.tcp和udp socket编码
5.tcp和udp协议的区别
6.tcp三次握手和四次挥手,syn洪攻击,大量time-wait状态等
二、今日内容
1、认识下socket中的一些常见方法
服务器套接字函数
s.bind()
s.listen(n) # 至少可以同时连接2个,至多n个
s.accept()
客户端套接字函数
s.connect()
s.connect_ex()
公共用途的套接字函数
s.send()
s.recv()
s.sendall()
s.sendto()
s.recvfrom()
s.getpeername()
s.gethostname()
s.setsockopt()
s.getsockopt()
s.close()
面向锁的套接字方法
s.setblocking()
s.settimeout()
s.gettimeout()
面向文件的套接字函数
s.fileno()
s.makefile()
send()和sendall()区别:
2、对网络编程中的安全做一个了解
1.客户端合法性验证,基于socket实现(面向函数编程)
import os import hashlib from socket import * import struct sk = socket(AF_INET, SOCK_STREAM) sk.bind(('127.0.0.1', 8080)) sk.listen(5) conn,addr = sk.accept() def md5_check(conn_tmp): salt = b'love' bytes_str = os.urandom(32) conn_tmp.send(bytes_str) my_obj = hashlib.md5(salt) my_obj.update(bytes_str) return my_obj.hexdigest().encode('utf-8') def communication(conn_tmp): while 1: msg_s = input('>>>').encode('utf-8') msg_s_len = len(msg_s) head = struct.pack('i', msg_s_len) conn_tmp.send(head+msg_s) head = conn_tmp.recv(4) msg_r_len = struct.unpack('i',head)[0] msg_r = conn_tmp.recv(msg_r_len).decode('utf-8') print(msg_r) server_md5 = md5_check(conn) if conn.recv(32) == server_md5: print('客户端合法性验证成功!') communication(conn) else: print('验证失败!')
import hashlib from socket import * import struct sk = socket(AF_INET, SOCK_STREAM) sk.connect_ex(('127.0.0.1', 8080)) def md5_check(conn_tmp): salt = b'love' bytes_str = conn_tmp.recv(32) my_obj = hashlib.md5(salt) my_obj.update(bytes_str) return my_obj.hexdigest().encode('utf-8') def communication(conn_tmp): while 1: head = conn_tmp.recv(4) msg_r_len = struct.unpack('i',head)[0] msg_r = conn_tmp.recv(msg_r_len).decode('utf-8') print(msg_r) msg_s = input('>>>').encode('utf-8') msg_s_len = len(msg_s) head = struct.pack('i', msg_s_len) conn_tmp.send(head+msg_s) sk.send(md5_check(sk)) communication(sk)
2.客户端合法性验证,基于socketserver实现
import socket import struct import json sk = socket.socket() sk.connect_ex(('127.0.0.1', 8080)) username = input('username>>>').strip() password = input('password>>>').strip() dic = {'username': username, 'password': password} bytes_dic_json = json.dumps(dic).encode('utf-8') dic_json_len = len(bytes_dic_json) bytes_head = struct.pack('i', dic_json_len) sk.send(bytes_head+bytes_dic_json) print(sk.recv(1024).decode('utf-8')) sk.close()
import socketserver import struct import hashlib import json class MyServer(socketserver.BaseRequestHandler): def handle(self): head = self.request.recv(4) dic_json_len = struct.unpack('i', head)[0] dic_json = self.request.recv(dic_json_len) dic = json.loads(dic_json.decode('utf-8')) md5_obj = hashlib.md5(dic['username'].encode('utf-8')) md5_obj.update(dic['password'].encode('utf-8')) password = md5_obj.hexdigest() with open('userinfo',encoding='utf-8') as f: for line in f: name, passwd = line.strip().split(":") if name.strip() == dic['username'] and passwd.strip() == password: print('连接成功!') self.request.send('恭喜您认证登录成功!'.encode('utf-8')) break else: print('连接失败!') sk = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer) sk.serve_forever()
3、socketserver模块(这个模块封装的是并发中的技术)
4、小常识,浏览器中如何在一段时间内记录了你的登录验证?
5、ftp作业
实现中。。。
三、扩展
1.math模块,decimal模块简要了解
内置函数round(2.345,2) # 四舍五入取选定小数位
math.floor() # 向下取整
math.ceil() # 向上取整
decimal.getcontext(),获取设置
#Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
# 默认prec28位精度,rounding=ROUND_HALF_EVEN,左侧为奇数ROUND_UP,偶数(even)ROUND_DOWN
decimal.Decimal(1)/decimal.Decimal(3)
2.print函数输出字符左右对齐问题。
print('ss'.center(20,'*')) print('%06.2f' % 1.2222) print('%6.2f' % 1.2222) # 右对齐,总计小数点和小数点左右数字加一起5个字符英文,不足左边补空 print('%5d' % 6) # 右对齐,总计5个字符英文,不足左边补空 print('%05d' % 6) # 右对齐,总计5个字符英文,不足左边补零 print('%10s' % 'GG') # 右对齐,总计10个字符英文 print('%-10s' % 'G') # 左对齐,总计10个字符英文 print('%10s' % '中国') """ *********ss********* 001.22 1.22 6 00006 GG G 中国 """