一 .getpeername和getsoketopt的用法 服务器端代码 import socket sk =socket.socket() sk.bind(('127.0.0.1',9000)) sk.listen() conn,addr =sk.accept() conn.send(b'gdadfadsd') print('getpeername:\n',conn.getpeername()) #连接到当前套接字的远端地址. print('getsocketop:\n',sk.getsock…
前情提要 一:验证客户端的合法性: # .需要认证 # 程序和用户打交道的时候才会用到用户认证 # 对所有的客户端进行统一的认证 # # 我现在要做的事情 # 写一个server端 # 写一个client端 特殊的 符合我的server端要求的代码 # .client端不会被其他机器获取到 # .即使客户端的代码不在别人手上 有心人仍然可以非法的访问我们的程序 # hashlib # 密钥 # 随机的字符串 # server 密钥 发送一个随机字符串,密钥为盐,对随机字符串进行摘要 得到一个字符…
一.为了防止客户端被人非法利用,需要在使用之前对客户端进行合法性验证.接下来就是客户端验证的几种方法 hmac  加密方法 import socket import os import hmac #能转化成密文模块 secret_key=b'apple' #密钥,必须是bytes类型 sk=socket.socket() sk.bind(('127.0.0.1',8008)) sk.listen() def check_con(con): #定义一个验证函数 msg=os.urandom(32)…
hmac模块: 比较两个函数的密钥是否一致: import hmac import os msg = os.urandom(32) #生成32位随机字节码 def wdc(): key = b'wdc' #密钥 ret = hmac.new(key,msg) #将字节码和key进行加密(必须都为bytes类型)创建一个对象ret digest = ret.digest() #消化 return digest #返回消耗后的密文 def yhf(): key1 = b'wdc' #密钥 ret1…
服务器端程序 import os import hmac import socket def auth(conn): secret_key = b'rock' rand_b = os.urandom(32) conn.send(rand_b) obj = hmac.new(secret_key, rand_b) res1 = obj.digest() res2 = conn.recv(1024) cmp_res = hmac.compare_digest(res1, res2) return c…
目的:对连接服务器的客户端进行判断 # Server import socket import hmac import os secret_key = bytes('tom', encoding='utf-8') sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.listen() connect, addr = sk.accept() def check_client(conn): """ 使用hmac模块进行加密 ne…
一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系列应为AF_INET(默认值ipv4),AF_INET6(ipv6),AF_UNIX,AF_CAN或AF_RDS. (AF_UNIX 域实际上是使用本地 socket 文件来通信) type 套接字类型应为SOCK_STREAM(默认值,tcp协议),SOCK_DGRAM(udp协议),SOCK_R…
 先来回顾一下昨天的内容 黏包现象粘包现象的成因 : tcp协议的特点 面向流的 为了保证可靠传输 所以有很多优化的机制 无边界 所有在连接建立的基础上传递的数据之间没有界限 收发消息很有可能不完全相等 缓存机制,导致没发过去的消息会在发送端缓存 没接收完的消息会在接收端缓存解决: 给应用层定制协议解决方案一:只发送一条信息 先发送一个定长表示待发送数据长度的bytes 先接收一个固定长度 再发送要发送的数据 再按照长度接收数据 解决方案二 :发送的多条信息 先发送一个定长表示待发送字典长度的b…
验证客户端链接的合法性 分布式系统中实现一个简单的客户端链接认证功能 #_*_coding:utf-8_*_ from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_auth(conn): ''' 认证客户端链接 :param conn: :return: ''' print('开始验证新链接的合法性') msg=os.urandom(32) conn.sendall(msg) h=…
补充: send()与sendall() 在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下: socket.send(string[, flags])  发送TCP数据,返回发送的字节大小.这个字节长度可能少于实际要发送的数据的长度.换句话说,这个函数执行一次,并不一定能发送完给定的数据,可能需要重复多次才能发送完成. data = "something you want to send" while True: len = s.s…